不論是在 Docker 還是 Podman,要讓多個 container 一起運作的話,不太可能為每個 container 分別下指令。如果可以預先設定好每個 container 的參數,然後下一個指令就能同時執行這些 container 就好了。所以在 Docker 有 Docker Compose 這個工具,同樣在 Podman 也有類似用途的工具。這篇文章要介紹的就是在 Podman 下設定並執行多個 container 的方法。
Podman Compose
Podman Compose 可以做到跟 Docker Compose 一樣的功能,也就是讀取 docker-compose.yaml
,然後用 Podman 執行檔案定義的 container。
這個工具沒有在 Podman 之中,需要另外安裝:
安裝完之後,就可以像 Docker Compose 一樣,在有 docker-compose.yaml
的資料夾下執行:
然後就可以用下面的指令看剛剛到底執行了哪些 container:
這個指令對於熟悉 Docker Compose 的人來說比較容易上手。
Kubernetes YAML
Podman 雖然本身不支援 docker-compose.yaml
,不過它支援 Kubernetes YAML 檔案。
我們可以用下面的指令來執行 Kubernetes YAML 檔案定義的 container:
也可以用下面的指令來將執行中的 container 的設定儲存成 Kubernetes YAML 檔案:
不過有些 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
檔案的例子:
跟一般的 Systemd unit 檔案相比,.container
多了一個 [Container]
section,讓你可以定義一個 container。
把這個檔案放在 /etc/containers/systemd/
(rootful)或是 ~/.config/containers/systemd/
(rootless),然後重開機或是執行:
這個 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 也少很多。
參考資料
- podman-systemd.unit — Podman documentation
- podman-kube — Podman documentation
- containers/podman-compose
- Podman Compose or Docker Compose: Which should you use in Podman? - Red Hat Blog
- Anyone using Podman play kube to self-host? - Reddit r/selfhosted
- 紅帽容器管理工具Podman 4.4合併Quadlet,簡化systemd容器管理 | iThome
- Podman 淺談 - Pod 功能介紹 - iT 邦幫忙