容器化應用程式開發流程中,映像檔的管理至關重要。容器登入檔作為集中儲存和分發容器映像的核心服務,其選型和應用技巧直接影響開發效率。本文除了介紹容器登入檔的基礎知識外,更著重於 Skopeo 這一容器映像檔管理利器的實務應用,讓讀者能快速掌握從本地構建到跨雲端平台佈署的完整流程。 探討正規表示式在儲存函式庫命名規則中的應用,以及 OCI 分發規範如何確保映像檔在不同平台間的可移植性。同時,比較雲端和本地佈署容器登入檔的優劣,並提供實際案例說明如何選擇適合自身需求的解決方案。
容器登入檔(Container Registry)詳解
容器登入檔是儲存和分發容器映像(Container Image)的集中式儲存函式庫。根據開放容器倡議(Open Container Initiative, OCI)的分發規範,容器映像被組織在一個由名稱標識的儲存函式庫中。儲存函式庫的名稱通常由使用者或組織名稱和容器映像名稱組成,例如 myorganization/mycontainerimage,並且必須符合特定的正規表示式檢查:
[a-z0-9]+([._-][a-z0-9]+)*(/[a-z0-9]+([._-][a-z0-9]+)*)*
正規表示式(Regex)簡介
正規表示式是一種由字元序列定義的搜尋模式,能夠讓使用者詳細定義要在文字檔案中查詢的目標關鍵字、行或多行。
容器登入檔的運作
推播容器映像
推播容器映像到容器登入檔的過程由所使用的容器工具處理,該工具遵循OCI分發規範。在此過程中,二進位制內容(blobs)首先被上傳,通常最後上傳的是描述映像組態的資訊清單(manifest)。雖然規範沒有嚴格規定順序,但登入檔可能會拒絕參照未知blobs的資訊清單。
使用容器管理工具推播容器映像到登入檔時,必須指定儲存函式庫名稱和要上傳的容器映像標籤。
標籤管理
容器映像由名稱和標籤識別,這使得我們可以在系統的本地快取或容器登入檔上儲存不同版本的容器映像。容器登入檔應支援內容發現功能,向客戶端提供容器映像標籤列表,以便選擇正確的映像進行提取和執行。
提取容器映像
提取容器映像的過程中,客戶端首先請求資訊清單,以瞭解需要提取哪些二進位制內容來取得最終的容器映像。這個順序是嚴格的,因為如果不提取和解析容器映像的資訊清單,客戶端無法知道需要從登入檔請求哪些二進位制資料。
使用容器管理工具從登入檔提取容器映像時,必須指定儲存函式庫名稱和要下載的容器映像標籤。
身份驗證管理
上述操作可能需要身份驗證。許多公共容器登入檔允許匿名提取和內容發現,但推播容器映像通常需要有效的身份驗證。根據所選擇的容器登入檔,可能會提供基本或進階的身份驗證功能,以儲存令牌並在需要時使用。
雲端和本地佈署的容器登入檔
OCI的分發規範促進了多種容器登入檔的發展,除了最初的Docker Registry及其線上服務Docker Hub之外。這些登入檔大致可以分為兩類別:
- 雲端容器登入檔
- 本地佈署容器登入檔
本地佈署容器登入檔
本地佈署容器登入檔常用於為企業建立私有儲存函式庫,主要使用案例包括:
- 在私有或隔離網路中分發映像
- 大規模佈署新容器映像到多台機器
- 將敏感資料儲存在自己的資料中心
- 利用內部網路提高提取和推播映像的速度
當然,執行本地佈署登入檔需要多種技能,以確保可用性、監控、日誌記錄和安全性。
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333
title 本地佈署容器登入檔
rectangle "提取請求" as node1
rectangle "傳回資訊清單" as node2
rectangle "提取 blobs" as node3
rectangle "傳回 blobs" as node4
node1 --> node2
node2 --> node3
node3 --> node4
@enduml
此圖示說明瞭客戶端與容器登入檔之間的互動過程,包括提取請求、傳回資訊清單以及提取和傳回二進位制內容。
雲端與本地容器登入服務
在容器化技術的應用中,容器登入服務扮演著至關重要的角色。它們允許開發者儲存、管理和分發容器映像。本章節將探討不同型別的容器登入服務,包括本地佈署和雲端服務,並分析它們的特點和優勢。
本地佈署容器登入服務
對於需要高度控制和自定義的企業來說,本地佈署的容器登入服務是一個理想的選擇。以下是一些流行的本地佈署容器登入服務:
- Docker Registry:Docker官方提供的容器登入服務,目前版本為2。它提供了基本的映像儲存和管理功能。
- Harbor:由VMware開源的專案,提供高用性、映像稽核和與身份驗證系統的整合。
- GitLab Container Registry:與GitLab產品緊密整合,提供簡單的設定和管理,但依賴於主專案。
- JFrog Artifactory:不僅管理容器映像,還提供對任何工件的管理。
- Quay:Red Hat產品Quay的開源版本,提供完整的Web UI、映像漏洞掃描服務、資料儲存和保護。
選擇合適的本地佈署容器登入服務時,應考慮企業的具體需求和支援計劃。許多產品提供支援計劃或企業版(需要許可證),可以在災難發生時提供幫助。
雲端容器登入服務
雲端容器登入服務提供了快速啟動和管理容器映像的方法,無需擔心基礎設施的管理。以下是一些流行的雲端容器登入服務:
Docker Hub 雲端登入檔
Docker Hub是由Docker Inc.提供的託管登入檔解決方案。它託管官方倉函式庫和一些流行開源專案的安全驗證映像。
Docker Hub提供免費和付費計劃:
- 匿名存取:每6小時內只能提取100次映像。
- 註冊使用者帳戶(免費層):每6小時內可提取200次映像,並提供無限制的公共倉函式庫。但免費層不提供自動構建或安全掃描功能。
- 專業版、團隊版和企業版:提供每天數千次的映像提取、自動構建、安全掃描、根據角色的存取控制(RBAC)等功能。
Red Hat Quay 雲端登入檔
Quay雲端登入檔是Red Hat提供的SaaS(軟體即服務)版本的本地登入檔。
Quay雲端登入檔同樣提供付費計劃以解鎖額外功能。其免費層包含許多實用功能:
- 從Dockerfile構建映像,可手動上傳或連結至GitHub/Bitbucket/GitLab等Git儲存函式庫。
- 對推播至登入檔的映像進行安全掃描。
- 使用/稽核日誌。
- 機器人使用者帳戶/令牌,用於與外部軟體整合。
- 無映像提取限制。
付費計劃則提供私有倉函式庫和根據團隊的許可權管理。
例項:使用Quay雲端登入檔
以下是一個使用Quay雲端登入檔建立公共倉函式庫並連結至GitHub倉函式庫的示例:
- 首先,需要在Quay入口網站註冊或登入。然後,點選右上角的「+ Create New Repository」按鈕。
- 在建立新倉函式庫頁面,輸入倉函式庫名稱、描述,選擇公開或私有(免費帳戶只能選擇公開),並選擇初始化倉函式庫的方式。
- 授權Quay存取GitHub帳戶,並選擇要連結的GitHub倉函式庫。
- 組態構建觸發器,例如,每當Git儲存函式庫有推播時觸發新的構建。
- 建立完成後,可在倉函式庫頁面檢視構建歷史和詳情。
管理容器映像檔與Skopeo
在前面的章節中,我們已經學習了許多容器登入機制的概念,包括私有和公有登入機制之間的差異、它們對OCI映像檔規格的遵循性,以及如何使用Podman和Buildah來建置和執行容器。然而,有時候我們需要執行簡單的映像檔操作任務,例如將映像檔從一個登入機制移動到另一個映象站點、在不需要本地提取映像檔的情況下檢查遠端映像檔,或者甚至是簽署映像檔。
Skopeo簡介
由Podman和Buildah背後的社群開發的第三個優秀工具是Skopeo(https://github.com/containers/skopeo),它正好實作了前面所描述的功能。Skopeo被設計為DevOps團隊的映像檔和登入機制操作工具,它不打算執行容器(Podman的主要角色)或建置OCI映像檔(Buildah的主要角色)。相反,它提供了一個極簡且直接的命令列介面,具有基本的映像檔操作命令,這些命令在不同的情境中將被證明是非常有用的。
安裝Skopeo
Skopeo是一個Go二進位工具,已經被封裝並可供許多發行版使用。它也可以直接從原始碼建置和安裝。本文提供了在主要發行版上安裝Skopeo的非詳盡範例列表。為了清晰起見,值得重申的是,本文的實驗室環境都是根據Fedora 34。
各發行版安裝指令
- Fedora:
$ sudo dnf -y install skopeo - Debian:
$ sudo apt-get update和$ sudo apt-get -y install skopeo - RHEL 8/9、CentOS 8和CentOS Stream 8/9:
$ sudo dnf -y install skopeo - RHEL 7和CentOS 7:
$ sudo yum -y install skopeo - Ubuntu:
$ sudo apt-get -y update和$ sudo apt-get -y install skopeo - Arch Linux:
$ sudo pacman –S skopeo - openSUSE:
$ sudo zypper install skopeo - macOS:
$ brew install skopeo
驗證安裝
要驗證安裝是否正確,只需執行帶有-h或--help選項的skopeo命令,以檢視所有可用的命令,如下例所示:
$ skopeo -h
Skopeo命令
預期的輸出將顯示實用程式選項,以及所有可用的命令,每個命令都有對命令範圍的描述。完整的命令列表如下:
copy:使用不同的傳輸方式(例如Docker Registry、本地目錄、OCI、tarball、OSTree和OCI存檔)在不同位置之間複製映像檔。delete:從目標位置刪除映像檔。help:列印幫助命令。inspect:檢查目標位置中映像檔的元資料、標籤和組態。list-tags:顯示特定映像檔儲存函式庫中可用的標籤。login:向遠端登入機制進行身份驗證。logout:從遠端登入機制登出。manifest-digest:為檔案產生manifest摘要。standalone-sign:使用本地檔案釋出和簽署映像檔的偵錯工具。standalone-verify:使用本地檔案驗證映像檔簽名。sync:在不同位置之間同步一個或多個映像檔。
複製映像檔
Podman(就像Docker一樣)不僅可以用於執行容器,還可以用於本地提取映像檔並將其推播到其他位置。然而,其中一個主要的問題是需要執行兩個命令,一個用於提取,另一個用於推播,同時本地映像檔儲存空間仍然被提取的映像檔佔用。因此,使用者應該定期清理本地儲存空間。
Skopeo提供了一種更聰明、更簡單的方法來實作這一目標,使用skopeo copy命令。該命令實作了以下語法:
skopeo copy [命令選項] 來源映像檔 目標映像檔
內容解密:
skopeo copy命令:此命令用於在不同位置之間複製映像檔。它支援多種傳輸方式,例如Docker Registry、本地目錄、OCI、tarball、OSTree和OCI存檔,使得跨不同環境管理映像檔變得更加靈活。[命令選項]:使用者可以根據需要新增額外的選項來修改命令的行為,例如指定認證資訊或調整複製過程中的其他引數。來源映像檔:指定要複製的來源映像檔的位置。這可以是遠端登入機制中的映像檔,也可以是本地儲存的映像檔。目標映像檔:指定複製操作的目的地,即要將來源映像檔複製到的位置。同樣,這可以是遠端登入機制或本地目錄。
透過使用skopeo copy命令,使用者可以高效地在不同位置之間遷移或備份容器映像檔,而無需先將映像檔提取到本地再推播到目標位置,從而簡化了管理流程並節省了本地儲存空間。
使用 Skopeo 管理容器映像檔
Skopeo 是一款強大的容器映像檔管理工具,能夠實作容器映像檔在不同儲存位置之間的複製、檢查和刪除等操作。在本文中,我們將探討 Skopeo 的基本用法和實際應用場景。
Skopeo 的傳輸方式
Skopeo 支援多種傳輸方式,包括:
docker://docker-reference:用於儲存在實作 Docker Registry HTTP API V2 的登入檔中。containers-storage:[[storage-specifier]]{image-id|docker-reference[@image-id]}:用於本地容器儲存中的映像檔。dir:path:用於儲存在本地目錄中的映像檔。docker-archive:path[:{docker-reference|@source-index}]:用於 Docker 歸檔檔案。docker-daemon:docker-reference|algo:digest:用於 Docker 守護程式內部儲存中的映像檔。oci:path[:tag]:用於符合 OCI 佈局規範的本地映像檔。oci-archive:path[:tag]:用於符合 OCI 佈局規範的 tarball 格式映像檔。ostree:docker-reference[@/absolute/repo/path]:用於儲存在本地 ostree 倉函式庫中的映像檔。
將映像檔推播到容器登入檔
接下來,我們將介紹 Skopeo 在實際場景中的使用範例。首先,我們來看如何將映像檔從一個遠端登入檔複製到另一個遠端登入檔:
$ skopeo copy \
docker://docker.io/library/nginx:latest \
docker://private-registry.example.com/lab/nginx:latest
上述命令未處理登入檔的身份驗證,這通常是推播映像檔到遠端倉函式庫的要求。下面是一個變體範例,其中來源和目標登入檔都使用身份驗證選項進行裝飾:
$ skopeo copy \
--src-creds USERNAME:PASSWORD \
--dest-creds USERNAME:PASSWORD \
docker://registry1.example.com/mirror/nginx:latest \
docker://registry2.example.com/lab/nginx:latest
內容解密:
--src-creds和--dest-creds引數用於提供來源和目標登入檔的身份驗證憑證。docker://registry1.example.com/mirror/nginx:latest是來源映像檔的參考。docker://registry2.example.com/lab/nginx:latest是目標映像檔的參考。
為了避免將使用者名稱和密碼以明文形式傳遞,我們可以使用 skopeo login 命令在執行 skopeo copy 之前對登入檔進行身份驗證:
$ skopeo login private-registry.example.com
$ skopeo copy \
docker://docker.io/library/nginx:latest \
docker://private-registry.example.com/lab/nginx:latest
Skopeo 將身份驗證令牌儲存在專用的身份驗證檔案中,以便稍後重複使用。預設情況下,Skopeo 檢視 ${XDG_RUNTIME_DIR}/containers/auth.json 路徑,但我們可以提供自定義的身份驗證檔案位置。
自定義身份驗證檔案位置
$ skopeo copy \
--authfile ${HOME}/.docker/config.json \
docker://docker.io/library/nginx:latest \
docker://private-registry.example.com/lab/nginx:latest
內容解密:
--authfile引數指定自定義的身份驗證檔案位置。${HOME}/.docker/config.json是 Docker 客戶端的身份驗證檔案位置。
跳過 TLS 驗證
在某些情況下,私有登入檔可能沒有由已知認證機構(CA)簽署的憑證,或者沒有使用 HTTPS 通訊。為了跳過 TLS 驗證,我們可以使用 --dest-tls-verify 和 --src-tls-verify 選項:
$ skopeo copy \
--authfile ${HOME}/.docker/config.json \
--dest-tls-verify false \
docker://docker.io/library/nginx:latest \
docker://private-registry.example.com/lab/nginx:latest
內容解密:
--dest-tls-verify false跳過目標登入檔的 TLS 驗證。
將本地映像檔推播到公共登入檔
Skopeo 也可用於將本地映像檔推播到公共登入檔:
$ skopeo copy \
--authfile ${HOME}/.docker/config.json \
containers-storage:quay.io/<namespace>/python_httpd \
docker://quay.io/<namespace>/python_httpd:latest
內容解密:
containers-storage:指定來源映像檔儲存在本地容器儲存中。quay.io/<namespace>/python_httpd是本地映像檔的參考。docker://quay.io/<namespace>/python_httpd:latest是目標映像檔的參考。
總之,Skopeo 是一款功能強大的容器映像檔管理工具,能夠滿足各種複雜的容器管理需求。透過本文的介紹,讀者可以更好地理解 Skopeo 的基本用法和實際應用場景。