[吊打Docker]Quadlet支持通过.pod文件创建Pods,Podman你别太好用!
First
Podman 自 v5.0.0 后支持Quadlet通过.pod文件创建Pods
我自身的容器还未有能用到Pods的
这次就把ghost&mysql融合一下作为学习和记录
Need Know | 须知
- ghost需要mysql作为数据库
- mysql&podman如在同一Server使用Podman部署需要在同一个网路
OS&APP Version | 系统&软件版本
OS

Podman

MySQL
8.0
ghost
5.94.2

Config | 配置
如要实现ghost&mysql容器在同一个Pod并且保证ghost&mysql能够正常通信
我们需要在/usr/share/containers/systemd目录下有以下文件
- blog.pod
- blog.network
- mysql.container
- ghost.container
| File | Use |
|---|---|
| blog.pod | 定义一个pod |
| blog.network | 定义一个网络 |
| mysql.container | 定义一个容器mysql |
| ghost.container | 定义一个容器ghost |
下面来一一拆解配置⤵️
blog.pod
blog.pod 文件定义了一个 pod
▼ 其有效值如下所示

▼ 此次演示用到的有效值和内容如下

▲ 通过上图可知我们定义了如下值▼
[Pod]
PodName=blog
Network=blog.network
PublishPort=127.0.0.1:30002:2368
PublishPort=127.0.0.1:30003:3306
Volume=mysql:/var/lib/mysql
Volume=ghost:/var/lib/ghost/content
- 将此Pod命名为blog
- 使用名为blog的网络配置文件
- 将此Pod中的2368端口映射至Host的127.0.0.1:30002
- 将此Pod中的3306端口映射至Host的127.0.0.1:30003
- 将Host中名为mysql的Volume映射至Pod /var/lib/mysql
- 将Host中名为ghost的Volume映射至Pod /var/lib/ghost/content
这里需要注意:若将Volume值写在Pod中,那么需要提前创建该Volume
▼ 即我们还需要如下操作
podman volume create mysql
podman volume create ghost
blog.network
此文件定义了一个网络可选值如下 ▼

▼ 此次演示用到的有效值和内容如下

▲ 通过上图可知我们定义了如下值▼
[Unit]
Description=Custom blog Network
[Network]
Driver=bridge
NetworkName=blog
Gateway=10.88.80.1
Subnet=10.88.80.0/24
- 网络类型为bridge
- 网络名称为blog
- 网关为10.88.80.1
- Subnet为10.88.80.0/24
mysql.container
此文件定义了一个名为MySQL的容器
container文件对应着podman run可选值非常多
这里截一下部分可选值

▼ 此次演示用到的有效值和内容如下

▲ 通过上图可知我们定义了如下值▼
[Unit]
Description=MySQL is a widely used, open-source relational database management system (RDBMS)
After=network-online.target blog-pod.service
Wants=network-online.target blog-pod.service
Before=shutdown.target
[Container]
Pod=blog.pod
ContainerName=mysql
Image=docker.io/library/mysql:8.0
Environment="MYSQL_ROOT_PASSWORD=xxxxxxxx" "MYSQL_ROOT_HOST=%"
[Install]
WantedBy=default.target
▼ 自上而下简要说一下释义
-
After=
- 同systemd:表示此单元需要在network-online.target blog-pod.service文件后启动
-
Wants=
- 同systemd:表示此单元需要在network-online.target blog-pod.service之前启动(弱依赖)
-
Wants=
- 同systemd:表示此单元需要在network-online.target blog-pod.service之前启动(强依赖)
-
Before=
- 同systemd:表示此单元需要shutdown.target之前关闭
-
Pod=blog.pod
- 表示此容器属于名为blog的Pod
Pod=
Specify a Quadlet .pod unit to link the container to. The value must take the form of <name>.pod and the .pod unit must exist.
Quadlet will add all the necessary parameters to link between the container and the pod and between their corresponding services.
- WantedBy=default.target
- 因为Quadlet生成的systemd单元是瞬态的所以不能使用enable来实现自启动,但可以使用WantedBy=default.target标识来实现自启
ghost.container
此文件定义了一个名为MySQL的容器
container文件对应着podman run可选值非常多
前面已经描述了MySQL.container的详细内容
这次就简单说一下
▼ 此次演示用到的有效值和内容如下

▲ 通过上图可知我们定义了如下值▼
[Unit]
Description=Ghost is a free and open source blogging platform written in JavaScript
After=network-online.target mysql.service blog-pod.service
Wants=network-online.target mysql.service blog-pod.service
Requires=network-online.target mysql.service blog-pod.service
Before=shutdown.target
[Container]
Pod=blog.pod
ContainerName=ghost
Image=docker.io/library/ghost:alpine
Environment="NODE_ENV=production" "database__client=mysql" "database__connection__host=mysql" "database__connection__port=3306" "database__connection__user=root" "database__connection__password=xxxxxxx" "database__connection__database=ghost" "url=https://xzllll.com"
[Service]
Restart=always
[Install]
WantedBy=default.target
Use | 使用
配置文件写完并且校验完成后我们就可以通过Quadlet来生成Pod啦
▼ 首先重载systemd
systemctl daemon-reload
▼ 接着直接启动 blog-pod.service
systemctl start blog-pod.service
因为我们定义了各个服务的启动流程
当我们启动blog-pod时
Pod会拉起mysql和ghost
因为mysql和ghost之间存在依赖关系 所以mysql&ghost会先后启动
▼ 过程如下图所示

▼ 随后打开ghost看一下各项服务

▲ 没有问题大功搞成
Thanks&Copy | 抄袭
Over | 总结
Podman又又又更加好用了😎