Docker是一個用於開發,交付和運行應用程序的開放平臺。 Docker使您可以將應用程序與基礎設施分開,從而能夠快速交付軟件。 藉助Docker,您能夠以管理應用程序相同的方式來管理基礎設施。 經過利用Docker的方法來快速交付,測試和部署代碼,您能夠大大減小編寫代碼和在生產環境中運行代碼之間的延遲。golang
Docker平臺
Docker提供了在鬆散隔離的環境(稱爲容器)中打包和運行應用程序的功能。隔離和安全性使您能夠在給定主機上同時運行多個容器。容器很輕,由於它們不須要加載額外的管理程序,而是直接在主機的內核中運行。這意味着與使用虛擬機相比,能夠在給定的硬件組合上運行更多的容器。您甚至能夠在其實是虛擬機的主機中運行Docker容器!docker
Docker提供了工具和平臺來管理容器的生命週期:ubuntu
- 使用容器開發應用程序及其支持組件。
- 容器成爲分發和測試應用程序的單元。
- 準備就緒後,能夠將應用程序做爲容器或精心安排的服務部署到生產環境。不管您的生產環境是本地數據中心、雲提供商仍是二者的混合,都是同樣的。
Docker引擎
Docker引擎是客戶端-服務器應用程序,具備如下主要組件:安全
- 服務器是一種長期運行的程序,稱爲後臺程序(dockerd命令)。
- REST API,它指定了一些接口,程序能夠用來與後臺程序進行通訊並指示其操做。
- 客戶端命令行接口(CLI)(docker命令)。
CLI使用Docker REST API控制Docker後臺程序或與Docker後臺程序進行交互,經過腳本或直接經過CLI命令。 許多其餘Docker應用程序都使用底層API和CLI。bash
後臺程序建立和管理Docker對象,例如鏡像,容器,網絡和卷。服務器
注意:Docker以Apache 2.0 license許可開源。網絡
能夠用Docker幹什麼?
快速,一致地交付您的應用程序
Docker簡化了開發流程,容許開發人員使用標準化環境,把應用程序和服務放到本地容器中工做。容器很是適合持續集成和持續交付(CI/CD)工做流程。架構
請考慮如下示例場景:app
- 開發人員在本地編寫代碼,並使用Docker容器與同事共享他們的工做。
- 他們使用Docker將其應用程序推送到測試環境中,並執行自動和手動測試。
- 當開發人員發現錯誤時,他們能夠在開發環境中對其進行修復,而後將其從新部署到測試環境中以進行測試和驗證。
- 測試完成後,簡單的把更新的鏡像推送到生產環境。
響應式部署和擴展
Docker是基於容器的平臺容許高度可移植的工做負載。 Docker容器能夠在開發人員的本地筆記本電腦上,數據中心中的物理或虛擬機上,雲提供商上或混合環境中運行。負載均衡
Docker的可移植性和輕量級的特性還使您能夠輕鬆地動態管理工做負載,並根據業務需求指示伸縮應用程序和服務,幾乎是實時的。
在同一硬件上運行更多工做負載
Docker輕巧快速。 它是基於虛擬機管理程序的虛擬機,的一個經濟高效的替代方案,所以您能夠利用更多的計算能力來實現業務目標。 Docker很是適合於高密度環境以及中小型部署,而您須要用更少的資源作更多的事情。
Docker架構
Docker使用客戶端-服務器架構。 Docker客戶端與Docker後臺程序之間能夠相互通訊,後臺程序完成了構建,運行和分發Docker容器的繁重工做。 Docker客戶端和後臺程序能夠在同一系統上運行,也能夠將Docker客戶端鏈接到遠程Docker守護程序。 Docker客戶端和守護程序在UNIX套接字或網絡接口上使用REST API進行通訊。
後臺程序
Docker後臺程序(dockerd
)監聽Docker API請求並管理Docker對象,例如鏡像,容器,網絡和卷。 後臺程序還能夠與其餘後臺程序通訊以管理Docker服務。
Docker客戶端
Docker客戶端(docker
)是Docker用戶與Docker交互的主要方式。 當您使用諸如docker run
之類的命令時,客戶端會將這些命令發送至dockerd
,而後執行它們。 docker
命令使用Docker API。 Docker客戶端能夠與多個後臺程序通訊。
Docker註冊中心
Docker註冊中心存儲Docker鏡像。 Docker Hub是任何人均可以使用的公共註冊中心,而且默認狀況下,Docker已配置爲在Docker Hub上查找鏡像。 您甚至能夠運行本身的私人註冊中心。 若是使用Docker數據中心(DDC),則其中包括Docker可信註冊中心(DTR)。
使用docker pull
或docker run
命令時,所需的鏡像將從配置的註冊中心拉取。 使用docker push
命令時,會將鏡像推送到配置的註冊中心。
Docker對象
使用Docker時,您正在建立和使用鏡像,容器,網絡,卷,插件和其餘對象。本節是其中一些對象的簡要概述。
鏡像
鏡像是一個只讀模板,其中包含建立Docker容器的指令。一般,一個鏡像基於另外一個鏡像,並進行一些定製。例如,您能夠構建基於ubuntu的鏡像,並安裝Apache Web服務器和您的應用程序,以及運行應用程序所需的配置信息。
您能夠建立本身的鏡像,也可使用其餘人在註冊中心發佈的鏡像。要構建本身的鏡像,您可使用簡單的語法建立一個Dockerfile,定義建立鏡像所需的步驟。 Dockerfile中的每一個指令都會在鏡像中建立一個層。當您更改Dockerfile並重建鏡像時,僅重建那些已更改的層。與其餘虛擬化技術相比,這是使鏡像如此輕巧,小型和快速的部分緣由。
容器
容器是鏡像的可運行實例。您可使用Docker API或CLI建立,啓動,中止,移動或刪除容器。您能夠將容器鏈接到一個或多個網絡,附加存儲,甚至根據其當前狀態建立新鏡像。
默認狀況下,容器與其餘容器及其主機之間的隔離程度相對較高。您能夠控制容器的網絡,存儲或其餘底層子系統與其餘容器或主機之間的隔離程度。
容器由鏡像以及在建立或啓動時提供的配置定義。刪除容器後,未存儲在持久性存儲中的狀態更改將消失。
docker run
命令示例
如下命令運行ubuntu容器,並以交互方式附加到本地命令行會話,而後運行/bin/bash
。
$ docker run -i -t ubuntu /bin/bash
當您運行此命令時,會發生如下狀況(假設您使用的是默認註冊中心配置):
-
若是本地沒有ubuntu鏡像,則Docker會將其從配置的註冊中心拉取,等同於您手動運行
docker pull ubuntu
。 -
Docker建立了一個新容器,等同於您手動運行
docker container create
命令。 -
Docker將一個讀寫文件系統分配給容器,做爲其最後一層。這容許運行中的容器在其本地文件系統中建立或修改文件和目錄。
-
Docker建立了一個網絡接口,將容器鏈接到默認網絡,由於您未指定任何網絡選項。默認狀況下,容器可使用主機的網絡鏈接鏈接到外部網絡。
-
Docker啓動容器並執行
/bin/bash
。由於容器是交互式運行的,而且已附加到您的終端(因爲-i
和-t
標記),因此您可使用鍵盤輸入命令。 -
當您輸入
exit
終止/bin/bash
命令時,該容器將中止但不會被刪除。您能夠從新啓動或刪除它。
服務
服務使您能夠在多個後臺程序之間擴展容器,這些後臺程序一塊兒工做組成一個swarm集羣,包括多個管理端和工做端。 swarm集羣的每一個成員都是Docker後臺程序,而且全部後臺程序都使用Docker API進行通訊。服務容許您定義所需的狀態,例如在任何給定時間必須可用的服務副本的數量。 默認狀況下,該服務在全部工做節點之間實現負載均衡。 對於消費者而言,Docker服務就像是一個單獨的應用程序。 Docker Engine在Docker 1.12及更高版本上支持swarm集羣模式。
底層實現
Docker用Go編寫,並利用Linux內核的多個功能來實現其功能。
命令空間(namespace
)
Docker使用一種稱爲命名空間的技術來提供稱爲容器的隔離工做區。 運行容器時,Docker會爲該容器建立一組命名空間。
這些命名空間提供了一層隔離。 容器的全部方面都在單獨的命名空間中運行,而且對其的訪問僅限於該命名空間。
Docker Engine在Linux上使用如下命名空間:
pid
命名空間:進程隔離(PID:進程ID)。 net
命名空間:管理網絡接口(NET:網絡)。 ipc
命名空間:管理對IPC資源的訪問(IPC:進程間通訊)。 mnt
命名空間:管理文件系統掛載點(MNT:掛載)。 uts
命名空間:隔離內核和版本標識符。 (UTS:Unix時間共享系統)。
控制組(Control groups)
Linux上的Docker引擎還依賴於另外一種稱爲控制組(cgroups
)的技術。 cgroup將應用程序限制在一組特定的資源上。控制組容許Docker引擎將可用的硬件資源共享給容器,並有選擇地實施限制和約束。例如,您能夠限制特定容器可用的內存。
聯合文件系統(Union file systems)
聯合文件系統或UnionFS是經過建立層進行操做的文件系統,使其很是輕便且快速。 Docker Engine使用UnionFS爲容器提供構建模塊。 Docker Engine可使用多個UnionFS變體,包括AUFS,btrfs,vfs和DeviceMapper。
容器格式
Docker Engine將命名空間,控制組和UnionFS組合到一個稱爲容器格式的包裝器中。默認容器格式爲libcontainer
。未來,Docker可能會經過集成BSD Jails或Solaris Zones等技術來支持其餘容器格式。
下一步
- 閱讀有關安裝Docker。
- 經過Docker入門教程得到實踐經驗。
- 在Docker Engine用戶指南中查看示例和深刻探討各主題。