Container 基本概念介紹 (Docker)

近幾年,矽谷的各個科技大廠都快速的融入 Cloud Native 原生雲 的概念。就連新興 Startups 創業 公司的軟體開發也都是直接基於 Cloud Native 概念開始的。這代表著現代的工程師想要具有競爭力,無論工作是 Frontend、Backend、又或是 Operations,對 Cloud 雲端 相關內容有著基本的了解都會是大大的加分。而在 Cloud Native 的世界中,Container 容器 則扮演著至關重要的基本角色。

Container 基本概念介紹 (Docker)

前言

雲端在軟體市場的占比在2020已經達到了30%以上,並且將來只會越來越高。

近幾年,矽谷的各個科技大廠都快速的融入 Cloud Native 原生雲 的概念。就連新興 Startups 創業 公司的軟體開發也都是直接基於 Cloud Native 概念開始的。這代表著現代的工程師想要具有競爭力,無論工作是 Frontend、Backend、又或是 Operations,對 Cloud 雲端 相關內容有著基本的了解都會是大大的加分。而在 Cloud Native 的世界中,Container 容器 則扮演著至關重要的基本角色。

Cloud Native 的生態環境非常廣闊,不妨看看這個 CNCF 的生態圖看看自己知道幾個又或是看過幾個。

Container 的優點

  • 快速的交付和部署
    Container 能夠一次建立或設定,可以在任意地方正常執行。
  • 有效率的虛擬化
    Container 的執行是核心層級的虛擬化,比起 Virtual Machine 有更高的效能和效率。
  • 輕鬆的遷移和擴展
    Container 幾乎可以在所有的平台上執行,從實體機器、虛擬機、雲端、到個人電腦等。 這種兼容性讓應用程式平台的遷移變的非常容易。並且因為容易運行,也使擴展變的相當輕鬆。
  • 未來的趨勢
    Container 是未來的軟體的趨勢。以 Docker 為例,只需要簡單的修改就可以替代以往大量的更新工作。並且修改都是以增量的方式被分發和更新,使自動化並且有效率的管理得以實現。

對比傳統以及虛擬機

實體機 虛擬機 容器
啟動速度 數分鐘 數秒
硬碟容量 幾GB 幾GB 幾MB
效能 接近傳統
系統支援量 極少量 一般幾十個 上千個容器

容器中的資源隔離 Container Isolation

  • Namespace 命名空間
    Namespace 提供了一層隔離。Namespace 限制了 Container 所能看到的東西。當運行 Container 時,Docker 會為該 container 創建一組 namespace 如 pid、net、mnt、uts、ipc
  • Cgroup 控制組
    Cgroup 將應用程序限制為一組特定的資源。它限制了應用程序可以使用多少資源。這使 Docker 引擎能夠將可用的硬件資源共享給容器,並有選擇地實施限制和約束。
  • Union Filesystem 聯合文件系統
    通過創建層來運行的 Union Filesystem,Docker Image 由彼此分層的文件系統組成,使其非常輕便且快速。

OCI & CRI 容器標準和運行時

簡易的示意圖

Open Container Initiative (OCI)

OCI 是容器開放標準。OCI 當前包含兩個規範:運行時規範(runtime-spec)和映像規範(image-spec)。Runtime-spec 規範定義瞭如何將 OCI Image 捆綁包作為 Container 運行。Image-spec 規範定義瞭如何創建 OCI Image,該 Image 包括 Image Manifest,文件系統(Layers)序列化和 Image Configuration。

Container Runtime Interface (CRI)

CRI 容器運行時接口用於實現 OCI 的標準。一般被分為 High & Low Level 兩種 Runtime。

Low Level

最常見的 low-level runtime 有 docker 的開源項目 moby 所有的 runC。OCI runtime 是屬於 low-level 的 runtime,其功能主要用於創建和刪除 container。

High Level

較為常見 CRI runtime的有由 docker 衍生除來的 containerd 和紅帽為了 Kubernetes 所開發的 CRI-O。其功能包括 Container 生命週期管理、資源管理等等。

Docker

你為什麼需要認識 Docker ?

說到 Container 最常被提及的就是 Docker 了。Docker 是 2013 年 DotCloud 公司的開源專案,公司在項目成功之後改名為 Docker Inc。簡而言之 Docker 已經算是 Container 的代名詞了,所以這篇文章的多數內容將會以 Docker 帶入 Container 的相關話題。

架構和組件 Docker Architecture & Components

Docker 架構簡圖

Docker 體系結構包含 五個主要組件:

  • Docker Daemon
    監聽 Docker API 請求並管理 Docker 對象,例如 Image、Container、Network、Volume。
  • Docker Client
    使用戶可以與 Docker 進行交互。Docker Client 提供了命令界面(CLI),允許用戶運行和停止對 Docker Daemon 的應用程序命令。
  • Docker Host
    提供了執行和運行應用程序的完整環境。它由 Docker Daemon、 Image、Container、Network、Volume。
  • Docker Registry
    用於存儲 Docker Image。Docker Hub 是任何人都可以使用的公共 Registry,並且 Docker 默認配置為在 Docker Hub 上使用 Image。可以在上面運行自己的 Registry。
  • Docker Image
    Image 是 read-only 模板,可通過以 Dockerfile 編寫的一組指令構建。Docker Image 定義了打包的應用程序及其 dependencies 啟動時所需運行的進程。

Dockerfile

Dockerfile 是一個用來構建鏡像的文件,內容包含了一條條構建 Docker Image 所需的指令和說明。用於創建 Docker Image 所編寫的一組指令構建。

Docker Command 指令

Docker 是一個能夠全套管理 Container 的工具,其中最常使用的功能包括:

  • docker build <image> - 創建 Image
  • docker pull/push <image> - 對倉庫 Registry 推送和抓取 Image
  • docker run <image> - 根據 Image 運行 Container

Container Engine

Docker 並不屬於 OCI 或 CRI,但 Docker 的使用包括 Containerd (CRI) 和 runC (OCI)。像 Docker 這樣的全套 Container 管理軟體被稱作 Container Engine,而 Docker Inc 公司也將其商品稱為 Docker Engine。

Docker Engine 簡單示意圖

Docker 使用 Client-Server 架構。Docker Client 端與 Docker Daemon 進程進行溝通,Docker Daemon 用於構建、運行和分發 Docker Container。Docker Client 和 Docker Daemon 使用 REST API,通過 UNIX Socket 或網絡接口進行通信。
Docker Engine中包含三個組件 :

  • Server
    這是名為 dockerd 的 docker daemon。它可以創建和管理 docker 映像、容器、網絡等。
  • Rest API
    用於指示 docker daemon 任務。
  • Command Line Interface CLI
    用於輸入 docker 命令的客戶端。

Container 不是只有 Docker

雖說 Docker 幾乎已經是 Container 的代名詞了,但除了 Docker 以外還有許多 Container 工具。可以參考 Container Tool Project 中像是 buildah + skopeo + podman 額外再加上 cri-o 就幾乎完全取代了 Docker 了所有功能了。

總結

Container 是現代軟體的趨勢,而在 Container 之上還有像是 Kubernetes、Docker-Swarm、Mesos 這些 Container Orchestration Tool 用於自動化管理 Container 的平台。目前發展最為迅速及成熟的無非就是 Kubernetes 了,可以參考我另一篇文章 Kubernetes 基本介紹 來入門


Reference