前情提要:之前在自架 Drone CI 文中提到,那裡的 Drone server 是用 Podman 跑的,並且該文最後留下一個懸念「該怎麼讓 Drone server / Drone runner 變成服務,並且開機會自行啟動?」而本文就是 Podman 給出的解答。
Podman
首先認識一下 Podman,它可以視為 Docker 的替代品,不過它並不只是隻模仿貓,它有以下特點:
- Apache 開源授權,由紅帽開發,有富爸爸,並且至今沒有被放生,依然活躍發展中。
- 跑起來不需要 root 權限,也並非 daemon 服務,這種設計比 Docker 安全一點(但也因此要用些許手段才能設成服務)。
- 和 Docker 指令有九成像,可以秒轉換。
- 和 Docker 不同的是 Podman 有 pod 的概念,也就是服務集群,感覺又離最潮的 K8s 近了一點。
- 對於習慣用 Docker Compose 的人,也有 Podman Compose。
- 也有類似 Docker Desktop 的 Podman Desktop,並且不用擔心它的商業授權問題。
額外補充上列的最後一點,根據 Docker 公司的授權條款,Docker Desktop 只要是商用,並且公司規模超過某一程度,Docker Desktop 必須要付費,而 Docker Engine 仍然是免費使用,兩者大致的差異如下:
- Docker Engine: Docker daemon + Docker CLI
- Docker Desktop: Docker Engine + Docker GUI + Docker VM
簡單的說,Decker Desktop 有 GUI,對於非 Linux 的系統它還會幫你建 VM,實在貼心,但作為一位開發者,都會用 Docker 了,怎麼還會被 GUI 吸引,又怎麼會被 VM 困住,反過來說,對於非開發者,有 Docker GUI 一樣不會用,還是要乖乖的從 CLI 學起,如此看來那 Docker GUI 似乎沒什麼用。
總之我就免費仔~把話題拉回 Podman。
Podman 安裝
Podman 自己的安裝說明 相當冗長,其實就一行搞定:
$ sudo apt-get install podman
是的 Ubuntu 原本的 APT 庫就有 Podman,當前版本為 3.4,而 Podman 自己最新的版本是 4.0,略有落後但不影響使用。
Podman 使用
因為是 Docker copycat,所以指令幾乎一樣,差別在抓 image 時要用完整網址,如:
- 在 Docker,image 位址為 gitea/gitea:latest,在 Podman,image 位址為 docker.io/gitea/gitee:latest。
- 在 Docker,image 位址為 httpd,在 Podman,image 位址為 docker.io/library/httpd,沒有組織時就放「library」替代。
下面是一些開容器的例子。
Ubuntu
以 Ubuntu 為例,如果要開個可拋式容器用一下:
$ podman pull docker.io/library/ubuntu:22.04
$ podman run --interactive --tty --rm ubuntu:22.04 bash
Gitea
比較完整的用法,以 Gitea 為例:
抓 Gitea image:
$ podman pull docker.io/gitea/gitea:latest
建 Gitea 資料目錄:
$ sudo mkdir -p /var/lib/gitea
跑起來:
$ podman run \
--detach \
--name=gitea \
--publish 14415:22 \
--publish 14416:3000 \
--volume /var/lib/gitea:/data \
gitea/gitea:latest
MySQL
直接上指令:
$ podman run \
--detach \
--name=mysql \
--publish 3307:3306 \
--env MYSQL_ALLOW_EMPTY_PASSWORD=yes \
docker.io/library/mysql:8.0-debian \
這裡把容器的 3306 port 對應到 Docker 主機的 3307 port,另外因為是可拋式容器,就不設密碼了。
PostgreSQL
$ podman run \
--detach \
--env POSTGRES_PASSWORD=mysecretpassword \
--name pg \
--publish 5432:5432 \
docker.io/library/postgres:15-alpine
把容器設成服務
前面提過,Podman 本身不會註冊成服務,但是有時候的確需要把一些容器以服務的形式運行,Podman 也貼心的設想到了,它可以快速幫我們產生 Linux 的 systemd 的服務配置文件。
假設有個容器叫 drone,想要產生它的 systemd 服務配置文件,可用以下指令:
$ podman generate systemd --name drone --files
它會產生一個 container-drone.service 檔案,把檔案移到 ~/.config/systemd/user/:
$ sudo mv ~/container-drone.service ~/.config/systemd/user/
讓它自動啟動:
$ systemctl --user daemon-reload
$ systemctl --user enable container-drone.service
讓它立馬啟動:
$ systemctl --user start container-drone.service
確認服務狀態:
$ systemctl --user status container-drone.service
後置作業
以上服務是跑在非 root 帳號,要多額外開啟 linger,此特性是讓目前帳號能開機自動登入,並跑起服務。
$ sudo loginctl enable-linger
最後的最後,重開機看看是否一切運作正常。