我畫著圖,FluentAPI 她自己就生成了
Docker是一個用於開發,釋出和執行應用程式的開放平臺。Docker使您能夠將應用程式與基礎架構分開,從而可以快速交付軟體。藉助Docker,您可以以與管理應用程式相同的方式來管理基礎架構。通過利用Docker的方法來快速交付,測試和部署程式碼,您可以大大減少編寫程式碼和在生產環境中執行程式碼之間的延遲。
Docker平臺
Docker提供了在鬆散隔離的環境(稱為容器)中打包和執行應用程式的功能。隔離和安全性使您可以在給定主機上同時執行多個容器。容器是輕量級的,因為它們不需要管理程式的額外負載,而是直接在主機的核心中執行。這意味著與使用虛擬機器相比,在給定的硬體組合上可以執行更多的容器。您甚至可以在實際上是虛擬機器的主機中執行Docker容器!
Docker提供了工具和平臺來管理容器的生命週期:
-
使用容器開發應用程式及其支援元件。
-
容器成為分發和測試應用程式的單元。
-
準備就緒後,可以將應用程式作為容器或協調服務部署到生產環境中。無論您的生產環境是本地資料中心,雲提供商還是兩者的混合,其工作原理都相同。
Docker引擎
Docker Engine是具有以下主要元件的客戶端-伺服器應用程式:
-
伺服器是一種長期執行的程式,稱為守護程式程序(
dockerd
命令)。 -
REST API,它指定程式可以用來與守護程式進行通訊並指示其操作的介面。
-
命令列介面(CLI)客戶端(
docker
命令)。
CLI使用Docker REST API通過指令碼或直接CLI命令控制或與Docker守護程式互動。許多其他Docker應用程式都使用基礎API和CLI。
守護程式建立和管理Docker物件,例如影象,容器,網路和卷。
注意:Docker已獲得開源Apache 2.0許可證的許可。
我可以將Docker用於什麼?
快速,一致地交付您的應用程式
Docker通過允許開發人員使用提供您的應用程式和服務的本地容器在標準化環境中工作,從而簡化了開發生命週期。容器非常適合持續整合和持續交付(CI / CD)工作流程。
請考慮以下示例方案:
-
您的開發人員在本地編寫程式碼,並使用Docker容器與同事共享他們的工作。
-
他們使用Docker將其應用程式推送到測試環境中,並執行自動和手動測試。
-
當開發人員發現錯誤時,他們可以在開發環境中對其進行修復,然後將其重新部署到測試環境中以進行測試和驗證。
-
測試完成後,將修補程式推送給生產環境就像將更新的映像推送到生產環境一樣簡單。
響應式部署和擴充套件
Docker基於容器的平臺允許高度可移植的工作負載。Docker容器可以在開發人員的本地膝上型電腦上,資料中心中的物理或虛擬機器,雲提供商或混合環境中執行。
Docker的可移植性和輕量級的特性還使您可以輕鬆地動態管理工作負載,並根據業務需求指示實時擴充套件或拆除應用程式和服務。
在同一硬體上執行更多工作負載
Docker輕巧快速。它為基於虛擬機器管理程式的虛擬機器提供了可行且經濟高效的替代方案,因此您可以利用更多的計算能力來實現業務目標。Docker非常適合高密度環境以及中小型部署,而您需要用更少的資源做更多的事情。
Docker架構
Docker使用客戶端-伺服器架構(C/S)。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
,以執行這些命令。該docker
命令使用Docker API。Docker客戶端可以與多個守護程式通訊。
Docker登錄檔
Docker登錄檔儲存Docker映像。Docker Hub是任何人都可以使用的公共登錄檔,並且預設情況下,Docker已配置為在Docker Hub上查詢映像。您甚至可以執行自己的私人登錄檔。
使用docker pull
或docker run
命令時,所需的影象將從配置的登錄檔中提取。使用該docker push
命令時,會將映像推送到配置的登錄檔。
容器是影象的可執行例項。您可以使用Docker API或CLI建立,啟動,停止,移動或刪除容器。您可以將容器連線到一個或多個網路,將儲存連線到它,甚至根據其當前狀態建立一個新映像。
預設情況下,容器與其他容器及其主機之間的隔離度相對較高。您可以控制容器的網路,儲存或其他基礎子系統與其他容器或與主機的隔離程度。
容器由其映像以及在建立或啟動時為其提供的任何配置選項定義。刪除容器後,未儲存在永久性儲存中的狀態更改將消失。
比較容器和虛擬機器
容器和虛擬機器具有相似的資源隔離和分配優勢,但功能不同,因為容器虛擬化作業系統而不是硬體。更方便攜帶,效率更高。
容器
容器是應用層的抽象,它將程式碼和依賴項打包在一起。多個容器可以在同一臺機器上執行,並與其他容器共享作業系統核心,每個容器都作為使用者空間中的獨立程序執行。容器比虛擬機器佔用更少的空間(容器映像的大小通常是幾十MB),可以處理更多的應用程式,需要更少的虛擬機器和作業系統。
虛擬機器
虛擬機器(vm)是物理硬體的抽象,將一臺伺服器轉換成多臺伺服器。hypervisor允許多個vm在一臺機器上執行。每個虛擬機器都包含一個作業系統的完整副本、應用程式、必要的二進位制檔案和庫—佔用了數十GB的空間。vm的啟動速度也很慢。
Docker為什麼比VM快?
1.Docker有著比虛擬機器更少的抽象層。
2.Docker利用的是宿主機的核心,VM需要完整Guest OS。
新建一個容器時,Docker不需要像虛擬機器一樣重新載入一個作業系統核心,避免引導。
虛擬機器載入Guest OS是分鐘級別,Docker利用宿主機作業系統,秒級。
底層技術
Docker用
名稱空間
Docker使用一種稱為namespaces
提供容器的隔離工作區的技術。執行容器時,Docker會為該容器建立一組 名稱空間。
這些名稱空間提供了一層隔離。容器的每個方面都在單獨的名稱空間中執行,並且其訪問僅限於該名稱空間。
Docker Engine在Linux上使用以下名稱空間:
-
的
pid
名稱空間:程序隔離(PID:程序ID)。 -
該
net
名稱空間:管理網路介面(NET:網路)。 -
該
ipc
名稱空間:管理訪問IPC資源(IPC:程序間通訊)。 -
該
mnt
名稱空間:管理檔案系統掛載點(MNT:摩)。 -
該
uts
名稱空間:隔離核心和版本識別符號。(UTS:Unix時間共享系統)。
對照組
Linux上的Docker引擎還依賴於另一種稱為控制組 (cgroups
)的技術。cgroup將應用程式限制為一組特定的資源。控制組允許Docker Engine將可用的硬體資源共享給容器,並有選擇地實施限制和約束。例如,您可以限制特定容器可用的記憶體。
聯合檔案系統
聯合檔案系統或UnionFS是通過建立圖層進行操作的檔案系統,使其非常輕便且快速。Docker Engine使用UnionFS為容器提供構建模組。Docker Engine可以使用多個UnionFS變體,包括AUFS,btrfs,vfs和DeviceMapper。
容器格式
Docker Engine將名稱空間,控制組和UnionFS組合到一個稱為容器格式的包裝器中。預設容器格式為libcontainer
。將來,Docker可以通過與BSD Jails或Solaris Zones等技術整合來支援其他容器格式。