Quadlet還未出現(xiàn)之前

我一直使用generate systemd生成systemd以便優(yōu)雅的啟動(dòng)Podman容器

但現(xiàn)在看來(lái),還可以更優(yōu)雅


示例環(huán)境

OS

[萊點(diǎn)Docker&Podman] Quadlet | 結(jié)合Systemd優(yōu)雅啟動(dòng)容器(containers)

Podman Version

[萊點(diǎn)Docker&Podman] Quadlet | 結(jié)合Systemd優(yōu)雅啟動(dòng)容器(containers)

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使用流程

  1. 編寫(xiě)Quadlet配置文件
  2. 使用systemd重載新的單元文件(此時(shí)systemd會(huì)生成相應(yīng)容器的單元文件,相應(yīng)容器交予systemd接管)
  3. 使用 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

軟件版本

[萊點(diǎn)Docker&Podman] Quadlet | 結(jié)合Systemd優(yōu)雅啟動(dòng)容器(containers)

使用流程示例

下述操作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端口至host8000/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

QuadletPodlet 是不可多得的優(yōu)秀輔助工具

這將使我們更加方便優(yōu)雅的管理我們的容器

,

聲明:本站所有文章,如無(wú)特殊說(shuō)明或標(biāo)注,均為本站原創(chuàng)發(fā)布。任何個(gè)人或組織,在未征得本站同意時(shí),禁止復(fù)制、盜用、采集、發(fā)布本站內(nèi)容到任何網(wǎng)站、書(shū)籍等各類媒體平臺(tái)。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。