容器化技術已成為現代軟體開發和佈署的根本,而 Podman 作為新一代容器引擎,以其輕量級、無守護行程的特性,以及與 Kubernetes 的良好相容性,正受到越來越多開發者的青睞。本文將引領你進入 Podman 的世界,從基礎安裝到進階組態,逐步解鎖容器技術的奧秘。

在 Linux 系統上安裝 Podman 非常簡潔,例如在 Fedora 上,只需執行 dnf install -y podman 即可完成安裝。而對於 macOS 和 Windows 系統,則可以透過遠端客戶端或 WSL 2.0 來使用 Podman。安裝完成後,我們需要了解 Podman 的核心組態檔案,例如 containers.confstorage.conf,它們決定了容器的執行方式和儲存方式。此外,mounts.conf 檔案允許我們設定容器的自動掛載點,而 seccomp.jsonpolicy.json 則分別控制容器的安全性策略和映象驗證策略。

Podman 的一大優勢在於其無守護行程的架構,這意味著我們不需要像 Docker 那樣啟動一個後台服務。但有時為了與 Libpod API 互動,我們需要啟動 Podman 的 API 服務。這可以透過 UNIX socket 或 TCP socket 來實作。為了提高效率和安全性,建議使用 systemd socket 來管理 Podman API 服務。

啟動容器後,我們可以使用 podman run 指令的 -i-t 選項進入容器的互動式 Shell,執行各種指令,例如安裝軟體、檢查組態等。需要注意的是,在互動式 Shell 中所做的變更,在容器停止後會遺失。如果希望容器在背景執行,可以使用 -d 選項。

容器的網路預設與主機隔離,如果需要從外部存取容器內部的服務,可以使用 -p 選項進行埠口發布。此外,Podman 還提供了 --tz--dns--add-host--env 等選項,讓我們可以設定容器的時區、DNS 伺服器、主機名稱解析和環境變數。

在容器管理方面,Podman 提供了一系列指令,例如 podman pspodman logspodman exec 等,用於檢視容器狀態、取得容器日誌、在容器中執行指令等。此外,Podman 還支援 Pod,可以將多個容器組合成一個邏輯單元,方便管理和佈署。

容器啟航:玄貓帶你輕鬆玩轉 Podman

技術先決條件

若您具備 Linux 作業系統管理經驗,將有助於理解本章節的核心概念。我們將逐步引導您在各種 Linux 發行版上安裝新軟體。如果您有 Linux 系統管理員的經驗,在安裝過程中遇到問題時,將能更快地排除障礙。此外,先前章節中說明的一些理論概念也能幫助您理解本章節所描述的步驟。

作業系統與安裝方式的選擇:玄貓的建議

Podman 支援多種發行版和作業系統。它非常容易安裝,現在各種發行版都提供由它們自己維護的套件,可以使用它們特定的套件管理器進行安裝。在本文中,我們將介紹最常見的 GNU/Linux 發行版,以及 macOS 和 Windows 上的不同安裝步驟,儘管本章的重點是根據 Linux 的環境。作為一個額外的主題,我們還將學習如何直接從原始碼構建 Podman。

Linux 發行版還是其他作業系統?玄貓的考量

GNU/Linux 作業系統的不同發行版之間的選擇,取決於使用者的偏好和需求,這些偏好和需求通常受到本章範圍之外的幾個因素的影響。許多高階使用者今天選擇 Linux 發行版作為他們的主要作業系統。然而,有很大一部分人,特別是在開發人員中,堅持使用 macOS 作為他們的標準作業系統。Microsoft Windows 仍然在桌上型工作站和筆記型電腦上保持最大的市場佔有率。

今天,我們有一個龐大的 Linux 發行版生態系統,它從一個較小的核心、歷史發行版子集演變而來,例如 Debian、Fedora、Red Hat Enterprise Linux、Gentoo、Arch 和 openSUSE。DistroWatch(https://distrowatch.com)等專業網站會追蹤 Linux 和根據 BSD 的發行版的許多版本。

深入探索 Linux 發行版的差異:玄貓的分析

儘管執行的是 Linux 核心,但各種發行版對於使用者空間行為有不同的架構方法,例如檔案系統結構、函式庫或用於交付軟體版本的封裝系統。另一個顯著的差異與安全性和強制存取控制子系統有關:例如,Fedora、CentOS、Red Hat Enterprise Linux 以及所有衍生產品都依賴 SELinux 作為它們的強制存取控制子系統。另一方面,Debian、Ubuntu 及其衍生產品根據一個類別似的解決方案,稱為 AppArmor。Podman 與 SELinux 和 AppArmor 互動以提供更好的容器隔離,但底層介面是不同的。

重要提示

本章的所有範例和原始碼都已使用 Fedora Workstation 34 作為參考作業系統編寫和測試。那些想要在他們的實驗室中重現盡可能接近本章的環境的人有不同的選擇:

  • 使用 Fedora 34 Vagrant Box(https://app.vagrantup.com/fedora/boxes/34-cloud-base)。Vagrant 是 Hashicorp 開發的一種軟體解決方案,用於建立快速、輕量級的 VM,特別適合開發使用。有關 Vagrant 及其如何在您選擇的作業系統上使用的更多詳細資訊,請參閱 https://www.vagrantup.com/
  • 直接下載雲端映像(https://alt.fedoraproject.org/cloud/)並在公共/私有雲上建立執行個體,或者只是將其佈署在您選擇的 Hypervisor 上。
  • 手動安裝 Fedora Workstation。在這種情況下,官方安裝(https://docs.fedoraproject.org/en-US/fedora/f34/install-guide/)提供了有關佈署作業系統的詳細說明。

在公共雲上執行執行個體是無法在本機執行虛擬機器的使用者的最佳選擇。Amazon Web Services、Google Cloud Platform、Microsoft Azure 和 DigitalOcean 等供應商也提供隨時可用的根據 Fedora 的雲端執行個體,較小尺寸的每月價格較低。價格可能隨時間和層級而變化,追蹤它們超出了本章的範圍。幾乎所有供應商都提供用於學習或基本使用的免費方案,以及非常低價格的小型/微型層級。

容器與作業系統:玄貓的深度解析

容器是根據 Linux 的,不同的容器引擎和執行階段與 Linux 核心和函式庫互動以進行操作。Windows 最近引入了對原生容器的支援,其隔離方法非常接近先前描述的 Linux 名稱空間概念。但是,只有根據 Windows 的映像才能原生執行,並且並非所有容器引擎都支援原生執行。

相同的考量對於 macOS 也是有效的:它的架構不是根據 Linux,而是根據一個稱為 XNU 的混合 Mach/BSD 核心。因此,它不提供原生執行容器所需的 Linux 核心功能。對於 Windows 和 macOS,都需要一個抽象 Linux 機器的虛擬化層來執行原生 Linux 容器。

Podman 為 Windows 和 macOS 提供遠端客戶端功能,讓使用者能夠連線到本機或遠端的 Linux 機器。Windows 使用者還可以受益於根據 Windows Subsystem for Linux (WSL) 2.0 的替代方法,這是一個相容性層,它執行一個輕量級的 VM 以公開 Linux 核心介面以及 Linux 使用者空間二進位檔案,這要歸功於 Hyper-V 虛擬化支援。以下章節將介紹在最流行的 Linux 發行版以及 macOS 和 Windows 上安裝 Podman 的必要步驟。

在 Fedora 上安裝 Podman:玄貓的實戰

Fedora 套件由其廣泛的社群維護,並使用 DNF 套件管理器進行管理。要安裝 Podman,請從終端執行以下命令:

# dnf install –y podman

此命令會安裝 Podman 並使用設定檔(在下一節中介紹)設定環境。它還會安裝 systemd 單元以提供額外的功能,例如 REST API 服務或容器自動更新。

在 CentOS 上安裝 Podman:玄貓的經驗分享

Podman 可以安裝在 CentOS 7、CentOS 8 和 CentOS Stream(https://www.centos.org/)上。在 CentOS 7 上安裝的使用者必須啟用 Extras 儲存函式庫,而在 CentOS 8 和 Stream 上安裝的使用者必須從已啟用的 AppStream 儲存函式庫中獲得 Podman 套件。要安裝 Podman,請從終端執行以下命令:

# yum install –y podman

在容器技術的世界中,Podman 以其輕量級和靈活性脫穎而出。無論您是 Linux 的資深使用者,還是剛開始接觸容器的新手,Podman 都能提供一個簡單易用的平台,讓您輕鬆構建、管理和執行容器。透過本章的,相信您已經掌握了在不同作業系統上安裝 Podman 的方法。現在,就讓我們一起啟航,探索容器技術的無限可能吧!

為何選擇適合的作業系統及安裝 Podman 的方式至關重要

在開始使用 Podman 之前,選擇正確的作業系統並瞭解如何在該系統上安裝 Podman 至關重要。不同的作業系統有不同的套件管理方式和依賴性,因此需要針對每個系統採用不同的安裝步驟。本文將引導你瞭解如何在各種主流作業系統上安裝 Podman,包括 Fedora、RHEL、Debian、Ubuntu、openSUSE、Gentoo、Arch Linux、Raspberry Pi OS、macOS 和 Windows。

在 Fedora 上安裝 Podman

在 Fedora 上安裝 Podman 非常簡單,只需執行以下指令:

# dnf -y install podman

這個指令會安裝 Podman 及其所有依賴項,包括設定檔和 systemd 單元檔案。

在 RHEL 上安裝 Podman

在 Red Hat Enterprise Linux (RHEL) 上安裝 Podman 的步驟取決於你使用的 RHEL 版本。

RHEL 7:

# subscription-manager repos \
--enable=rhel-7-server-extras-rpms
# yum -y install podman

RHEL 8:

# yum module enable -y container-tools:rhel8
# yum module install -y container-tools:rhel8

container-tools 模組除了 Podman 之外,還會安裝 Skopeo(用於管理 OCI 映像檔和登入檔)和 Buildah(用於從 Dockerfiles 和從頭開始建立自訂 OCI 映像檔的工具)。

在 Fedora CoreOS 和 Fedora Silverblue 上安裝 Podman?

實際上,Podman 已經預先安裝在這兩個發行版上,因為它是執行容器化工作負載的關鍵工具。Fedora CoreOS 和 Fedora Silverblue 是不可變的原子作業系統,分別用於伺服器/雲端和桌面環境。

在 Debian 上安裝 Podman

從 Debian 11 (Bullseye) 開始,Podman 套件已可用。若要在 Debian 系統上安裝 Podman,請執行以下指令:

# apt-get –y install podman

在 Ubuntu 上安裝 Podman

由於 Ubuntu 是根據 Debian 建構的,因此套件管理方式類別似。若要在 Ubuntu 20.10 或更新版本上安裝 Podman,請執行以下指令:

# apt-get -y update
# apt-get -y install podman

在 openSUSE 上安裝 Podman

openSUSE 提供 Tumbleweed(滾動發行版)和 Leap(LTS 發行版)兩種版本。Podman 在 openSUSE 儲存函式庫中可用,可以使用以下指令安裝:

# zypper install podman

在 Gentoo 上安裝 Podman

Gentoo 的特點是在目標機器上直接建置已安裝的套件,並提供額外的使用者自訂選項。若要在 Gentoo 上安裝 Podman,請執行以下指令:

# emerge app-emulation/podman

在 Arch Linux 上安裝 Podman

Arch Linux 是一個高度可自訂的滾動 Linux 發行版。若要在 Arch Linux 及其衍生發行版上安裝 Podman,請執行以下指令:

# pacman –S podman

預設情況下,在 Arch Linux 上安裝 Podman 不允許 rootless 容器。若要啟用它們,請按照 Arch wiki 上的官方說明進行操作。

在 Raspberry Pi OS 上安裝 Podman

Raspberry Pi OS 是根據 Debian 的作業系統,可在 Raspberry Pi 單板電腦上執行。Podman 的 arm64 建置版本可用,可以按照先前針對 Debian 發行版描述的相同步驟進行安裝。

在 macOS 上安裝 Podman

Apple 使用者可以將 Podman 安裝為遠端使用者端,並在遠端 Linux 機器上執行容器。Linux 機器也可以是在 macOS 上執行的 VM,並由 Podman 直接管理。

若要使用 Homebrew 套件管理器安裝 Podman,請執行以下指令:

$ brew install podman

若要初始化執行 Linux box 的 VM,請執行以下指令:

$ podman machine init
$ podman machine start

在 Windows 上安裝 Podman

若要將 Podman 作為遠端使用者端執行,只需從 GitHub releases 頁面下載並安裝最新版本。解壓縮封存檔到合適的位置,並編輯 TOML 編碼的 containers.conf 檔案,以設定 Linux 機器的遠端 URI 或傳遞其他選項。

以下程式碼片段顯示了一個範例設定:

[engine]
remote_uri= " ssh://root@10.10.1.9:22/run/podman/podman.sock"

若要在 WSL 2.0 上執行 Podman,使用者必須先從 Microsoft Store 在其 Windows 主機上安裝 Linux 發行版。

玄貓(BlackCat)觀點:作業系統選擇與 Podman 安裝的實戰考量

從我多年在不同環境中佈署容器的經驗來看,選擇正確的作業系統和安裝方法對於 Podman 的順利執行至關重要。例如,在 RHEL 環境中,使用 container-tools 模組不僅安裝了 Podman,還附帶了 Skopeo 和 Buildah,這對於映像檔管理和自訂建置非常有用。

此外,對於 macOS 和 Windows 使用者,將 Podman 作為遠端使用者端執行是一種常見的做法。這允許使用者在熟悉的環境中開發和管理容器,同時利用 Linux 的底層功能。

總之,無論你選擇哪個作業系統,請務必仔細閱讀官方檔案並按照正確的安裝步驟進行操作。這將確保你能夠順利地開始使用 Podman,並充分利用其強大的容器管理功能。

玄貓解說:Podman 安裝與環境組態的深度

身為一個熱愛容器技術的開發者,玄貓今天要帶領大家深入瞭解 Podman 的安裝與環境組態。Podman 作為 Docker 的強大替代方案,近年來在容器領域備受矚目。它不僅具備 Docker 的大部分功能,更在安全性與無 Root 執行方面有著獨特的優勢。無論您是容器新手還是 Docker 老手,相信本文都能幫助您更好地掌握 Podman。

Ubuntu 20.10 安裝實戰

在 Ubuntu 20.10 上安裝 Podman,玄貓推薦使用以下步驟:

# apt-get –y install podman
# mkdir -p /etc/containers
# echo -e "[registries.search]\nregistries = \
[‘docker.io’, ‘quay.io’]" | tee \ /etc/containers/registries.conf

內容解密

  • apt-get –y install podman: 使用 apt-get 安裝 Podman,-y 引數表示自動確認安裝。
  • mkdir -p /etc/containers: 建立 /etc/containers 目錄,用於存放 Podman 的設定檔。
  • echo -e "[registries.search]\nregistries = \ [‘docker.io’, ‘quay.io’]" | tee /etc/containers/registries.conf: 設定 Podman 的 registry 搜尋列表,這裡指定了 docker.ioquay.io 作為預設的 registry。

完成安裝後,為了更好地適應 WSL 2.0 環境,玄貓建議進行以下調整:

# cp /usr/share/containers/libpod.conf /etc/containers
# sed –i ‘s/ cgroup_manager = "systemd"/ cgroup_manager = "cgroupfs"/g’ /etc/containers/libpod.conf
# sed –i ‘s/ events_logger = "journald"/ events_logger = "file"/g’ /etc/containers/libpod.conf

內容解密

  • cp /usr/share/containers/libpod.conf /etc/containers: 複製預設的 libpod.conf/etc/containers 目錄。
  • sed –i ‘s/ cgroup_manager = "systemd"/ cgroup_manager = "cgroupfs"/g’ /etc/containers/libpod.conf: 將 cgroup_manager 設定為 cgroupfs,以便在 WSL 2.0 中成功執行 rootful 容器。
  • sed –i ‘s/ events_logger = "journald"/ events_logger = "file"/g’ /etc/containers/libpod.conf: 將 events_logger 設定為 file,以便在 WSL 2.0 中記錄容器事件。

從原始碼構建 Podman

從原始碼構建應用程式有很多好處:使用者可以在構建之前檢查和自定義程式碼,為不同的架構進行交叉編譯,或者有選擇地僅構建二進位檔案的子集。這也是一個很好的學習機會,可以深入瞭解專案的結構並理解其演變。最後但並非最不重要的一點是,從原始碼構建可以讓使用者獲得具有很酷的新功能的最新開發版本,包括錯誤。

以下步驟假定構建機器是一個 Fedora 發行版。首先,我們必須安裝編譯 Podman 所需的必要依賴項:

# dnf install -y \
btrfs-progs-devel \
conmon \
containernetworking-plugins \
containers-common \
crun \
device-mapper-devel \
git \
glib2-devel \
glibc-devel \
glibc-static \
go \
golang-github-cpuguy83-md2man \
gpgme-devel \
iptables \
libassuan-devel \
libgpg-error-devel \
libseccomp-devel \
libselinux-devel \
make \
pkgconfig

內容解密

  • dnf install -y ...: 使用 dnf 安裝 Podman 編譯所需的依賴套件,-y 引數表示自動確認安裝。

此命令將需要一段時間才能安裝所有套件及其級聯依賴項。

安裝完成後,選擇一個工作目錄並使用 git 命令克隆 Podman 儲存函式庫:

$ git clone https://github.com/containers/podman.git

內容解密

  • git clone https://github.com/containers/podman.git: 從 GitHub 克隆 Podman 原始碼。

此命令將在工作目錄中克隆整個儲存函式庫。

切換到專案目錄並啟動構建:

$ cd podman
$ make package-install

內容解密

  • cd podman: 切換到 Podman 原始碼目錄。
  • make package-install: 編譯原始碼,構建 RPM 檔案,並在本地安裝套件。

make package-install 命令編譯原始碼,構建 RPM 檔案,並在本地安裝套件。請記住,RPM 格式與 Fedora/CentOS/RHEL 發行版相關聯,並由 dnfyum 套件管理器管理。

構建過程將需要幾分鐘才能完成。要測試套件是否成功安裝,只需執行以下程式碼:

$ podman version

內容解密

  • podman version: 顯示 Podman 版本資訊,用於驗證安裝是否成功。

有時,在專用構建主機上構建二進位檔案,然後使用套件管理器或簡單的封存檔案將它們佈署到其他機器上會很有用。要僅構建二進位檔案,請執行以下命令:

$ make

內容解密

  • make: 僅構建二進位檔案。

在構建結束時,二進位檔案將在 bin/ 資料夾下可用。要透過簡單地將它們複製到 Makefile 中定義的目標目錄中,在本地安裝已編譯的二進位檔案和組態檔案,請執行以下命令:

$ make install

內容解密

  • make install: 在本地安裝已編譯的二進位檔案和組態檔案。

要建立類別似於 GitHub 發布頁面上可用的 .tar.gz 封存檔案的二進位檔案版本,請執行以下命令:

$ make podman-release.tar.gz

內容解密

  • make podman-release.tar.gz: 建立類別似於 GitHub 發布頁面上可用的 .tar.gz 封存檔案的二進位檔案版本。

額外提示:構建不同的版本非常容易 – 只需使用 git 命令切換到目標發布的標籤。例如,要構建 v3.3.1,請使用以下命令:

$ git checkout v3.3.1

內容解密

  • git checkout v3.3.1: 切換到 v3.3.1 版本。

自定義容器 Registry 搜尋列表

Podman 從受信任的容器 Registry 列表中搜尋和下載映像。/etc/containers/registries.conf 檔案是一個 TOML 組態檔案,可用於自定義允許搜尋和用作映像來源的白名單 Registry,以及沒有 TLS 終止的 Registry 映象和不安全的 Registry。

在此組態檔案中,unqualified-search-registries 鍵填充了一個未限定的 Registry 陣列,這些 Registry 沒有關於映像儲存函式庫和標籤的規範。

在 Fedora 系統上,透過全新安裝的 Podman,此鍵具有以下內容:

unqualified-search-registries = ["registry.fedoraproject.org",
"registry.access.redhat.com", "docker.io", "quay.io"]

內容解密

  • unqualified-search-registries: 定義未限定的 Registry 搜尋列表。

使用者可以從此陣列中新增或刪除 Registry,以讓 Podman 從它們中搜尋和提取。

重要提示

在新增 Registry 時要非常小心,並且僅使用受信任的 Registry,以避擴音取包含惡意程式碼的映像。

預設列表足以搜尋和執行本章中的所有範例。那些已經執行私有 Registry 的人可以嘗試將它們新增到未限定的搜尋 Registry 陣列中。

由於 Registry 既有私有的也有公開的,請記住,私有 Registry 通常需要額外的身份驗證才能被存取。這可以使用 podman login 命令完成,本章稍後將介紹。

如果在使用者主目錄中找到 $HOME/.config/containers/registries.conf 檔案,它將覆寫 /etc/containers/registries.conf 檔案。透過這種方式,同一系統上的不同使用者將能夠使用他們自定義的 Registry 白名單和映象來執行 Podman。

可選項 – 啟用根據 Socket 的服務

這是一個可選步驟,在沒有特定需求的情況下,可以安全地跳過本文的內容。

玄貓解析 Podman 環境組態:無守護行程容器管理的進階技巧

Podman 作為一個無需後台服務即可運作容器的管理器,在遷移 Docker 環境時,使用者可能需要與其 Libpod API 進行互動。預設情況下,Podman 使用 UNIX socket 暴露 API,但為了讓 Windows 或 macOS 工作站上的 Podman 客戶端也能存取,則需要使用 TCP socket。

玄貓提醒: 在將 API 服務暴露於網際網路時,若使用 TCP endpoint,務必謹慎,因為這會使 Podman 服務全域性可存取,存在潛在的安全風險。

以下指令展示如何透過 UNIX socket 啟動 Podman API 服務:

$ sudo podman system service --time=0 \
unix:///run/podman/podman.sock

雖然這個方法可行,但每次都需手動在終端機執行略顯不便。更佳的方案是利用 systemd socket。

利用 systemd Socket 管理 Podman API

systemd 的 Socket unit 是一種特殊的服務啟動器。當請求到達預定義的 socket endpoint 時,systemd 會立即啟動對應的服務。安裝 Podman 時,podman.socketpodman.service 這兩個 unit 檔案會自動建立。

podman.socket 檔案內容如下:

# cat /usr/lib/systemd/system/podman.socket
[Unit]
Description=Podman API Socket
Documentation=man:podman-system-service(1)
[Socket]
ListenStream=%t/podman/podman.sock
SocketMode=0660
[Install]
WantedBy=sockets.target

ListenStream 引數指定了 socket 的相對路徑,展開後為 /run/podman/podman.sock

podman.service 檔案內容如下:

# cat /usr/lib/systemd/system/podman.service
[Unit]
Description=Podman API Service
Requires=podman.socket
After=podman.socket
Documentation=man:podman-system-service(1)
StartLimitIntervalSec=0
[Service]
Type=exec
KillMode=process
Environment=LOGGING="--log-level=info"
ExecStart=/usr/bin/podman $LOGGING system service
[Install]
WantedBy=multi-user.target

ExecStart 引數定義了服務啟動時執行的指令,與我們之前展示的 podman system service 指令相同。Requires 引數則表明 podman.service 依賴於 podman.socket 的啟動。

運作機制: 當啟用並啟動 podman.socket 時,systemd 會監聽該 socket endpoint 的連線請求。一旦有連線,systemd 會立即啟動 podman.service。若一段時間沒有活動,服務會自動停止。

使用以下指令啟用並啟動 socket unit:

# systemctl enable --now podman.socket

可以使用 curl 指令測試結果:

# curl --unix-socket /run/podman/podman.sock \
http://d/v3.0.0/libpod/info

執行後,你會收到一個包含容器引擎組態的 JSON 回應。第一次執行時,你可能會注意到一個輕微的延遲 (約十分之一秒)。

在閒置 5 秒後,podman.service 會再次停用。這是因為 podman system service 指令的預設行為是隻執行 5 秒,除非使用 --time 引數指定不同的超時時間 (0 表示永久執行)。

玄貓客製化 Podman 行為:進階組態技巧

Podman 的預設組態適用於大多數場景,但它也提供了高度的靈活性。你可以透過以下設定檔來客製化 Podman 的行為:

  • containers.conf: 這個 TOML 格式的檔案包含 Podman 執行時組態,以及 conmon 和容器執行時二進位檔案的搜尋路徑。它預設安裝在 /usr/share/containers/ 路徑下,可以透過 /etc/containers/containers.conf$HOME/.config/containers/containers.conf 檔案覆寫系統範圍和使用者範圍的設定。

    透過這個檔案,你可以自定義容器的建立方式和生命週期,例如日誌記錄、DNS 解析、環境變數、分享記憶體使用、Cgroup 管理等。

    你可以透過 man containers.conf 檢視完整的設定列表。

  • storage.conf: 這個 TOML 格式的檔案用於自定義容器引擎使用的儲存設定。特別是,你可以使用此檔案自定義預設儲存驅動程式,以及容器儲存的讀/寫目錄 (也稱為 graph root),這是一個額外的驅動程式儲存選項。預設情況下,驅動程式設定為 overlay。

    此檔案的預設路徑是 /usr/share/containers/storage.conf,可以在 /etc/containers/storage.conf 下找到或建立覆寫,以進行系統範圍的自定義。

透過深入理解 Podman 的組態機制,你可以根據自身需求,開發更高效、更安全的容器化環境。玄貓建議仔細研究 containers.confstorage.conf 的各項引數,並根據實際情況進行調整。

為何容器組態至關重要:玄貓的 Podman 實戰解析

在開始使用 Podman 之前,先深入瞭解其組態是非常重要的。如同調整賽車的引擎,正確的組態能讓容器發揮最佳效能。Podman 的組態檔案散佈在系統各處,影響著容器的行為。

Podman 的組態核心檔案:玄貓的組態檔案導覽

Podman 的行為受到多個組態檔案的影響,這些檔案定義了容器的儲存、掛載、安全性及其他重要引數。以下是幾個關鍵的組態檔案:

  • storage.conf: 這個檔案定義了容器的儲存設定,例如儲存驅動程式(如 overlay 或 vfs)和容器映象及層的儲存位置。玄貓建議仔細調整這些設定,以最佳化效能並符合您的儲存需求。

    • 在 root 模式下,這個檔案位於 /etc/containers/storage.conf
    • 使用者層級的組態(影響 rootless 容器)位於 $XDG_CONFIG_HOME/containers/storage.conf$HOME/.config/containers/storage.conf
  • mounts.conf: 這個檔案定義了在容器啟動時自動掛載的 volume。這對於自動傳遞金鑰和憑證等機密資訊到容器中非常有用。

    • 這個檔案位於 /usr/share/containers/mounts.conf,可以被 /etc/containers/mounts.conf 覆寫。
    • 在 rootless 模式下,覆寫檔案可以放在 $HOME/.config/containers/mounts.conf
  • seccomp.json: 這是一個 JSON 檔案,允許使用者自定義容器內程式可以執行的 syscall,同時定義要阻止的 syscall。玄貓會在第 11 章「保護容器」中再次討論這個主題,以更深入地瞭解容器的安全限制。

    • 這個檔案的預設路徑是 /usr/share/containers/seccomp.jsonseccomp 的 man page (man seccomp) 提供了 Linux 系統上 seccomp 如何運作的概述。
  • policy.json: 這是一個 JSON 檔案,定義 Podman 如何執行簽章驗證。這個檔案的預設路徑是 /etc/containers/policy.json,可以被使用者層級的 $HOME/.config/containers/policy.json 覆寫。

    這個組態檔案接受三種策略:

    • insecureAcceptAnything: 接受來自指定 registry 的任何映象。
    • reject: 拒絕來自指定 registry 的任何映象。
    • signedBy: 只接受由特定已知實體簽署的映象。

    預設組態是接受每個映象(insecureAcceptAnything 策略),但可以修改為僅提取可透過簽章驗證的受信任映象。使用者可以定義自定義 GPG 金鑰來驗證簽章和簽署它們的身分。有關可能的策略和組態範例的更多詳細資訊,請參閱相關的 man page (man containers-policy.json)。

玄貓認為,瞭解這些基本組態對於首次安裝 Podman 的使用者來說非常有用。在下一節中,玄貓將介紹第一個容器執行範例。

玄貓帶你跑第一個 Podman 容器

現在,終於到了執行第一個容器的時候了。

在上一節中,玄貓介紹瞭如何在您最喜歡的 Linux 發行版上安裝 Podman,以及安裝後基本套件中包含的內容。現在,玄貓們可以開始使用這個無 daemon 的容器引擎了。

在 Podman 中執行容器是透過 podman run 命令處理的,該命令接受許多選項,用於控制剛執行的容器的行為、其隔離、其通訊、其儲存等等。

執行全新容器最簡單和最短的 Podman 命令如下:

$ podman run <imageID>

玄貓們必須將 imageID 字串替換為要執行的映象名稱/位置/標籤。如果映象不存在於快取中,或者玄貓們之前沒有下載過它,Podman 將從相應的容器 registry 中為玄貓們提取該映象。

互動模式與虛擬終端:玄貓的實戰示範

為了介紹這個命令及其選項,讓玄貓們從簡單開始,執行以下命令:

$ podman run -i -t fedora /bin/bash
Resolved "fedora" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull registry.fedoraproject.org/fedora:latest...
Getting image source signatures
Copying blob ecfb9899f4ce done
Copying config 37e5619f4a done
Writing manifest to image destination
Storing signatures
[root@ec444ad299ab /]#

讓玄貓們看看 Podman 在玄貓們執行先前的命令後做了什麼:

  1. 它識別出映象的名稱 fedora,是最新 Fedora 容器映象的別名。
  2. 然後它意識到該映象在本地快取中遺失,因為這是玄貓們第一次嘗試執行它。
  3. 它從正確的 registry 中提取了映象。它選擇了 Fedora Project registry,因為它與 registries 組態中包含的別名比對。
  4. 最後,它啟動了容器,並向玄貓們提供了一個互動式 shell,執行了玄貓們要求的 Bash shell 程式。

先前的命令提示了一個互動式 shell,這要歸功於玄貓們可以分析的兩個選項,如下所示:

  • --tty, -t:使用這個選項,Podman 分配一個 pseudo-tty(參見 man pty)並將其附加到容器的標準輸入。
  • --interactive, -i:使用這個選項,Podman 保持 stdin 開放,並準備好附加到先前的 pseudo-tty。

正如前幾章所述,當建立容器時,其中的隔離程式將在可寫的 root 檔案系統上執行,這是 layered overlay 的結果。

這允許任何程式寫入檔案,但不要忘記它們將持續到容器執行,因為容器預設是短暫的。

現在,玄貓們可以執行任何命令,並在玄貓們剛才啟動的控制檯中檢查其輸出:

[root@ec444ad299ab /]# dnf install -y iputils iproute
Last metadata expiration check: 0:01:50 ago on Mon Sep 13
08:54:20 2021.
Dependencies resolved.
===============================================================
===============================================================
===============================================
Package Architecture
Version Repository
Size
===============================================================
===============================================================
===============================================
Installing:
iproute x86_64
5.10.0-2.fc34 fedora
679 k
iputils x86_64
20210202-2.fc34 fedora
170 k

玄貓建議,在實際操作中,可以嘗試不同的指令和設定,更深入地瞭解 Podman 的運作方式。

總結來說,Podman 的組態檔案和 podman run 命令提供了強大的功能,讓玄貓們可以靈活地管理和執行容器。瞭解這些基本概念,能幫助玄貓們更好地利用 Podman,並在容器化旅程中取得成功。

容器初體驗:從啟動到網路組態

在容器的世界裡,啟動容器就像開啟了一扇通往無限可能的大門。但啟動後,我們如何與這個獨立的世界互動,又如何讓它與外部世界連線呢?本文將帶你一步步探索容器的奧秘,從最基本的互動操作到進階的網路組態,讓你輕鬆駕馭容器技術。

進入容器:互動式 Shell 的妙用

啟動容器後,有時我們需要進入容器內部進行一些操作,例如安裝軟體、檢查組態等。這時,互動式 Shell 就派上用場了。

podman run -i -t registry.fedoraproject.org/f29/httpd /bin/bash

這個指令會啟動一個根據 registry.fedoraproject.org/f29/httpd 映像檔的容器,並開啟一個互動式 Shell。-i 選項表示保持標準輸入開啟,-t 選項則會分配一個偽終端,讓我們可以像操作一般終端一樣與容器互動。

進入容器後,我們可以執行各種指令。例如,我們可以安裝 net-toolsiproute 這兩個工具,來檢查容器的網路組態:

[root@ec444ad299ab /]# yum install -y net-tools iproute
[root@ec444ad299ab /]# ip r
default via 10.0.2.2 dev tap0
10.0.2.0/24 dev tap0 proto kernel scope link src 10.0.2.100
[root@ec444ad299ab /]# ping -c2 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=255 time=0.030 ms
64 bytes from 10.0.2.2: icmp_seq=2 ttl=255 time=0.200 ms
--- 10.0.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1034ms
rtt min/avg/max/mdev = 0.030/0.115/0.200/0.085 ms

透過 ip r 指令,我們可以檢視容器的路由表,瞭解容器的網路組態。ping 指令則可以用來測試容器與外部網路的連線。

內容解密:

  • yum install -y net-tools iproute: 使用 yum 套件管理器安裝 net-tools 和 iproute 兩個工具。-y 選項表示自動回答 “yes” 來確認安裝。
  • ip r: 顯示當前系統的路由表,包含目標網路、閘道、介面等資訊。
  • ping -c2 10.0.2.2: 使用 ping 指令測試與 IP 位址 10.0.2.2 的連線。-c2 選項表示只傳送兩個封包。

需要注意的是,在互動式 Shell 中所做的任何變更,在容器停止後都會遺失。

如何優雅地離開:分離與重新連線

使用互動式 Shell 時,如果我們直接關閉終端,容器也會隨之停止。但有時我們希望容器繼續執行,而我們只是暫時離開。這時,可以使用以下技巧:

  • 分離 (Detach):在互動式 Shell 中,按下 Ctrl + P, Ctrl + Q 組合鍵,即可分離 Shell,讓容器在背景繼續執行。
  • 重新連線 (Attach):使用 podman ps 指令取得容器的 ID,然後執行 podman attach <容器ID> 即可重新連線到容器的 Shell。

玄貓提醒: 這種方式雖然方便,但仍屬於前台執行。更推薦的方式是使用 -d 選項,讓容器在背景執行。

podman run -d -i -t registry.fedoraproject.org/f29/httpd

開啟對外之窗:網路埠口發布

預設情況下,容器的網路是與主機隔離的。如果我們希望從主機或其他網路存取容器內部的服務,就需要進行埠口發布 (Port Publishing)。

podman run 指令的 -p 選項可以用來發布容器的埠口。其格式如下:

-p=ip:hostPort:containerPort
  • ip: 主機的 IP 位址。如果設定為 0.0.0.0,表示繫結到所有 IP 位址。
  • hostPort: 主機的埠口。
  • containerPort: 容器的埠口。

例如,以下指令會將容器的 8080 埠口發布到主機的 8080 埠口:

podman run -p 8080:8080 -d -i -t registry.fedoraproject.org/f29/httpd

執行後,可以使用 podman port <容器ID> 指令檢視埠口對映情況:

$ podman port fc9d97642801
8080/tcp -> 0.0.0.0:8080

接著,可以使用 curl 指令或瀏覽器來測試是否可以存取容器內部的服務:

curl –s 127.0.0.1:8080 | head

玄貓小提示: 埠口發布是讓容器與外部世界互動的重要橋樑。在設計容器化應用時,應仔細規劃埠口對映,確保服務可以被正確存取。

容器啟航:組態與環境變數的奧秘

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

玄貓發現,在跨國專案中,確保容器時區正確是避免排程錯誤的關鍵。

DNS 設定:開發容器專屬的網路環境

--dns 選項讓您可以為容器指定 DNS 伺服器:

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

這在測試特定 DNS 設定或隔離容器網路時非常有用。

Hostname 設定:建立容器內部的主機名稱解析

--add-host 選項可以在容器的 /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

玄貓在開發環境中常用此功能,模擬生產環境的主機名稱解析。

HTTP 代理:讓容器穿梭網路

Podman 預設會將主機的許多環境變數傳遞給容器,包括 http_proxyhttps_proxyftp_proxyno_proxy,讓容器可以使用 HTTP 代理。

自訂環境變數:傳遞組態引數的最佳實踐

透過 --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

玄貓認為,使用環境變數是將組態引數傳遞給應用程式,並從作業系統主機影響服務行為的最佳實踐。正如第一章所見,容器預設是不可變與短暫的。因此,我們應該像前面的範例一樣,利用環境變數在執行時組態容器。

容器管理:邁向系統管理之路

本章節探討了 Podman 的基本指令,學習如何透過各種選項執行容器。現在,我們已準備好進入下一個階段:容器管理。作為容器世界的系統管理員,我們必須理解並學習管理指令,以便檢查執行中容器化服務的健康狀況。

下一章將探討容器管理,學習如何使用 Podman 管理映像檔和容器的生命週期。我們將學習如何檢查容器並從中提取日誌,還會介紹 Pod、如何建立 Pod,以及如何在 Pod 中執行容器。

延伸閱讀

如需更多關於本章涵蓋主題的資訊,請參考以下資源:

容器營運:管理與檢測

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

本章將涵蓋以下主要主題:

  • 管理容器映像檔
  • 執行中容器的操作
  • 檢查容器資訊
  • 從容器捕捉日誌
  • 在執行中的容器中執行行程
  • 在 Pod 中執行容器

技術要求

在繼續本章及其練習之前,需要一台具有工作 Podman 例項的機器。正如第 3 章「執行第一個容器」中所述,本章中的所有範例都在 Fedora 34 系統上執行,但可以在您選擇的作業系統 (OS) 上重現。

最後,對前幾章涵蓋的主題有很好的理解,有助於輕鬆掌握有關開放容器倡議 (OCI) 映像檔和容器執行的概念。

容器映像檔管理:探索與下載

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

正如我們在前幾章中所述,容器是一種在具有單獨名稱空間和資源分配的沙盒環境中隔離行程的方法。

容器中掛載的檔案系統由第 2 章「比較 Podman 和 Docker」中描述的 OCI 映像檔提供。

OCI 映像檔由稱為容器登入檔的專用服務儲存和分發。容器登入檔儲存映像檔和元資料,並公開簡單的 REpresentational State Transfer (REST) 應用程式介面 (API) 服務,以讓使用者能夠推播和提取映像檔。

登入檔基本上有兩種型別:公共和私有。公共登入檔可以作為公共服務存取(無論是否經過身份驗證)。主要的公共登入檔(如 docker.iogcr.ioquay.io)也用作較大型開放原始碼專案的映像檔儲存函式庫。

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

在容器的世界裡,映像檔管理是基礎,也是確保應用程式能夠快速、安全佈署的關鍵。玄貓建議,在實際操作中,可以多利用 Podman 提供的指令,深入瞭解映像檔的結構與內容,這對於除錯和最佳化容器應用程式非常有幫助。

內容解密

  • podman run --tz=Asia/Shanghai fedora date: 這個指令設定容器的時區為亞洲/上海,並執行 date 指令,顯示容器內部的時間。
  • podman run --dns=1.1.1.1 fedora cat /etc/resolv.conf: 這個指令設定容器使用的 DNS 伺服器為 1.1.1.1,並顯示容器的 DNS 設定檔。
  • podman run --add-host=my.server.local:192.168.1.10 fedora cat /etc/hosts: 這個指令在容器的 /etc/hosts 檔案中新增 my.server.local 的主機名稱解析,指向 192.168.1.10。
  • podman run --env MYENV=podman fedora printenv: 這個指令設定環境變數 MYENV 的值為 podman,並顯示容器的所有環境變數。