一、Docker基礎入門及架構介紹

系列文章介紹

本文是《Docker必知必會系列》第一篇,原文發佈於個人博客:悟塵紀

此係列文章共包括如下章節:

部分內容翻譯自 Docker官方文檔 或參考 《Docker — 從入門到實踐》,非常感謝原作者。

一、Docker 概述

Docker是供開發人員和系統管理員 使用容器構建,運行和共享應用程序的平臺。使用容器來部署應用程序稱爲容器化。

Docker 使您能夠將應用程序與基礎架構分開,從而可以快速交付軟件。藉助 Docker,您可以以與管理應用程序相同的方式來管理基礎架構。通過利用 Docker 的快速交付,測試和部署代碼的方法,您可以大大減少編寫代碼和在生產環境中運行代碼之間的延遲。

容器化越來越受歡迎,是因爲容器:

  • 靈活:即使最複雜的應用程序也可以容器化。
  • 輕量級:容器利用並共享主機內核,在系統資源方面比虛擬機更加有效。
  • 可移植性:可以在本地構建,部署到雲並在任何地方運行。
  • 鬆散耦合:容器高度封裝並自給自足,可以在不破壞其他容器的情況下更換或升級它們。
  • 可擴展:可以方便的在數據中心內增加並自動分發容器副本。
  • 安全:容器將積極的約束和隔離應用於流程,而無需用戶方面的任何配置。

鏡像(Image)和容器(Container)

從根本上講,一個容器不過是一個正在運行的進程,並對其應用了一些附加的封裝功能,以使其與主機和其他容器隔離。容器隔離的最重要方面之一是每個容器都與自己的專用文件系統進行交互。該文件系統由Docker 鏡像提供。鏡像包括運行應用程序所需的一切:代碼或二進制文件、運行時、依賴項以及所需的任何其他文件系統對象。

容器與虛擬機

容器在 Linux 本機上運行,並與其他容器共享主機的內核。它運行一個離散的進程,佔用的內存不比任何其他可執行文件多,從而使其輕巧。

相比之下,虛擬機(VM)運行一個完整的 ”Guest操作系統“,通過虛擬機監控程序對主機資源進行虛擬訪問。一般來說,VM 除了應用程序邏輯所消耗的開銷之外,還會產生很多開銷。

Docker VS 虛擬機

我可以將 Docker 用於什麼

快速,一致地交付您的應用程序

Docker 通過允許開發人員使用容器讓應用程序和服務在本地標準化環境中工作,從而簡化了開發生命週期。容器非常適合持續集成和持續交付(CI / CD)工作流程。

響應式部署和擴展

Docker 容器可以在開發人員的本地筆記本電腦上,數據中心中的物理或虛擬機上,雲提供商上或混合環境中運行。其可移植和輕量級的特性還使您可以輕鬆地動態管理工作負載,並根據業務需求指示實時擴展或關閉應用程序和服務。

在同一硬件上運行更多工作負載

Docker 輕巧快速。它相對於虛擬機提供了可行且經濟高效的替代方案,因此您可以利用更多的計算能力來實現業務目標。Docker 非常適合高密度環境和中小型部署,讓您可以用更少的資源做更多的事情。

二、Docker 安裝及運行

1、獲取 Docker

Docker 分爲 CE 和 EE 兩大版本。Docker CE 分爲 stabletestnightly 三個更新頻道。官方網站上有各種環境下的 安裝指南,可以根據自己的情況進行安裝。

2、鏡像加速

一般國內在使用過程中拉取 Docker 鏡像十分緩慢,可以配置 Docker 國內鏡像加速。各個免費鏡像站測試結果可到 docker-practice/docker-registry-cn-mirror-test 查看。推薦使用阿里雲免費鏡像加速器(需登錄),穩定可靠。

對於使用 macOS 的用戶,在任務欄點擊 Docker Desktop 應用圖標 -> Perferences,在左側導航菜單選擇 Docker Engine,在右側參考如下內容編輯 json 文件(記得修改成您選擇的加速地址):

{
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}

修改完成之後,點擊 Apply & Restart 按鈕,Docker 就會重啓並應用配置的鏡像。執行 $ docker info,如果從結果中看到了如下內容,說明配置成功。

Registry Mirrors:
 https://xxxxxx.mirror.aliyuncs.com

3、小試牛刀

以下命令運行一個ubuntu容器,以交互方式附加到本地命令行會話,然後運行/bin/bash

docker run -i -t ubuntu /bin/bash

當您運行此命令時,會發生以下情況(假設您使用的是默認倉庫配置):

  1. 如果您在ubuntu本地沒有該鏡像,則 Docker 會將其從已配置的倉庫中拉出,就像您已docker pull ubuntu手動運行一樣。
  2. Docker 會創建一個新容器,就像您通過 docker container create 命令手動運行一樣。
  3. Docker 將一個可讀寫的文件系統分配給容器,作爲其最後一層。這允許運行中的容器在其本地文件系統中創建或修改文件和目錄。
  4. Docker 創建了一個網絡接口以將容器連接到默認網絡,因爲您未指定任何網絡選項。默認情況下,容器可以使用主機的網絡連接到外部網絡。
  5. Docker 啓動容器並執行/bin/bash。因爲容器是交互式運行的,並且已附加到您的終端(由於-i-t 標誌),所以您可以在終端進行交互操作並查看日誌。
  6. 當您鍵入exit以終止/bin/bash命令時,容器將停止但不會被刪除。您可以重新啓動或刪除它。

三、Docker 架構介紹

Docker 使用客戶端-服務器架構。Docker 客戶端(client守護進程(Docker daemon 進行對話,該守護進程 完成了構建、運行和分發 Docker 容器的繁重工作。Docker 客戶端和守護進程可以在同一系統上運行,或者您可以將 Docker 客戶端連接到遠程 Docker 守護進程。Docker 客戶端和守護進程在 UNIX 套接字或網絡接口上使用 REST API 進行通信。

Docker架構圖

Docker 守護進程

Docker 守護進程(dockerd)偵聽 Docker API 請求並管理 Docker 對象,例如 images(鏡像),containers(容器),networks(網絡)和 volume(卷)。守護進程還可以與其他守護進程通信以管理 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 pulldocker run 命令時,所需的鏡像將從配置的倉庫中提取。使用 docker push 命令時,會將鏡像推送到配置的倉庫。

Docker 對象

使用 Docker 時,您正在創建和使用鏡像(Image),容器(Container),網絡(Network),卷(Volume),插件(Plugin)和其他對象。本節是其中一些對象的簡要概述。

Images(鏡像)

鏡像是一個只讀模板(不包含任何動態數據,其內容在構建之後也不會被改變 ),其中包含創建 Docker 容器的說明。通常,一個鏡像基於另一個鏡像,並帶有一些額外的配置。 例如,你可以建立一個基於 ubuntu 鏡像的鏡像,安裝 ubuntu Apache HTTP Server 和你的應用程序,以及運行你的應用程序所需的配置細節。

您可以創建自己的鏡像,也可以僅使用其他人創建並在倉庫中發佈的鏡像。要構建自己的鏡像,您可以使用簡單的語法創建一個 Dockerfile,以定義創建鏡像並運行它所需的步驟。Dockerfile 中的每條指令都會在鏡像中創建一個層。更改 Dockerfile 並重建鏡像時,僅重建那些已更改的層。與其他虛擬化技術相比,這是使鏡像如此輕巧,小型和快速的部分原因。

Containers (容器)

容器是鏡像的可運行實例。您可以使用 Docker API 或 CLI 創建、啓動、停止、移動或刪除容器。您可以將容器連接到一個或多個網絡,將存儲附加到該網絡,甚至根據其當前狀態創建新鏡像。

默認情況下,容器與其他容器及其主機之間的隔離程度相對較高。您可以控制容器的網絡、存儲或其他基礎子系統與其他容器或與主機的隔離程度。

容器由其鏡像以及在創建或啓動時爲其提供的任何配置選項定義。刪除容器後,未存儲在持久性存儲中的狀態更改將消失。

按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用 Volume(數據卷)、或者掛載宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)進行讀寫,其性能和穩定性更高。

Service (服務)

服務允許跨多個 Docker 守護進程調度容器,這些守護進程以多個管理者和工作者的集羣模式協同工作。集羣的每個成員都是一個 Docker 守護進程,並且所有守護進程都使用 Docker API 進行通信。

服務允許您定義所需的狀態,例如在任何給定時間必須可用的服務副本數。默認情況下,該服務在所有工作節點之間實現負載平衡。對於使用者而言,Docker 服務似乎是一個單獨的應用程序。Docker Engine 在 Docker 1.12 及更高版本中支持集羣模式。

四、Docker 底層技術

Docker用Go編寫,並利用Linux內核的多個功能來交付其功能。底層核心技術包括命名空間(Namespaces)、控制組(Control groups)、Union 文件系統(Union file systems)和容器格式(Container format)。

命名空間(namespaces)

Docker使用一種稱爲 namespaces 的技術來提供稱之爲容器的隔離工作區。運行容器時,Docker會爲該容器創建一組命名空間。通過命名空間隔離容器之間彼此不受影響,且其訪問權限也僅限於該命名空間。

Docker Engine 在Linux 上使用以下命名空間:

  • **pid命名空間:**進程隔離(PID:Process ID)。
  • **net命名空間:**管理網絡接口(NET:Networking)。
  • **ipc命名空間:**管理對IPC資源的訪問(IPC:InterProcess Communication)。
  • **mnt命名空間:**管理文件系統掛載點(MNT:Mount)。
  • **uts命名空間:**隔離內核和版本標識符。(UTS:Unix Timesharing System)。

控制組(cgroups)

Linux上的 Docker 引擎依賴一種稱爲控制組cgroups)的技術。控制組爲應用程序限制一組特定的資源。控制組允許Docker Engine將可用的硬件資源共享給容器,並有選擇地實施限制和約束。例如,可以限制特定容器可用的內存。

CGroups 全稱control group,用來限定一個進程的資源使用,由Linux 內核支持,可以限制和隔離Linux進程組 (process groups) 所使用的物理資源 ,比如cpu,內存,磁盤和網絡IO,是Linux container技術的物理基礎。

聯合文件系統(UnionFS)

UnionFS文件系統,是通過創建層來操作的文件系統,這使得它們非常輕量級和快速。 Docker Engine 使用 UnionFS 爲容器提供分層構建塊。 Docker Engine 可以使用多個 UnionFS 變體,包括 AUFSbtrfsvfsDeviceMapper

Union File System,簡稱UnionFS,他是一種爲Linux 、FreeBSD 和NetBSD 操作系統設計的,把其他文件系統聯合到一個聯合掛載點的文件系統服務。

容器格式(Container format)

Docker Engine 將namespacescgroupsUnionFS 組合成一個稱爲容器格式的包裝器。 默認的容器格式是 libcontainer

相關文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章