了解 Docker

我已經使用 Docker 來建立 Web 專案的開發/交付流程已有幾個月了。 我為 Habrakhabr 讀者提供了有關 docker 的介紹文章的翻譯 - 《了解碼頭工人》.

什麼是碼頭工人?

Docker 是一個用於開發、交付和操作應用程式的開放平台。 Docker 旨在更快地交付您的應用程式。 使用 docker,您可以將應用程式與基礎架構解耦,並將基礎架構視為託管應用程式。 Docker 可協助您更快地交付程式碼、更快地測試、更快地交付應用程序,並減少編寫程式碼和運行程式碼之間的時間。 Docker 透過輕量容器虛擬化平台來實現這一點,使用可協助您管理和託管應用程式的進程和實用程式。

從本質上講,docker 允許您運行幾乎任何應用程序,並安全地隔離在容器中。 安全隔離可讓您同時在同一主機上執行多個容器。 容器的輕量級性質,無需虛擬機器管理程式的額外負擔即可運行,使您可以充分利用硬體。

容器虛擬化平台和工具在以下情況下非常有用:

  • 將您的應用程式(以及您使用的元件)打包到 docker 容器中;
  • 將這些容器分發並交付給您的團隊進行開發和測試;
  • 將這些容器部署在資料中心和雲端中的生產站點上。

我可以用 docker 做什麼?

快速發布您的應用程式

Docker 非常適合組織開發週期。 Docker 允許開發人員運行具有應用程式和服務的本機容器。 隨後允許您整合持續整合和部署工作流程的流程。

例如,您的開發人員在本地編寫程式碼並與同事共享他們的開發堆疊(一組 Docker 映像)。 當他們準備好時,他們會將程式碼和容器推送到測試網站並執行任何必要的測試。 從測試站點,他們可以將程式碼和圖像發送到生產環境。

更容易佈置和展開

基於 Docker 容器的平台可以輕鬆移植您的有效負載。 Docker 容器可以在本機電腦上運行,無論是真實電腦還是資料中心或雲端中的虛擬機器。

Docker 的可移植性和輕量級特性讓您可以輕鬆地動態管理工作負載。 您可以使用 docker 來部署或關閉您的應用程式或服務。 docker 的速度使得這一切可以近乎即時地完成。

更高的負載和更多的有效載荷

Docker 輕量且快速。 它為基於管理程式的虛擬機器提供了一種彈性、經濟高效的替代方案。 它在高負載環境中特別有用,例如,在創建自己的雲端或平台即服務時。 但當您想要充分利用現有資源時,它對於中小型應用程式也很有用。

主要 Docker 元件

Docker 由兩個主要元件組成:

  • Docker:一個開源虛擬化平台;
  • Docker Hub:我們用來分發和管理 Docker 容器的平台即服務。

筆記! Docker 在 Apache 2.0 授權下分發。

Docker架構

Docker 使用客戶端-伺服器架構。 Docker 用戶端與 Docker 守護程式進行通信,後者承擔建立、執行和分發容器的負擔。 客戶端和伺服器都可以在同一系統上運行,您可以將客戶端連接到遠端docker守護程式。 客戶端和伺服器透過套接字或 RESTful API 進行通訊。

了解 Docker

Docker 守護程式

如圖所示,守護程式在主機上執行。 使用者不直接與伺服器交互,而是使用客戶端進行交互。

Docker客戶端

Docker客戶端,即docker程序,是Docker的主要介面。 它接收來自使用者的命令並與 docker 守護程式互動。

碼頭工人內部

要了解 docker 的組成部分,您需要了解三個元件:

  • 圖片
  • 註冊表
  • 集裝箱

意象

Docker 映像像是唯讀範本。 例如,映像檔可能包含帶有 Apache 的 Ubuntu 作業系統及其上的應用程式。 映像用於建立容器。 Docker 可以輕鬆建立新映像、更新現有映像,或者您也可以下載其他人建立的映像。 映像像是 docker 建置的元件。

註冊

Docker 註冊表儲存映像。 您可以從公共和私人註冊表下載或上傳圖像。 公共 Docker 註冊表是 Docker中心。 那裡存儲了大量的圖像。 如您所知,圖像可以由您創建,也可以使用其他人創建的圖像。 註冊表是一個分發元件。

集裝箱

容器類似目錄。 容器包含應用程式運行所需的一切。 每個容器都是從映像創建的。 可以建立、啟動、停止、遷移或刪除容器。 每個容器都是隔離的,並為應用程式提供安全的平台。 容器是工作的組成部分。

那麼 Docker 是如何運作的呢?

到目前為止我們知道:

  • 我們可以創建我們的應用程式所在的圖像;
  • 我們可以從映像建立容器來運行應用程式;
  • 我們可以透過 Docker Hub 或其他映像倉庫來分發映像。

讓我們看看這些組件如何組合在一起。

影像如何發揮作用?

我們已經知道圖像是創建容器的唯讀模板。 每個影像由一組層級組成。 Docker 使用 聯合檔案系統 將這些等級組合成一張圖像。 聯合檔案系統允許來自不同檔案系統(不同分支)的檔案和目錄透明地重疊,創建一個連貫的檔案系統。

docker 輕量級的原因之一是因為它使用了這樣的層。 當您變更映像(例如更新應用程式)時,會建立一個新圖層。 因此,無需像虛擬機器那樣替換整個映像或重建它,只需添加或更新該層。 而且您不必分發整個新映像,只需分發更新,從而使分發映像變得更輕鬆快速。

每個影像的核心都是基本影像。 例如,ubuntu(Ubuntu 的基礎映像)或 fedora(Fedora 發行版的基礎映像)。 您也可以使用圖像作為創建新圖像的基礎。 例如,如果您有 apache 映像,則可以將其用作 Web 應用程式的基礎映像。

筆記! Docker 通常會從 Docker Hub 註冊表中提取映像。

可以從這些基礎映像建立 Docker 映像;我們將建立這些映像的步驟稱為指令。 每條指令都會建立一個新的映像或等級。 說明如下:

  • 運行命令
  • 新增檔案或目錄
  • 建立環境變數
  • 啟動此映像的容器時要執行的內容的說明

這些指令儲存在一個檔案中 Dockerfile。 Docker 讀到了這個 Dockerfile,當您建立圖像時,執行這些指令並返回最終圖像。

docker 註冊表如何運作?

註冊表是 docker 映像的儲存庫。 建立映像後,您可以將其發佈到公共 Docker Hub 註冊表或您的個人註冊表。

使用 docker 用戶端,您可以搜尋已發布的映像並將其下載到您的 docker 機器上以建立容器。

Docker Hub 提供公有和私有映像儲存庫。 每個人都可以從公共儲存庫搜尋和下載圖像。 私人儲存的內容不包含在搜尋結果中。 只有您和您的使用者才能接收這些映像並從中建立容器。

容器如何運作?

容器由作業系統、使用者檔案和元資料組成。 眾所周知,每個容器都是從鏡像創建的。 這個映像告訴docker容器裡有什麼,啟動什麼進程,容器什麼時候啟動,以及其他設定資料。 Docker 映像像是唯讀的。 當 docker 啟動容器時,它會在映像之上建立一個讀/寫層(使用前面所述的聯合檔案系統),應用程式可以在其中運行。

容器啟動時會發生什麼?

或使用該程式 docker,或使用RESTful API,docker客戶端告訴docker守護程式啟動容器。

$ sudo docker run -i -t ubuntu /bin/bash

我們來看看這個指令。 使用命令啟動客戶端 docker,有選項 run,表示將推出一個新容器。 運行容器的最低要求是以下屬性:

  • 使用哪個映像來建立容器。 在我們的例子中 ubuntu
  • 容器啟動時要執行的命令。 在我們的例子中 /bin/bash

當我們運行這個命令時,幕後會發生什麼?

Docker 會依序執行以下操作:

  • 下載 ubuntu 鏡像: docker 檢查映像可用性 ubuntu 在本機上,如果不存在,則從以下位置下載 Docker中心。 如果有鏡像,則使用它來建立容器;
  • 建立一個容器: 當接收到映像後,docker使用它來建立一個容器;
  • 初始化檔案系統並掛載唯讀層級: 在檔案系統中建立容器並將鏡像新增到唯讀層級;
  • 初始化網路/網橋: 建立一個網路接口,允許docker與宿主機進行通訊;
  • 設定IP位址: 查找並設定地址;
  • 啟動指定進程: 啟動您的應用程式;
  • 處理並產生應用程式的輸出: 連接並記錄應用程式的標準輸入、輸出和錯誤流,以便您可以追蹤應用程式的執行情況。

您現在有了一個工作容器。 您可以管理您的容器,與您的應用程式互動。 當您決定停止應用程式時,請刪除容器。

使用的技術

Docker是用Go編寫的,並且使用Linux核心的一些特性來實現上述功能。

命名空間

Docker使用技術 namespaces 組織隔離的工作空間,我們稱為容器。 當我們啟動一個容器時,docker 會為此容器建立一組命名空間。

這創建了一個隔離層,容器的每個方面都在自己的命名空間中運行,並且無法存取外部系統。

docker 使用的一些命名空間清單:

  • 進程號: 隔離進程;
  • 淨: 用於管理網路介面;
  • 工控機: 管理IPC資源。 (ICP:進程間通訊);
  • mnt: 管理掛載點;
  • 世界標準時間: 隔離核心並控製版本產生(UTC:Unix 分時系統)。

對照組

Docker也使用了技術 cgroups 或對照組。 隔離運行應用程式的關鍵是只向應用程式提供您想要提供的資源。 這確保了容器將成為好鄰居。 控制組可讓您共用可用的硬體資源,並在必要時設定限制和限制。 例如,限制容器可能的記憶體量。

聯合檔案系統

Union File Sysem 或 UnionFS 是一種透過建立層來運作的檔案系統,使其非常輕量且快速。 Docker 使用 UnionFS 建立用於建置容器的區塊。 Docker 可以使用 UnionFS 的多種變體,包括:AUFS、btrfs、vfs 和 DeviceMapper。

容器格式

Docker 將這些元件組合成一個包裝器,我們稱之為容器格式。 預設格式稱為 libcontainer。 Docker 也支援 Linux 上的傳統容器格式,使用 LXC。 未來,Docker可能會支援其他容器格式。 例如,與 BSD Jails 或 Solaris Zones 整合。

來源: www.habr.com

添加評論