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

前言

雲端在軟體市場的占比在2020已經達到了30%以上,並且將來只會越來越高。 雲端在軟體市場的占比在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 體系結構包含 五個主要組件:

  • 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
  • docker pull/push - 對倉庫 Registry 推送和抓取 Image
  • docker run - 根據 Image 運行 Container

Container Engine

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

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


Copyright © 2024 小貓貓工程師