在Quadlet還未出現(xiàn)之前
我一直使用generate systemd生成systemd以便優(yōu)雅的啟動(dòng)Podman容器
但現(xiàn)在看來(lái),還可以更優(yōu)雅
示例環(huán)境
OS
Podman Version
Quadlet小知識(shí)
什么是Quadlet?
簡(jiǎn)單來(lái)說(shuō) Quadlet 是一個(gè)用于管理 Podman 容器的 Systemd 單元文件生成工具
相較于generate systemd來(lái)說(shuō)更方便,且增加了自動(dòng)更新容器鏡像的功能
使用Systemd管理容器,簡(jiǎn)直不要太爽
需要安裝嗎?
自Podman 4.4后,Quadlet合并至Podman,因此不需要安裝
Quadlet使用流程
- 編寫(xiě)Quadlet配置文件
- 使用systemd重載新的單元文件(此時(shí)systemd會(huì)生成相應(yīng)容器的單元文件,相應(yīng)容器交予systemd接管)
- 使用 systemctl start/stop/status 管理相應(yīng)的容器
Quadlet配置文件路徑
對(duì)于Root用戶來(lái)說(shuō),Quadlet的配置文件位于以下兩個(gè)目錄
- /etc/containers/systemd/
- /usr/share/containers/systemd/
對(duì)于其他用戶來(lái)說(shuō)則是以下目錄
- $XDG_CONFIG_HOME/containers/systemd/ or ~/.config/containers/systemd/
- /etc/containers/systemd/users/$(UID)
- /etc/containers/systemd/users/
Quadlet使用流程
編寫(xiě)Quadlet配置文件
讓我們以Scrutiny容器的Quadlet配置文件為例來(lái)說(shuō)明一下
可以看到配置文件以.container結(jié)尾且位于/usr/share/containers/systemd/
~ ll /usr/share/containers/systemd/scrutiny.container -rw-r--r-- 1 root root 585 May 22 02:31 /usr/share/containers/systemd/scrutiny.container ~
查看配置文件如下所示
~ cat /usr/share/containers/systemd/scrutiny.container [Unit] Description=WebUI for smartd S.M.A.R.T monitoring After=network-online.target Wants=network-online.target Before=shutdown.target [Container] AutoUpdate=registry AddCapability=SYS_RAWIO AddDevice=/dev/sda AddDevice=/dev/sdb AddDevice=/dev/sdc AddDevice=/dev/sdd AddDevice=/dev/sde ContainerName=scrutiny Image=ghcr.io/analogj/scrutiny:master-omnibus PublishPort=10.7.7.7:41523:8080 PublishPort=10.7.7.7:41524:8086 Volume=scrutiny:/opt/scrutiny/config Volume=scrutiny:/opt/scrutiny/influxdb Volume=/run/udev:/run/udev:ro Timezone=Asia/Shanghai [Install] WantedBy=multi-user.target default.target ~
可以看到大致有三部分組成分別為
- Unit
- Container
- Install
除Container外,其余配置將會(huì)被同步至Systemd單元文件
以上述配置為例,詳解一下各部分配置
Unit
此項(xiàng)共寫(xiě)入了四個(gè)參數(shù),分別為
- Description
- 對(duì)于此Systemd的描述
- After
- 在哪個(gè)單元后啟動(dòng)
- Wants
- 啟動(dòng)此單元需要哪些單元
- Before
- 在哪些單元關(guān)閉前關(guān)閉此單元
Container
- AutoUpdate=registry
- 是否自動(dòng)更新此容器
- AddCapability=SYS_RAWIO
- 等效于Podman run 命令行中的 --cap-add SYS_RAWIO
- AddDevice=/dev/sda
- 等效于Podman run 命令行中的 --device /dev/sda
- ContainerName=scrutiny
- 設(shè)定容器名稱,等效于Podman run 命令行中的 --name scrutiny
- Image=ghcr.io/analogj/scrutiny:master-omnibus
- 啟動(dòng)此容器所需鏡像(名稱格式需要與Podman Pull命令行中賦予的一致)
- PublishPort=10.7.7.7:41523:8080
- 映射容器端口,等效于我們熟悉的 -p
- Volume=scrutiny:/opt/scrutiny/config
- 卷映射,等效于我們熟悉的-v
- Timezone=Asia/Shanghai
- 時(shí)區(qū)配置,等效于Podman run 命令行中的--tz Asia/Shanghai
Install
使用Quadlet創(chuàng)建的service單元文件被視為瞬態(tài),所以不能使用傳統(tǒng)的 systemctl enable讓其自啟
但可以在Quadlet配置文件中的[Install]一項(xiàng)添加WantedBy=multi-user.target default.target讓其開(kāi)機(jī)自啟
配置文件看起來(lái)是
[Install] WantedBy=multi-user.target default.target
如若設(shè)定后發(fā)現(xiàn)并不可以開(kāi)機(jī)自啟,通常是因?yàn)槿萜鳒?zhǔn)備啟動(dòng)時(shí)設(shè)備網(wǎng)絡(luò)狀態(tài)未就緒,容器無(wú)法監(jiān)聽(tīng)對(duì)應(yīng)接口導(dǎo)致啟動(dòng)失敗,請(qǐng)正確配置啟動(dòng)順序(上述演示配置文件已配置完畢)
生成systemd單元文件
使用以下命令生成Systemd單元文件
systemctl daemon-reload
接著我們查看一下生成的單元文件
systemctl cat *.service
若無(wú)法查到對(duì)應(yīng)的單元文件,說(shuō)明Quadlet配置文件有問(wèn)題,請(qǐng)檢查后重試
啟動(dòng)相應(yīng)容器
systemctl start *.service
Podlet
假如說(shuō)因我表述能力問(wèn)題
各位尚未學(xué)會(huì)如何編寫(xiě)Quadlet配置文件
那么我們可以使用Podlet來(lái)自動(dòng)生成Quadlet配置文件
Github主頁(yè):https://github.com/containers/podlet
軟件版本
使用流程示例
下述操作Copy自Github主頁(yè)
假如我們有如下命令
podman run --restart always -p 8000:80 -p 8443:443 -v ./Caddyfile:/etc/caddy/Caddyfile:Z -v caddy_data:/data docker.io/library/caddy:latest
可以看到我們現(xiàn)在需要使用caddy:latest鏡像生成一個(gè)容器
該容器開(kāi)放80/443端口至host的8000/8443端口,并且映射了相應(yīng)的主機(jī)目錄
下面我們使用Podlet來(lái)自動(dòng)生成Quadlet配置文件
$ podlet --file . --install --description Caddy podman run --restart always -p 8000:80 -p 8443:443 -v ./Caddyfile:/etc/caddy/Caddyfile:Z -v caddy_data:/data docker.io/library/caddy:latest Wrote to file: ./caddy.container $ cat caddy.container [Unit] Description=Caddy [Container] Image=docker.io/library/caddy:latest PublishPort=8000:80 PublishPort=8443:443 Volume=./Caddyfile:/etc/caddy/Caddyfile:Z Volume=caddy_data:/data [Service] Restart=always [Install] WantedBy=default.target
可以看到我們只需將Podlet Shell置于原有的Podman shell之上
它就可以為我們自動(dòng)生成Quadlet配置文件 非常之方便
總結(jié)
若您在使用Podman
Quadlet和Podlet 是不可多得的優(yōu)秀輔助工具
這將使我們更加方便優(yōu)雅的管理我們的容器
,