Docker 是一個開發、釋出和執行應用程式的開放平臺。Docker使您能夠將應用程式與基礎架構分離,以便快速交付軟體。有了 Docker,你可以像管理應用程式一樣管理你的基礎設施。通過利用 Docker 快速釋出、測試和部署程式碼的方法,您可以顯著減少編寫程式碼和在生產環境中執行它之間的延遲。
Docker 平臺
Docker 提供了在鬆散隔離的環境(稱為容器)中打包和執行應用程式的能力。隔離和安全性允許您在給定的主機上同時執行多個容器。容器是輕量級的,因為它們不需要額外的hypervisor負載,而是直接在主機的核心中執行。這意味著您可以在給定的硬體組合上執行比使用虛擬機器時更多的容器。你甚至可以在實際是虛擬機器的主機中執行 Docker 容器!
Docker 提供了工具和平臺來管理容器的生命週期:
- 使用容器開發應用程式及其支援元件。
- 容器成為分發和測試應用程式的單元。
- 準備就緒後,將應用程式作為容器或編排好的服務部署到生產環境中。無論您的生產環境是本地資料中心、雲提供商還是兩者的混合,操作都是一樣的。
Docker 引擎
Docker 引擎是一個 客戶端-伺服器 應用程式,具有以下主要元件:
- 一個伺服器,它是一種稱為守護程式(
dockerd
命令)的長時間執行程式。 - 一個 REST API,它指定程式可以用來與守護程式對話並指示它做什麼的介面。
- 一個命令列介面(CLI)客戶端(
docker
命令)。
CLI 使用Docker REST API通過指令碼或直接CLI命令控制Docker守護程式或與之互動。
許多其他Docker應用程式使用底層API和CLI。
這個守護程式建立和管理 Docker 物件,如映象、容器、網路和卷(images, containers, networks, and volumes)。
注意: Docker使用的是開源 Apache 2.0 許可證。
有關更多細節,請參閱下面的 Docker 架構。
我可以用 Docker 做什麼?
快速、一致地交付應用程式
Docker 允許開發人員使用提供應用程式和服務的本地容器,在標準化的環境中工作,從而簡化了開發生命週期。容器對於持續整合和持續交付(CI/CD)工作流非常有用。
考慮以下示例場景:
- 開發人員在本地編寫程式碼,並使用 Docker 容器與同事共享他們的工作。
- 他們使用 Docker 將應用程式推送到測試環境,並執行自動和手動測試。
- 當開發人員發現 bug 時,他們可以在開發環境中修復它們,並將它們重新部署到測試環境中進行測試和驗證。
- 當測試完成時,向客戶提供修復就像將更新後的映象推送到生產環境一樣簡單。
響應式部署和擴充套件
Docker 的基於容器的平臺允許高度可移植的工作負載。Docker 容器可以執行在開發人員的本地膝上型電腦上、資料中心的物理或虛擬機器上、雲提供商上或在混合的環境中。
Docker 的可移植性和輕量級性質也使得它可以很容易地動態管理工作負載,根據業務需要,在接近實時的情況下擴充套件或拆除應用程式和服務。
在相同硬體上執行更多工作負載
Docker 是輕量級和快速的。它為基於管理程式的虛擬機器提供了一種可行的、經濟有效的替代方案,因此您可以使用更多的計算能力來實現業務目標。Docker 非常適合高密度環境和中小型部署,在這些環境中,您需要用更少的資源做更多的事情。
Docker 架構
Docker 使用客戶端-伺服器架構。Docker 客戶端與 Docker 守護程式通訊,後者負責構建、執行和分發Docker 容器等繁重的工作。Docker 客戶端和守護程式可以執行在同一個系統上,或者您可以將一個 Docker 客戶端連線到一個遠端 Docker 守護程式。Docker 客戶端和守護程式通過 UNIX 套接字或網路介面使用 REST API 進行通訊。
Docker 守護程式
Docker 守護程式(dockerd
)偵聽 Docker API 請求並管理 Docker 物件,如映象、容器、網路和卷。
守護程式還可以與其他守護程式通訊來管理 Docker 服務。
Docker 客戶端
Docker 客戶端(docker
)是許多 Docker 使用者與 Docker 互動的主要方式。當您使用諸如docker run
之類的命令時,客戶端將這些命令傳送給dockerd
, 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 時,您正在建立和使用映象、容器、網路、卷、外掛和其他物件。本節簡要介紹其中一些物件。
映象(IMAGES)
映象是一個只讀模板,帶有建立 Docker 容器的指令。映象通常基於另一個映象,並進行一些額外的定製。例如,您可以構建基於 ubuntu 映象的映象,但是安裝了 Apache web server 和您的應用程式,以及執行應用程式所需的配置細節。
您可以建立自己的映象,也可以只使用其他人建立併發布在登錄檔中的映象。要構建自己的映象,需要建立一個 Dockerfile,其中包含一個簡單的語法,用於定義建立映象並執行它所需的步驟。Dockerfile 中的每條指令都會在映象中建立一個層。當你改變 Dockerfile 並重建映象時,只有那些已經改變的層才會重建。這是使映象與其他虛擬化技術相比如此輕量級、小巧和快速的原因之一。
容器(CONTAINERS)
容器是映象的可執行例項。您可以使用 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 建立一個網路介面,將容器連線到預設網路,因為您沒有指定任何網路選項。這包括為容器分配IP地址。預設情況下,容器可以使用主機的網路連線連線到外部網路。
- Docker 啟動容器並執行
/bin/bash
。由於容器以互動方式執行並連線到你的終端(由於有-i
和-t
標誌),所以可以將輸出記錄到終端,同時你可以使用鍵盤提供輸入。 - 當您鍵入
exit
終止/bin/bash
命令時,容器將停止,但不會被刪除。您可以重新啟動或刪除它。
服務(SERVICES)
服務允許您跨多個 Docker 守護程式擴充套件容器,這些守護程式組成一個叢集,多個管理者和工作者一起工作。一個叢集的每個成員都是一個 Docker 守護程式,所有的守護程式都使用 Docker API 進行通訊。服務允許您定義所需的狀態,例如在任何給定時間必須可用的服務副本的數量。預設情況下,服務在所有工作節點之間進行負載均衡。對於消費者來說,Docker 服務看起來像一個單獨的應用程式。Docker 引擎在 Docker 1.12 及更高的版本支援叢集模式。
底層技術
Docker 是用 Go 編寫的,並利用 Linux 核心的幾個特性來實現其功能。
名稱空間
Docker 使用名為名稱空間的技術來提供稱為容器的隔離工作區。當您執行一個容器時,Docker 為該容器建立一組名稱空間。
這些名稱空間提供了一個隔離層。容器的每個方面都在一個單獨的名稱空間中執行,其訪問許可權僅限於該名稱空間。
Docker 引擎在 Linux 上使用如下名稱空間:
pid
名稱空間: 程式隔離 (PID: 程式ID)。net
名稱空間: 管理網路介面 (NET: Networking)。ipc
名稱空間: 管理對 IPC 資源的訪問 (IPC: 程式間通訊)。mnt
名稱空間: 管理檔案系統掛載點 (MNT: Mount)。uts
名稱空間: 隔離核心識別符號和版本識別符號 (UTS: Unix分時系統)。
控制組
Linux 上的 Docker 引擎還依賴於另一種稱為控制組(cgroups)的技術。cgroup 將應用程式限制為特定的資源集。控制組允許 Docker 引擎將可用的硬體資源共享給容器,並可以選擇強制限制和約束。例如,可以限制特定容器的可用記憶體。
聯合檔案系統
聯合檔案系統,或 UnionFS,是通過建立層來操作的檔案系統,使其非常輕便和快速。Docker 引擎使用 UnionFS 為容器提供構建塊。Docker 引擎可以使用多種 UnionFS 變體,包括 AUFS、btrfs、vfs 和 DeviceMapper。
容器格式
Docker 引擎將名稱空間、控制組和 UnionFS 組合到一個稱為容器格式的包裝器中。預設的容器格式是 libcontainer
。未來,Docker 可能會通過與 BSD Jails 或 Solaris Zones 等技術整合來支援其他容器格式。