skip to content
鰭狀漏斗

在 Podman 管理多個 container

/ 閱讀時間 5 分鐘

不論是在 Docker 還是 Podman,要讓多個 container 一起運作的話,不太可能為每個 container 分別下指令。如果可以預先設定好每個 container 的參數,然後下一個指令就能同時執行這些 container 就好了。所以在 Docker 有 Docker Compose 這個工具,同樣在 Podman 也有類似用途的工具。這篇文章要介紹的就是在 Podman 下設定並執行多個 container 的方法。

Podman Compose

Podman Compose 可以做到跟 Docker Compose 一樣的功能,也就是讀取 docker-compose.yaml,然後用 Podman 執行檔案定義的 container。

這個工具沒有在 Podman 之中,需要另外安裝:

Terminal window
pacman -S podman-compose

安裝完之後,就可以像 Docker Compose 一樣,在有 docker-compose.yaml 的資料夾下執行:

Terminal window
podman-compose up

然後就可以用下面的指令看剛剛到底執行了哪些 container:

Terminal window
podman ps

這個指令對於熟悉 Docker Compose 的人來說比較容易上手。

Kubernetes YAML

Podman 雖然本身不支援 docker-compose.yaml,不過它支援 Kubernetes YAML 檔案。

我們可以用下面的指令來執行 Kubernetes YAML 檔案定義的 container:

Terminal window
podman kube play demo.yaml

也可以用下面的指令來將執行中的 container 的設定儲存成 Kubernetes YAML 檔案:

Terminal window
podman kube generate demo

不過有些 Kubernetes YAML 檔案中的欄位 podman kube play 是不支援的,詳情可以參考文件

原本 Podman 的開發團隊似乎不專注於支援 docker-compose.yaml,反而是努力在支援 Kubernetes YAML,不過之後似乎就將重心轉向開發 Quadlet 了。

Quadlet

Quadlet 是在 v4.4 引進的新功能。它在 Systemd unit 檔案的基礎下,定義了 .container.volume 之類的檔案。如果你寫了一個 .container 檔案,然後把它當做 Systemd unit 檔案操作,這樣你就可以用 Systemd 管理這個檔案中定義的 container。

下面是一個 .container 檔案的例子:

test.container
[Unit]
Description=A minimal container
[Container]
# Use the centos image
Image=quay.io/centos/centos:latest
# In the container we just run sleep
Exec=sleep 60
[Service]
# Restart service when sleep finishes
Restart=always
[Install]
# Start by default on boot
WantedBy=multi-user.target default.target

跟一般的 Systemd unit 檔案相比,.container 多了一個 [Container] section,讓你可以定義一個 container。

把這個檔案放在 /etc/containers/systemd/(rootful)或是 ~/.config/containers/systemd/(rootless),然後重開機或是執行:

Terminal window
systemctl daemon-reload
# rootless 環境要加 --user:
systemctl --user daemon-reload

這個 container 就會開始執行。可以用 podman ps 或是 systemctl status 指令看看執行情況。

差異

Quadlet 檔案的寫法跟 docker-compose.yaml 和 Kubernetes YAML 檔案很不一樣。一個 docker-compose.yaml 檔案或 Kubernetes YAML 檔案裡面可能會定義多個 container,尤其是如果它們之間有相依性的話。而在 Quadlet 是分開來的,一個檔案只會定義一個 container,其他種類的 volume 或是 network 也是不同的檔案。

Quadlet 檔案以 Systemd unit 檔案為基礎,這代表寫 Quadlet 檔案需要有一些 Systemd 的基礎。例如上面的 .container 檔案在 [Container] section 之外都是 Systemd unit 檔案的設定選項。

Podman Compose 的檔案因為是共用 Docker Compose 的設定檔,所以教學會比較多,網路上也有很多範例。不過不知道是不是所有能在 Docker Compose 執行的 docker-compose.yaml 都能在 Podman Compose 上執行。Quadlet 的教學相較之下就少很多,其實 Podman 的教學相較於 Docker 也少很多。

參考資料