OCI(Open Container Initiative)規範是容器技術的根本,它標準化了容器映象的格式,確保映象在不同平台和執行時環境的互通性。每個 OCI 映象都包含映象索引(可選)、檔案系統層和組態資訊。映象索引如同目錄,列出不同平台適用的映象版本;檔案系統層則組成了容器的檔案系統,每一層代表一個增量變更;組態則包含容器執行時所需的引數和環境變數。其中,映象 Manifest 尤為重要,它如同藍圖,定義了特定架構和作業系統的容器映象層級與組態,包含 schemaVersion、config、layers 和 annotations 等關鍵欄位,這些欄位詳細描述了映象的版本、組態資訊、層級結構以及額外中繼資料。瞭解 OCI 規範有助於我們更深入地理解容器映象的組成和運作方式。容器映象的來源眾多,常見的有 Docker Hub、Quay、Linux 發行版映象倉函式庫以及公有雲供應商提供的映象倉函式庫。Docker Hub 是最著名的公共映象倉函式庫,託管了大量社群和企業級映象;Quay 提供私有和公共倉函式庫,並具備安全掃描和自動構建功能;Linux 發行版通常也提供公共映象倉函式庫,但主要導向系統套件;公有雲供應商則為客戶提供私有映象倉函式庫服務。選擇合適的映象來源對於構建和佈署容器化應用至關重要。

容器映象的奧秘:OCI 規範與映象來源探索

容器技術的核心在於容器映象,但你是否真正瞭解映象的構成?身為一個在容器化領域打滾多年的老手,玄貓將帶你深入 OCI(Open Container Initiative)映象規範,並探索這些映象的來源。

OCI 映象規範:容器世界的共通語言

OCI 映象規範定義了一套標準,確保容器映象在不同平台和執行時之間具有互操作性。這就像是容器世界的共通語言,讓不同的工具和平台都能理解和使用這些映象。

一個 OCI 映象主要包含以下幾個部分:

  • 映象索引(Image Index,可選): 就像是一份目錄,列出了不同平台(例如 Linux、Windows、ARM)可用的映象版本。
  • 檔案系統層(Filesystem Layers): 這些是構成容器檔案系統的實際層,每一層代表了檔案系統的一個增量變更。
  • 組態(Configuration): 包含了容器執行時所需的所有資訊,例如啟動引數、環境變數等。

其中,映象 Manifest 尤其值得我們深入研究。

映象 Manifest:容器映象的藍圖

映象 Manifest 就像是容器映象的藍圖,它定義了特定架構和作業系統的容器映象的層和組態。

以下是一個映象 Manifest 的範例:

{
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "size": 7023,
    "digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7"
  },
  "layers": [
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "size": 32654,
      "digest": "sha256:9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0"
    }
  ],
  "annotations": {
    "com.example.key1": "value1",
    "com.example.key2": "value2"
  }
}

讓我們逐一解讀這些關鍵字:

  • schemaVersion: 必須設定為 2,以確保與 Docker 的向後相容性。
  • config: 透過 digest 參照容器的組態。
    • mediaType: 定義了組態的格式。
  • layers: 提供了一組描述符物件,描述了構成映象的各個層。
    • mediaType: 描述符的媒體型別。
  • annotations: 定義了映象 Manifest 的額外中繼資料。

OCI 映象規範的三個主要目標是:

  • 啟用映象組態的雜湊,從而生成唯一的 ID。
  • 允許使用多架構映象,因為其高階 Manifest(映象索引)參照了映象 Manifest 的平台特定版本。
  • 能夠輕鬆地將容器映象轉換為 OCI 執行時規範。

容器映象從何而來?探索映象的起源

我們經常使用預先構建的映象來執行、構建或管理容器,但這些映象從何而來?我們如何挖掘它們的原始指令或用於構建它們的 Dockerfile/Containerfile?

Docker 開創了容器映象和容器映象倉函式庫的概念,用於儲存這些映象,甚至是公開儲存。最著名的容器映象倉函式庫是 Docker Hub,但在 Docker 推出後,其他雲端容器映象倉函式庫也相繼發布。

我們可以選擇以下雲端容器映象倉函式庫:

  • Docker Hub: 由 Docker Inc. 託管的映象倉函式庫解決方案。該映象倉函式庫還為一些流行的開源專案託管官方倉函式庫和安全驗證映象。
  • Quay: 由 CoreOS 公司建立的託管映象倉函式庫解決方案,現在是 Red Hat 的一部分。它提供私有和公共倉函式庫、用於安全目地的自動掃描、映象構建以及與流行的 Git 公共倉函式庫的整合。
  • Linux 發行版映象倉函式庫: 流行的 Linux 發行版通常根據社群,例如 Fedora Linux,或根據企業,例如 Red Hat Enterprise Linux (RHEL)。它們通常提供公共容器映象倉函式庫,儘管這些倉函式庫通常僅適用於已作為系統套件提供的專案或套件。這些映象倉函式庫不適用於終端使用者,它們由 Linux 發行版的維護者提供。
  • 公共雲映象倉函式庫: Amazon、Google、Microsoft 和其他公共雲供應商為其客戶提供私有容器映象倉函式庫。

Docker Hub 和 Quay.io 都是公共容器映象倉函式庫,我們可以在其中找到由任何人建立的容器映象。這些映象倉函式庫中充滿了有用的自定義映象,我們可以將它們用作快速輕鬆地測試容器映象的起點。

但玄貓必須提醒你,僅下載和執行容器映象並不總是最好的做法。我們可能會遇到非常舊與過時的軟體,這些軟體可能容易受到一些已知的公共漏洞的攻擊,或者更糟的是,我們可能會下載和執行一些可能危及我們整個基礎架構的惡意程式碼。

因此,Docker Hub 和 Quay.io 通常提供一些功能來強調這些映象的來源。

Docker Hub 映象倉函式庫服務:容器映象的集散地

正如我們之前介紹的,Docker Hub 是最著名的容器映象倉函式庫。它為社群和企業產品託管多個容器映象。

透過檢視容器映象的詳細資訊頁面,我們可以輕鬆發現有關該專案及其容器映象的所有必需資訊。