什麼是容器運行時?
在學習 容器鏡像 時,我們討論了容器的基本原理,但現在是深入研究容器 運行時 的時候了,從而了解容器環境是如何構建的。本文的部分信息摘自 開放容器計劃 (OCI)的 官方文檔,所以無論使用何種容器引擎,這些信息都是一致的。
容器運行機制
那麼,當你運行 podman run
或 docker run
命令時,在後台到底發生了什麼?一個分步的概述如下:
- 如果本地沒有鏡像,則從鏡像 登記倉庫 拉取鏡像
- 鏡像被提取到一個寫時複製(COW)的文件系統上,所有的容器層相互堆疊以形成一個合併的文件系統
- 為容器準備一個掛載點
- 從容器鏡像中設置元數據,包括諸如覆蓋
CMD
、來自用戶輸入的ENTRYPOINT
、設置 SECCOMP 規則等設置,以確保容器按預期運行 - 提醒內核為該容器分配某種隔離,如進程、網路和文件系統( 命名空間 )
- 提醒內核為改容器分配一些資源限制,如 CPU 或內存限制( 控制組 )
- 傳遞一個 系統調用 給內核用於啟動容器
- 設置 SELinux/AppArmor
容器運行時負責上述所有的工作。當我們提及容器運行時,想到的可能是 runc、lxc、containerd、rkt、cri-o 等等。嗯,你沒有錯。這些都是容器引擎和容器運行時,每一種都是為不同的情況建立的。
容器運行時 更側重於運行容器,為容器設置命名空間和控制組(cgroup),也被稱為底層容器運行時。高層的容器運行時或容器引擎專註于格式、解包、管理和鏡像共享。它們還為開發者提供 API。
開放容器計劃(OCI)
開放容器計劃 (OCI)是一個 Linux 基金會的項目。其目的是設計某些開放標準或圍繞如何與容器運行時和容器鏡像格式工作的結構。它是由 Docker、rkt、CoreOS 和其他行業領導者於 2015 年 6 月建立的。
它通過兩個規範來完成如下任務:
1、鏡像規範
該規範的目標是創建可互操作的工具,用於構建、傳輸和準備運行的容器鏡像。
該規範的高層組件包括:
- 鏡像清單 — 一個描述構成容器鏡像的元素的文件
- 鏡像索引 — 鏡像清單的注釋索引
- 鏡像布局 — 一個鏡像內容的文件系統布局
- 文件系統布局 — 一個描述容器文件系統的變更集
- 鏡像配置 — 確定鏡像層順序和配置的文件,以便轉換成 運行時捆包
- 轉換 — 解釋應該如何進行轉換的文件
- 描述符 — 一個描述被引用內容的類型、元數據和內容地址的參考資料
2、運行時規範
該規範用於定義容器的配置、執行環境和生命周期。config.json
文件為所有支持的平台提供了容器配置,並詳細定義了用於創建容器的欄位。在詳細定義執行環境時也描述了為容器的生命周期定義的通用操作,以確保在容器內運行的應用在不同的運行時環境之間有一個一致的環境。
Linux 容器規範使用了各種內核特性,包括 命名空間 、 控制組 、 權能 、LSM 和文件系統 隔離 等來實現該規範。
小結
容器運行時是通過 OCI 規範管理的,以提供一致性和互操作性。許多人在使用容器時不需要了解它們是如何工作的,但當你需要排除故障或優化時,了解容器是一個寶貴的優勢。
本文基於 techbeatly 的文章,並經授權改編。
via: https://opensource.com/article/21/9/container-runtimes
作者:Nived V 選題:lujun9972 譯者:geekpi 校對:turbokernel
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive