什么是Docker
Docker官方:
An open source project to package, ship and run any application as lightweight container.一個開源的可以滿足任何應用程序以一種輕量級的容器進行打包、發(fā)布、運行的項目.
Node.js給Docker的定義:
Allow to package an application with all of its dependencies into a standardized unit.允許將應用和其所有依賴以一種標準的單元進行打包.
簡單類比:
一個輕量級的虛擬機.
Docker和虛擬機的區(qū)別是:虛擬機通過Hypervisor層
在宿主上虛擬出來計算機的硬件(CPU拥褂、內存遮晚、網(wǎng)卡等),然后在上面運行完整的操作系統(tǒng),在操作系統(tǒng)上在運行相關的中間件依賴和Application.而Docker就要輕量級的多,直接在宿主的上通過Docker Engine層
直接就可以運行依賴和Application本身.
Docker架構
如圖,介紹架構中的概念:
- DOCKER_HOST:宿主機器,也就是我們的服務器、臺式機或者筆記本的系統(tǒng).
- Docker daemon:守護進程,也就是Docker的主進程.提供給客戶端進行命令執(zhí)行,然后與鏡像曾掂、容器和鏡像倉庫進行交互.
- Client:客戶端,也就是我們的命令行工具,執(zhí)行容器的相關命令.
- Images:鏡像,我們可以把鏡像比喻為未啟動的程序的源代碼,所以鏡像的體積并不大,只會占用少量的磁盤空間.
- Containers:容器,容器就好比是源代碼執(zhí)行后產(chǎn)生的實體類,也就是運行中的程序,同一個鏡像可以產(chǎn)生多個容器,就好比是一個實體類被實例話了多次.當然每個產(chǎn)生的容器可以根據(jù)啟動時的配置不同而不同,比如端口、數(shù)據(jù)庫連接等.多個同一鏡像產(chǎn)生的容器可能會存在相關的共享只讀資源,這樣可以減少很大的內存開銷,就類似于程序代碼中的靜態(tài)類可以被每個實例使用.
- Registry: 鏡像倉庫,我們Docker本山是沒有任何鏡像的,可通過客戶端執(zhí)行命令在鏡像倉庫中查找我們需要的鏡像,比如mysql數(shù)據(jù)庫、nginx等,然后將倉庫中的鏡像pull到本地的Docker中,同樣我們也可以將我們制作的鏡像發(fā)不到遠程倉庫供我們以后使用或者分享給他人使用.
Docker基礎命令
Dockerfile(鏡像定義配置)
Dockerfile 是一個包含創(chuàng)建鏡像所有命令的文本文件委煤,通過docker build命令可以根據(jù) Dockerfile 的內容構建鏡像.基本命令如下:
- FROM
- MAINTAINER
- RUN
- CMD
- EXPOSE
- ENV
- ADD
- COPY
- ENTRYPOINT
- VOLUME
- USER
- WORKDIR
- ONBUILD
Volume(數(shù)據(jù)持久化卷宗配置)
提供獨立于容器之外的持久化存儲,在容器中的相關修改和操作是不會被存儲的,當容器銷毀之后所有的數(shù)據(jù)不會被保存.
Docker的鏡像是由一系列的只讀層組合而來,當啟動一個容器的時候修档,Docker加載鏡像的所有只讀層碧绞,并在最上層加入一個讀寫層。這個設計使得Docker可以提高鏡像構建吱窝、存儲和分發(fā)的效率讥邻,節(jié)省了時間和存儲空間,然而也存在如下問題院峡。
容器中的文件在宿主機上存在形式復雜兴使,不能在宿主機上很方便的對容器中的文件進行訪問
多個容器之間的數(shù)據(jù)無法共享
-
當刪除容器時,容器產(chǎn)生的數(shù)據(jù)將丟失
為了解決這些問題撕予,Docker引入了數(shù)據(jù)卷(volume)機制鲫惶。volume是存在一個或多個容器中的特定文件或文件夾,這個目錄能夠獨立于聯(lián)合文件系統(tǒng)的形式在宿主機中存在实抡,并為數(shù)據(jù)的共享與持久提供一下便利欠母。
volume在容器創(chuàng)建時就初始化,在容器運行時就可以使用其中的文件
volume能在不同的容器之間共享和重用
對volume中的數(shù)據(jù)的操作會馬上生效
對volume中數(shù)據(jù)操作不會影響到鏡像本身
volume的生存周期獨立于容器的生存周期吆寨,即使刪除容器赏淌,volume仍然會存在,沒有任何容器使用的volume也不會被Docker刪除
Docker Compose(運行時容器啟動配置)
假設我們有一個比較復雜的應用程序,在Docker中運行,會需要用到mysql啄清、Redis六水、nginx等等多個容器,而且每個容器之間又存在訪問交互,這個時候就需要一個配置將他們運行時連接起來.
Docker Compose是一個用來定義和運行復雜應用的Docker工具。一個使用Docker容器的應用,通常由多個容器組成掷贾。使用Docker Compose不再需要使用shell腳本來啟動容器睛榄。
Compose 通過一個配置文件來管理多個Docker容器,在配置文件中想帅,所有的容器通過services來定義场靴,然后使用docker-compose腳本來啟動,停止和重啟應用港准,和應用中的服務以及所有依賴服務的容器旨剥,非常適合組合使用多個容器進行開發(fā)的場景。
為什么要使用 Docker浅缸?
Docker 跟傳統(tǒng)的虛擬化方式相比具有以下優(yōu)勢:
更高效的利用系統(tǒng)資源
由于容器不需要進行硬件虛擬以及運行完整操作系統(tǒng)等額外開銷轨帜,Docker 對系統(tǒng)資源的利用率更高。無論是應用執(zhí)行速度衩椒、內存損耗或者文件存儲速度蚌父,都要比傳統(tǒng)虛擬機技術更高效。因此烟具,相比虛擬機技術梢什,一個相同配置的主機,往往可以運行更多數(shù)量的應用朝聋。
更快速的啟動時間
傳統(tǒng)的虛擬機技術啟動應用服務往往需要數(shù)分鐘嗡午,而 Docker 容器應用,由于直接運行于宿主內核冀痕,無需啟動完整的操作系統(tǒng)荔睹,因此可以做到秒級、甚至毫秒級的啟動時間言蛇。大大的節(jié)約了開發(fā)僻他、測試、部署的時間腊尚。
一致的運行環(huán)境
開發(fā)過程中一個常見的問題是環(huán)境一致性問題吨拗。由于開發(fā)環(huán)境、測試環(huán)境婿斥、生產(chǎn)環(huán)境不一致劝篷,導致有些 bug 并未在開發(fā)過程中被發(fā)現(xiàn)。而 Docker 的鏡像提供了除內核外完整的運行時環(huán)境民宿,確保了應用運行環(huán)境一致性娇妓,從而不會再出現(xiàn) “這段代碼在我機器上沒問題啊” 這類問題。
持續(xù)交付和部署
對開發(fā)和運維人員來說活鹰,最希望的就是一次創(chuàng)建或配置哈恰,可以在任意地方正常運行只估。
使用 Docker 可以通過定制應用鏡像來實現(xiàn)持續(xù)集成、持續(xù)交付着绷、部署蛔钙。開發(fā)人員可以通過 Dockerfile 來進行鏡像構建,并結合 持續(xù)集成系統(tǒng)進行集成測試蓬戚,而運維人員則可以直接在生產(chǎn)環(huán)境中快速部署該鏡像夸楣,甚至結合持續(xù)部署系統(tǒng)進行自動部署宾抓。
而且使用 Dockerfile 使鏡像構建透明化子漩,不僅僅開發(fā)團隊可以理解應用運行環(huán)境,也方便運維團隊理解應用運行所需條件石洗,幫助更好的生產(chǎn)環(huán)境中部署該鏡像幢泼。
更輕松的遷移
由于 Docker 確保了執(zhí)行環(huán)境的一致性,使得應用的遷移更加容易讲衫。Docker 可以在很多平臺上運行缕棵,無論是物理機、虛擬機涉兽、公有云招驴、私有云,甚至是筆記本枷畏,其運行結果是一致的别厘。因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上拥诡,而不用擔心運行環(huán)境的變化導致應用無法正常運行的情況触趴。
更輕松的維護和擴展
Docker 使用的分層存儲以及鏡像的技術,使得應用重復部分的復用更為容易渴肉,也使得應用的維護更新更加簡單冗懦,基于基礎鏡像進一步擴展鏡像也變得非常簡單。此外仇祭,Docker 團隊同各個開源項目團隊一起維護了一大批高質量的官方鏡像披蕉,既可以直接在生產(chǎn)環(huán)境使用,又可以作為基礎進一步定制乌奇,大大的降低了應用服務的鏡像制作成本没讲。
對比傳統(tǒng)虛擬機總結