前情提要:之前在自架 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

最後的最後,重開機看看是否一切運作正常。