BY xzllll

[吊打Docker]Quadlet支持通过.pod文件创建Pods,Podman你别太好用!

实践 | Practices 2024年9月27日

First

Podman 自 v5.0.0 后支持Quadlet通过.pod文件创建Pods

我自身的容器还未有能用到Pods的

这次就把ghost&mysql融合一下作为学习和记录

Release v5.0.0 · containers/podman
5.0.0 Security Fixed CVE-2024-1753 in Buildah and podman build which allowed a user to write files to the / directory of the host machine if selinux was not enabled. Features VMs created by podm…

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 | 抄袭

podman-systemd.unit — Podman documentation

Over | 总结

Podman又又又更加好用了😎

标签

xzllll

三分钟热度三分钟收获