探討容器技術的系統管理階層面,包含如何有效管理及檢查執行中的容器,並運用 Podman 將容器分組至 Pod 中。首先說明如何提取和檢查映像,確保容器快速啟動。接著,示範如何設定容器的時區、DNS、主機對映和 HTTP 代理等環境變數,以組態容器行為。最後,探討容器登入檔的互動,涵蓋映像搜尋、標籤管理以及安全性注意事項,例如官方映像檔的選擇和映像檔簽章驗證。

管理執行中的容器

在上一章中,我們學習瞭如何設定環境以使用Podman執行容器,包括主要發行版的二進位制安裝、系統設定檔,以及第一個範例容器的執行以驗證我們的設定是否正確。本章將提供更詳細的容器執行概覽,包括如何管理及檢查執行中的容器,以及如何將容器分組到pod中。本章對於獲得正確的知識和專業技能,以作為容器技術的系統管理員至關重要。

在本章中,我們將涵蓋以下主要主題:

  • 管理容器映像
  • 對執行中的容器進行操作
  • 檢查容器資訊
  • 從容器中擷取日誌
  • 在執行中的容器中執行程式
  • 在pod中執行容器

技術需求

在繼續本章及其練習之前,需要一台具有工作中的Podman例項的機器。如第三章「執行第一個容器」所述,本文中的所有範例都在Fedora 34系統上執行,但可以在您選擇的作業系統(OS)上重現。最後,對前幾章涵蓋的主題有良好的理解有助於輕鬆掌握有關開放容器倡議(OCI)映像和容器執行的概念。

管理容器映像

在本文中,我們將瞭解如何在本地系統中找到並提取(下載)映像,以及檢查其內容。當第一次建立並執行容器時,Podman會自動提取相關的映像。然而,能夠提前提取和檢查映像提供了一些寶貴的優勢,首先是當映像已經在機器的本地儲存中可用時,容器的執行速度更快。

正如我們在前幾章中所說,容器是一種將程式隔離在沙箱環境中,具有獨立的名稱空間和資源分配的方法。掛載在容器中的檔案系統由第2章「比較Podman和Docker」中描述的OCI映像提供。

OCI映像由專門的服務稱為容器登入檔儲存和分發。容器登入檔儲存映像和後設資料,並公開簡單的表示狀態轉移(REST)應用程式介面(API)服務,以讓使用者能夠推播和提取映像。

本質上有兩種型別的登入檔:公共和私有。公共登入檔可作為公共服務(具有或不具有身份驗證)。主要公共登入檔,如docker.io、gcr.io或quay.io,也被用作較大的開源專案的映像儲存函式庫。

私有登入檔在組織內佈署和管理,可以更專注於安全性和內容過濾。目前,主要的容器登入檔專案已在雲原生運算基金會(CNCF)下畢業(https://landscape.cncf.io/card-mode?category=container-registry&grouping=category),並提供先進的企業功能來管理多租戶、身份驗證和根據角色的存取控制(RBAC),以及映像漏洞掃描和映像簽名。

# 提取映像
$ podman pull fedora

# 檢查映像
$ podman inspect fedora

內容解密:

  1. podman pull fedora:此命令用於從預設的容器登入檔(如Docker Hub)提取名為fedora的映像到本地系統。
  2. podman inspect fedora:此命令用於檢查本地fedora映像的詳細資訊,包括其層、組態和後設資料。

設定與環境變數

Podman的run命令有大量的選項,可用於在執行時組態容器的行為——在撰寫本文時,大約有120個選項。

例如,我們有一個選項可以更改執行中容器的時區;即--tz

$ date
Tue Sep 14 17:44:59 CEST 2021
$ podman run --tz=Asia/Shanghai fedora date
Tue Sep 14 23:45:11 CST 2021

內容解密:

  1. date:顯示主機上的當前日期和時間。
  2. podman run --tz=Asia/Shanghai fedora date:使用--tz選項將容器的時區設定為亞洲/上海,並執行date命令顯示該時區的當前日期和時間。

我們可以使用--dns選項更改新容器的DNS:

$ podman run --dns=1.1.1.1 fedora cat /etc/resolv.conf
search lan
nameserver 1.1.1.1

內容解密:

  1. podman run --dns=1.1.1.1 fedora cat /etc/resolv.conf:使用--dns選項將容器的DNS伺服器設定為1.1.1.1,並顯示/etc/resolv.conf檔案的內容以確認DNS設定。

我們還可以向/etc/hosts檔案新增主機以覆寫本地內部地址:

$ podman run --add-host=my.server.local:192.168.1.10 fedora cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.10 my.server.local

內容解密:

  1. podman run --add-host=my.server.local:192.168.1.10 fedora cat /etc/hosts:使用--add-host選項將主機my.server.local對映到IP位址192.168.1.10,並顯示/etc/hosts檔案的內容以確認主機對映。

我們甚至可以新增HTTP代理,以便我們的容器使用代理進行HTTP請求。預設的Podman行為是從主機傳遞許多環境變數,其中一些是http_proxyhttps_proxyftp_proxyno_proxy

另一方面,我們還可以定義自定義環境變數,以便透過--env選項將其傳遞給我們的容器:

$ podman run --env MYENV=podman fedora printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
TERM=xterm
container=oci
DISTTAG=f34container
FGC=f34
MYENV=podman
HOME=/root
HOSTNAME=93f2541180d2

內容解密:

  1. podman run --env MYENV=podman fedora printenv:使用--env選項設定環境變數MYENVpodman,並在容器中執行printenv命令以顯示所有環境變數。

將環境變數新增到我們的容器中並使用它們是一種最佳實踐,用於將組態引數傳遞給應用程式並從作業系統主機影響服務的行為。正如我們在第1章“容器技術簡介”中所看到的那樣,預設情況下,容器是不可變且短暫的。因此,我們應該利用環境變數,就像在前面的例子中一樣,在執行時組態容器。

管理容器映像檔

在第9章「將映像檔推播至容器登入檔」中,我們將提供更多與容器登入檔互動的詳細資訊和範例。

大多數的公有和私有容器登入檔都支援 Docker Registry HTTP API V2(https://docs.docker.com/registry/spec/api/)。由於它是一個根據超文字傳輸協定(HTTP)的 REST API,使用者可以使用簡單的 curl 命令或設計自己的自定義客戶端與登入檔互動。

Podman 提供了一個命令列介面(CLI)來與公有和私有容器登入檔互動、管理需要驗證的登入檔登入、透過傳遞字串模式搜尋映像檔儲存函式庫,以及處理本地快取的映像檔。

搜尋映像檔

我們要學習的第一個命令是用於在多個登入檔中搜尋映像檔的 podman search 命令。以下範例展示瞭如何搜尋 nginx 映像檔:

# podman search nginx

上述命令將產生包含許多來自所有白名單登入檔(請參閱第3章「執行第一個容器」的「準備環境 | 自定義容器登入檔搜尋清單」一節)的條目的輸出。輸出將會有些混亂,包含許多來自未知和不可靠的儲存函式庫的條目。

通常,podman search 命令接受以下模式:

podman search [選項] 搜尋字串

這裡,搜尋字串是搜尋引數。搜尋結果輸出的欄位包括:

  • INDEX:映像檔所在的登入檔索引
  • NAME:映像檔的全名,包括登入檔名稱和相關名稱空間
  • DESCRIPTION:映像檔角色的簡短描述
  • STARS:使用者給予的星級評分(僅在支援此功能的登入檔上可用,例如 docker.io)
  • OFFICIAL:布林值,用於指定映像檔是否為官方映像檔
  • AUTOMATED:如果映像檔是自動建立的,則此欄位設為 OK

重點提示

絕不信任未知的儲存函式庫,總是優先使用官方映像檔。當從一個小眾專案提取映像檔時,請嘗試瞭解映像檔的內容後再執行它。請記住,攻擊者可能會隱藏惡意程式碼,這些程式碼可能會在容器內執行。

即使是可信的儲存函式庫,在某些情況下也可能被破壞。在企業場景中,請實作映像檔簽章驗證,以避免映像檔被竄改。

可以對搜尋結果套用篩選器以最佳化輸出。例如,要最佳化搜尋結果並僅列印官方映像檔,可以新增以下篩選選項:

# podman search nginx --filter=is-official

此命令將列印一行指向 docker.io/library/nginx:latest 的結果。

這個官方映像檔由 nginx 社群維護,可以更放心地使用。

使用者可以自定義命令的輸出格式。以下範例展示瞭如何僅列印映像檔登入檔和映像檔名稱:

# podman search fedora \
--filter is-official \
--format "table {{.Index}} {{.Name}}"

輸出結果如下:

INDEX       NAME
docker.io   docker.io/library/fedora

輸出映像檔名稱具有標準的命名模式,值得詳細描述。標準格式如下所示:

<登入檔>[:<連線埠>]/[<名稱空間>/]<名稱>:<標籤>

讓我們詳細描述上述欄位:

  • 登入檔:包含儲存映像檔的登入檔。在我們的範例中,nginx 映像檔儲存在 docker.io 公有登入檔中。可以選擇性地為登入檔指定自定義連線埠號。預設情況下,登入檔公開 5000 TCP 連線埠。
  • 名稱空間:此欄位提供了一個階層結構,有助於區分映像檔的上下文和提供者。名稱空間可以代表父組織、儲存函式庫所有者的使用者名稱或映像檔角色。
  • 名稱:包含儲存所有標籤的私有/公有映像檔儲存函式庫的名稱。通常被稱為應用程式名稱(例如 nginx)。
  • 標籤:儲存在登入檔中的每個映像檔都有一個唯一的標籤,對應到一個 SHA256 摘要值。一般的 :latest 標籤可以在映像檔名稱中省略。

一般的搜尋預設會隱藏映像檔標籤。要顯示特定儲存函式庫的所有可用標籤,可以對給定的映像檔名稱使用 --list-tags 選項,如下所示:

# podman search quay.io/prometheus/prometheus --list-tags

輸出結果如下:

NAME                       TAG
quay.io/prometheus/prometheus   v2.5.0
quay.io/prometheus/prometheus   v2.6.0-rc.0
quay.io/prometheus/prometheus   v2.6.0-rc.1
quay.io/prometheus/prometheus   v2.6.0
quay.io/prometheus/prometheus   v2.6.1
quay.io/prometheus/prometheus   v2.7.0-rc.0
quay.io/prometheus/prometheus   v2.7.0-rc.1
quay.io/prometheus/prometheus   v2.7.0-rc.2
quay.io/prometheus/prometheus   v2.7.0
quay.io/prometheus/prometheus   v2.7.1
[...省略輸出...]

此選項對於在登入檔中尋找特定的映像檔標籤非常有用,通常與應用程式/執行環境的發布版本相關聯。

重點提示

使用 :latest 標籤可能會導致映像檔版本控制問題,因為它不是一個描述性的標籤。通常預期它指向最新的映像檔版本,但事實並非總是如此,因為未標記的映像檔可能會保留 latest 標籤,而最新的推播映像檔可能具有不同的標籤。這取決於儲存函式庫維護者是否正確地套用標籤。如果儲存函式庫使用語義版本控制,最佳選擇是提取最新的版本標籤。