📦 Podman

無 daemon、更安全的容器管理工具

Podman 與 Docker 指令高度相容(alias docker=podman),但無需 root daemon 即可執行容器,安全性更高,支援以 systemd 管理容器服務。

安裝

$ sudo apt update && sudo apt install -y podman
podman --version
podman version 4.9.3

與 Docker 高度相容

Podman 的指令與 Docker 幾乎相同,可直接用 alias 取代:

$ alias docker=podman       # 加入 ~/.bashrc 永久生效

# 大多數 Docker 指令可直接使用
podman pull nginx:alpine
podman run -d -p 80:80 --name web nginx:alpine
podman ps
podman logs web
podman exec -it web sh
podman stop web && podman rm web

Rootless 容器(無需 root)

Podman 最大優勢:一般使用者即可執行容器,不需要 root 或 sudo:

$ # 以一般使用者身份執行容器
podman run -d -p 8080:80 --name web nginx:alpine
podman ps
💡 Rootless 模式下,容器內的 root 實際上對應主機的當前使用者,更加安全。但注意:綁定 1024 以下的 port 需要額外設定或使用高位 port 再用防火牆轉發。

將容器設為 systemd 服務

$ # 先啟動容器
podman run -d --name myapp myapp:1.0

# 產生 systemd 服務檔
mkdir -p ~/.config/systemd/user
podman generate systemd --name myapp --files --new
mv container-myapp.service ~/.config/systemd/user/

# 啟用(使用者級服務)
systemctl --user enable --now container-myapp.service

# 設定使用者登出後服務仍繼續執行
loginctl enable-linger $USER

Pod 管理(類似 Kubernetes Pod)

Pod 讓多個容器共享網路命名空間,適合需要緊密協作的服務:

$ # 建立 Pod(並暴露 Port)
podman pod create --name webapp -p 80:80

# 在 Pod 中加入容器
podman run -d --pod webapp --name nginx nginx:alpine
podman run -d --pod webapp --name app myapp:1.0

# 管理整個 Pod
podman pod start webapp
podman pod stop webapp
podman pod ps