這篇文章中,將會介紹什麽是docker,它的演變過程,底層核心linux概念以及它的工作原理。
當涉及基於容器的實作時,Docker 已成為事實上的標準。 Docker 是從小規模實施到大規模企業應用程式的基於容器的編排的基礎。
Docker 很快在 DevOps 社群中獲得了廣泛的歡迎和采用,因為它是為可移植性而開發的,並且是為現代微服務架構而設計的。
本文中,你將會了解到:
1.什麽是 Docker?
2.了解 Docker 並了解為什麽 Docker 有益且不同於其他容器技術。
3.Docker核心架構及其關鍵元件
4.容器的演進和Linux容器的底層概念、
5.什麽是容器,哪些 Linux 功能使其發揮作用?
6.行程、容器和虛擬機器之間的區別
什麽是docker?
Docker 是一個用 Go 編寫的流行開源計畫,由 Dotcloud(一家 PaaS 公司)開發。
它是一個容器引擎,使用名稱空間和控制組等 Linux 內核功能在作業系統之上建立容器。所以你可以稱之為作業系統級虛擬化。
Docker 最初構建於Linux 容器 (LXC )之上。後來 Docker 用它的容器執行時 libcontainer (現在是runc的一部份)取代了 LXC。我在文章末尾解釋了 LXC 和容器的核心概念。
你可能會問 Docker 與 Linux 容器 (LXC) 有何不同,因為所有概念和實作看起來都很相似?
除了作為一種容器技術之外,Docker 還具有定義明確的包裝器元件,可以使打包應用程式變得容易。在 Docker 出現之前,執行容器並不容易。這意味著它透過將所有應用程式系統需求打包到一個容器中來完成將應用程式與基礎設施解耦的所有工作。
例如,如果您有一個 Java jar 檔,則可以在任何安裝了 java 的伺服器上執行它。同樣,一旦使用 Docker 將容器與所需的應用程式打包在一起,您就可以在任何其他安裝了 Docker 的主機上執行它。
我們將透過執行一些 Docker 命令和參數來啟動並執行容器。
Docker 和 container之間的區別
Docker 是一種為高效管理容器而開發的技術或工具。
那麽,我可以在沒有 Docker 的情況下執行容器嗎?
是的!當然。您可以使用LXC技術在Linux伺服器上執行容器。此外, Podman等最新工具提供了與 Docker 類似的工作流程。
關於docker你應該了解
Docker 不是 LXC
Docker 不是虛擬機器解決方案。
Docker 不是配置管理系統,也不能替代 Chef、Puppet、Ansible 等。
Docker 不是一種平台即服務技術。
Docker 不是容器。
為什麽docker如此的棒?
Docker 擁有高效的工作流程,可將應用程式從開發人員的膝上型電腦轉移到測試環境再到生產環境。當您檢視將應用程式打包到 Docker 映像的實際範例時,您會對此有更多了解。
你知道啟動 docker 容器只需不到一秒嗎?
它的速度非常快,並且可以在任何具有相容 Linux 內核的主機上執行。 (也支持Windows)
Docker 使用寫入時復制聯合檔案系統來儲存映像。因此,當對容器進行更改時,只有更改才會使用寫入模型上的副本寫入磁盤。
透過copy on write,您將為所有容器最佳化共享儲存層。
docker采用率統計
這是關於 Docker的趨勢數據。你可以看到,在過去的五年裏,它一直是一個爆炸性的話題。
Docker 核心架構
以下部份將介紹 Docker 架構及其相關元件。我們還將了解每個元件如何協同工作以使 Docker 工作。
Docker 架構自誕生以來已經發生了幾次變化。當我釋出本文的第一個版本時,Docker 是構建在 LXC 之上的
以下是 Docker 發生的一些值得註意的架構變化
Docker 於 2014 年從 LXC 遷移到 libcontainer
runc – 用於啟動遵循所有 OCI 規範的容器的 CLI。
Containerd – Docker 在 2016 年將其容器管理元件分離到了 Containerd
OCI:開放容器計劃是容器執行時和規範的開放行業標準。
Docker 最初推出時,它具有整體架構。現在它被分為以下三個不同的組成部份。
Docker 引擎 (dockerd)
containerd
runc
Docker 和其他大型組織為標準容器執行時和管理層做出了貢獻。因此, containerd和runc現在是雲原生基金會的一部份,擁有來自所有組織的貢獻者。
現在讓我們看一下每個 Docker 元件。
Docker引擎
Docker 引擎由 docker 守護行程、API 介面和 Docker CLI 組成。 Docker 守護行程 (dockerd) 作為dockerd systemd 服務持續執行。它負責構建 docker 映像。
為了管理映像和執行容器, dockerd呼叫docker-containerd API。
containerd
containerd是另一個系統守護行程服務,負責下載 docker 映像並將其作為容器執行。它公開其 API 以接收來自dockerd服務的指令
docker runc
runc是容器執行時,負責建立容器所需的名稱空間和 cgroup。然後它在這些名稱空間內執行容器命令。 runc 執行時是根據 OCI 規範實作的。
Docker 是如何工作的?
我們已經了解了 Docker 的核心構建塊。
現在讓我們了解使用 Docker 元件的 Docker 工作流程。
Docker 元件
下面的官方高級 Docker 架構圖展示了常見的 Docker 工作流程。
Docker生態系由以下四個部份組成
Docker 守護行程 (dockerd)
Docker客戶端
Docker 映像
Docker 登錄檔
Docker容器
什麽是 Docker 守護行程?
Docker 具有客戶端-伺服器架構。 Docker 守護行程 ( dockerd ) 或伺服器負責與容器相關的所有操作。
守護行程透過 CLI 或 REST API 接收來自 Docker 客戶端的命令。 Docker 客戶端可以與守護行程位於同一主機上,也可以位於任何其他主機上。
預設情況下,docker 守護行程監聽docker.sock UNIX 套接字。如果您有任何遠端存取 docker API 的用例,則需要透過主機埠公開它。其中一種用例是將 Docker 作為 Jenkins 代理執行。
什麽是 Docker 映像?
映像是 Docker 的基本構建塊。它包含作業系統庫、依賴項和執行應用程式的工具。
可以使用應用程式依賴項來預構建映像以建立容器。例如,如果您想將 Nginx Web 伺服器作為 Ubuntu 容器執行,則需要使用 Nginx 二進制檔以及執行 Nginx 所需的所有作業系統庫建立 Docker 映像。
什麽是 Dockerfile?
Docker 有一個Dockerfile的概念,用於構建映像。 Dockerfile 是一種文字檔案,每行包含一個命令(指令)。
這是 Dockerfile 的範例。
docker 映像以分層方式組織。 Dockerfile上的每條指令都會在映像中添加一層。影像的最頂層可寫層是容器。
每個映像都是從基礎映像建立的。
例如,如果您可以使用 Ubuntu 的基本映像並使用 Nginx 應用程式建立另一個映像。基礎映像可以是父映像或者從父映像構建的映像。
你可能會問這個基礎映像(父映像)從哪裏來?有 docker 實用程式可以建立初始父基礎映像。它獲取所需的作業系統庫並將它們烘焙到基礎映像中。您不必這樣做,因為您將獲得 Linux 發行版的官方基礎映像。
映像的頂層是可寫的並且被執行的容器使用。影像中的其他圖層是唯讀的。
什麽是 Docker 登錄檔?
它是 Docker 映像的儲存庫(儲存)。
登錄檔可以是公共的或私有的。例如,Docker Inc 提供了名為 Docker Hub 的托管登錄檔服務。它允許您從中央位置上傳和下載影像。
什麽是 Docker 容器?
Docker 容器是根據現有映像建立的。它是影像的可寫層。
如果您嘗試將影像層和容器關聯起來,以下是它如何尋找基於 ubuntu 的影像。
您可以將應用程式打包到容器中,送出它,並將其設為黃金映像,以便從中構建更多容器。
容器可以啟動、停止、送出和終止。如果您終止容器而不送出它,則所有容器更改都將遺失。
理想情況下,容器被視為不可變物件,並且不建議對正在執行的容器進行更改。相反,僅出於測試目的對正在執行的容器進行更改。
兩個或多個容器可以連結在一起形成分層應用程式架構。然而,隨著kubernetes等容器編排工具的出現,使用 Docker 托管高度可延伸的應用程式變得更加容易。
Containerd 和 runc 有什麽區別?
containerd 負責管理容器,runc 負責使用來自 containerd 的輸入來執行容器(在容器內建立名稱空間、cgroup 和執行命令)
Docker 引擎和 Docker 守護行程有什麽區別?
Docker 引擎由 docker 守護行程、rest 介面和 docker CLI 組成。 Docker 守護行程是 systemd dockerd 服務,負責構建 docker 映像並將 docker 指令發送到 Containerd 執行時。
轉譯自:https://devopscube.com/what-is-docker/