作者:袁首京 原創文章,轉載時請保留此聲明,並給出原文連接。 技術人員多數又呆板又花心不長久。我知道你可能已經厭倦了 Docker,但是系統還沒有複雜到需要高攀 K8S 的地步。那我建議您,有空的話可以約一下 Podman。 Podman 使用起來是足夠簡單的,直接把它當做改了名字的 Docker ...
作者:袁首京
原創文章,轉載時請保留此聲明,並給出原文連接。
技術人員多數又呆板又花心不長久。我知道你可能已經厭倦了 Docker,但是系統還沒有複雜到需要高攀 K8S 的地步。那我建議您,有空的話可以約一下 Podman。
Podman 使用起來是足夠簡單的,直接把它當做改了名字的 Docker 就可以了。所以以下只介紹一下它的編排工具,也就是 podman-compose
。
簡介
用 Docker 的時候,你知道它提供了一個編排工具,可以將容器的細節,例如名稱、鏡像、重啟策略、捲、掛載點、埠、標簽等等,在一個單一的文件中指定,這個文件通常命名為 docker-compose.yml
。
Podman 可以使用 podman-compose
達成類似的功能。簡單的說,podman-compose
是使用 Podman 做為後端的一種 Compose Spec 實現,它的關註點主要是:
- rootless 不需要 root 許可權
- daemon-less 沒有守護進程
它最終的實現結果與 docker-compose.yml
文件的相容度非常高,只存在一些細微的差異,比如說某些值需要使用引號括起來等。
安裝
podman-compose
算是一個相對較新的工具,因此很多穩定或長期支持的 Linux 發行版,很可能還沒有將它放在內置的軟體源中。這種情況下,可以從 PyPI 安裝:
sudo pip3 install podman-compose
Ubuntu 22.10 及以上或 Debian 12 及以上,則可以使用包管理器安裝它:
sudo apt install podman-compose
Fedora 36 及以上,也可以直接安裝:
sudo dnf install podman-compose
Arch Linux 用戶:
sudo pacman -Syu podman-compose
驗證安裝
可以簡單輸出一下版本號,以驗證是否安裝正確:
podman-compose --version
輸出類似下麵:
$ podman-compose --version
['podman', '--version', '']
using podman version: 4.3.1
podman-composer version 1.0.3
podman --version
podman version 4.3.1
exit code: 0
編排
如前所述,podman-compose
與 docker-compose
基本一致,所以不詳細描述其文件結構了。直接看一個例子,比較容易理解,內容如下:
version: 3.7
services:
reverse-proxy:
image: docker.io/library/caddy:alpine
container_name: caddy-vishwambhar
command: caddy run --config /etc/caddy/Caddyfile
restart: always
ports:
- "8080:80"
- "8443:443"
volumes:
- /docker-volumes/caddy/Caddyfile:/etc/caddy/Caddyfile:Z
- /docker-volumes/caddy/site:/srv:Z
- /docker-volumes/caddy/caddy_data:/data:Z
- /docker-volumes/caddy/caddy_config:/config:Z
- /docker-volumes/caddy/ssl:/etc/ssl:Z
labels:
- io.containers.autoupdate=registry
- pratham.container.category=proxy
environment:
- TZ=Asia/Kolkata
depends_on:
- gitea-web
gitea-web:
image: docker.io/gitea/gitea:latest
container_name: gitea-govinda
restart: always
ports:
- "8010:3000"
- "8011:22"
volumes:
- /docker-volumes/gitea/web:/data:Z
- /docker-volumes/gitea/ssh:/data/git/.ssh:Z
- /etc/localtime:/etc/localtime:ro
labels:
- io.containers.autoupdate=registry
- pratham.container.category=gitea
environment:
- RUN_MODE=prod
- DISABLE_SSH=false
- START_SSH_SERVER=true
- SSH_PORT=22
- SSH_LISTEN_PORT=22
- ROOT_URL=https://git.mydomain.com
- DOMAIN=git.mydomain.com
- SSH_DOMAIN=git.mydomain.com
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=gitea-db:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=/run/secrets/gitea_database_user_password
- GITEA__service__DISABLE_REGISTRATION=true
- TZ=Asia/Kolkata
depends_on:
- gitea-db
secrets:
- gitea_database_user_password
gitea-db:
image: docker.io/library/postgres:14-alpine
container_name: gitea-chitragupta
restart: always
volumes:
- /docker-volumes/gitea/database:/var/lib/postgresql/data:Z
labels:
- io.containers.autoupdate=registry
- pratham.container.category=gitea
environment:
- POSTGRES_USER=gitea
- POSTGRES_PASSWORD=/run/secrets/gitea_database_user_password
- POSTGRES_DB=gitea
- TZ=Asia/Kolkata
secrets:
- gitea_database_user_password
secrets:
gitea_database_user_password:
external: true
啟動所有容器
可以簡單使用 up
命令,啟動編排文件中的所有容器與服務:
podman-compose up -d
上述命令背後將執行啟動相關容器必須的所有操作,包括:
- 拉取鏡像
- 使用指定選項(埠、捲、機密、網路等)創建容器
- 按特定順序啟動容器(由約束定義,例如 depends_on)
-d
選項,隨便一猜大概就能明白,是做為後臺進程啟動容器的意思。
容器啟動並運行後,可以通過以下命令進行驗證:
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d7b7f91c03aa docker.io/library/caddy:alpine caddy run --confi... 4 hours ago Up 4 hours ago 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp caddy-vishwambhar
1cfcc6efc0d0 docker.io/library/postgres:14-alpine postgres 4 hours ago Up 4 hours ago gitea-chitragupta
531be3df06d0 docker.io/gitea/gitea:latest /bin/s6-svscan /e... 4 hours ago Up 4 hours ago 0.0.0.0:8010->3000/tcp, 0.0.0.0:8011->22/tcp gitea-govinda
停止容器與服務
既然啟動是 up
,那停止很明顯就是 down
了。這倆單詞我老早就認識,不知道你認識不認識?
podman-compose down
此外,您還可以設置個超時時間,容器到時可以安全地自行關閉:
podman-compose down -t TIMEOUT_IN_SECONDS
podman-compose down --timeout TIMEOUT_IN_SECONDS
註意,以上命令僅停止容器,並不會刪除容器。
啟動或停止特定服務
你應該註意到了,上面的配置文件定義了多個服務,比如其中之一是 gitea-db
。如果單獨啟停它的話,可以象這樣:
$ podman-comopse start gitea-db
$ podman-compose stop gitea-db
$ podman-compose restart gitea-db
其它
主要的命令其實就是上述這些了。剩餘一兩個可能用到的,簡單描述一下。
假如想預先拉取一下相關鏡像,可以使用命令:
podman-compose pull
另外,前述命令都假定編排文件的名字仍然叫 docker-compose.yml
。肯定是可以換成其它名字的,比如 foo.yml
,則使用時需要多加個參數,指定配置文件:
podman-compose -f foo.yml
podman-compose --file foo.yml
總之,使用起來還是相當簡單愉快的。請君試之。
作者:袁首京原創文章,轉載時請保留此聲明,並給出原文連接。