使用 Podman Quadlet 管理 MySQL 8.4.6 (AlmaLinux 9 / Podman 5.4)

明白了👌。我给你生成一份 Markdown 格式的文档,适合直接放到博客里,包含你的环境、Podman 版本、配置文件、启动流程和重点提示。

 


 

 

使用 Podman Quadlet 管理 MySQL 8.4.6 (AlmaLinux 9 / Podman 5.4)

 

 

 

环境信息

 

 

  • 系统:AlmaLinux 9

  • Podman 版本5.4.0

  • MySQL 镜像:docker.io/library/mysql:8.4.6

  • 数据目录:/mnt/blockstorage/mysql_data(复用 CentOS Docker 时期的旧数据盘)

 

 

⚠️ 注意:Podman 5.4 的 Quadlet 功能还不完全,部分语法与官方文档不一致:

 

  • Args= ❌ 不支持 → 改用 Exec= ✅

  • CPUQuota= / Memory= ❌ 不支持 → 用 PodmanArgs=--memory=1200m 等方式传递 ✅

  • RestartPolicy= ❌ 不支持 → 放到 [Service] 段写成 Restart=always

 

 


 

 

配置文件 

/etc/containers/systemd/mysql.container

 

# =============================
# Quadlet 配置文件,用于 Podman 5.4
# 管理 MySQL 8.4.6 容器
# -----------------------------
# 位置:/etc/containers/systemd/mysql.container
# 生成方式:systemd 会在 daemon-reload 时调用 podman generator
# 把本文件转换成 /run/systemd/generator/mysql.service
# =============================

[Unit]
# systemd 单元描述信息,方便在 systemctl status 中查看
Description=MySQL 8.4.6 (Quadlet, podman 5.4 compatible)

# 确保网络在线后再启动(数据库依赖网络)
Wants=network-online.target
After=network-online.target

[Container]
# 使用的镜像(等价于 docker run -it mysql:8.4.6)
Image=docker.io/library/mysql:8.4.6

# 容器名称(固定为 mysql8,避免 Podman 自动生成随机名)
ContainerName=mysql8

# 端口映射:宿主机 3306 -> 容器 3306
# 另一个 33060 是 MySQL X Plugin,Podman 会自动开放
PublishPort=3306:3306

# 数据卷挂载:将宿主机的块存储目录挂载到容器内的 MySQL 数据目录
# :Z 表示在 SELinux 打开时自动调整安全上下文
Volume=/mnt/blockstorage/mysql_data:/var/lib/mysql:Z

# -----------------------------
# 环境变量(只在首次初始化时生效)
# 复用旧数据盘时,这些不会覆盖已有账号/密码
# -----------------------------
Environment=TZ=America/New_York
Environment=MYSQL_ROOT_PASSWORD=xxx
Environment=MYSQL_DATABASE=appdb
Environment=MYSQL_USER=appuser
Environment=MYSQL_PASSWORD=xxx

# -----------------------------
# MySQL 配置参数(原 compose 的 command)
# Podman 5.4 不支持 Args=,改用 Exec=
# 每个 Exec= 相当于命令行中的一个参数
# -----------------------------
Exec=--character-set-server=utf8mb4 # 默认字符集
Exec=--collation-server=utf8mb4_0900_ai_ci # 默认排序规则
Exec=--skip-name-resolve # 禁用主机名解析,提升连接速度
Exec=--innodb_flush_method=O_DIRECT # 避免双重缓存,提高一致性
Exec=--innodb_buffer_pool_size=512M # InnoDB 缓冲池大小(适合 2G 内存小机型)
Exec=--innodb_buffer_pool_instances=1 # 缓冲池分区数
Exec=--innodb_redo_log_capacity=256M # redo 日志大小
Exec=--innodb_flush_log_at_trx_commit=1 # 每次事务提交都刷盘,保证安全
Exec=--binlog_expire_logs_seconds=604800 # 二进制日志保留 7 天
Exec=--log-bin=/var/lib/mysql/mysql-bin # 启用 binlog(复制 / PITR 恢复用)
Exec=--server-id=1 # 唯一 server-id,主从复制时必须
Exec=--default-time-zone=America/New_York # MySQL 内部时区

# -----------------------------
# 资源限制
# Podman 5.4 不支持 Memory= / CPUQuota=
# 必须用 PodmanArgs= 传递原生 run 参数
# -----------------------------
PodmanArgs=--memory=1200m # 最大 1.2 GiB 内存
# PodmanArgs=--cpus=1 # 可选:限制最多 1 vCPU
# PodmanArgs=--cpuset-cpus=0 # 可选:绑定 CPU0

[Service]
# systemd 原生配置,用于控制重启策略
Restart=always # 异常退出自动重启
RestartSec=3 # 重启前延时 3 秒

[Install]
# 控制目标,意味着可用 `systemctl enable` 设置为开机自启
WantedBy=multi-user.target

 


 

[Unit]

Description=MySQL 8.4.6 (Quadlet, podman 5.4 compatible)

Wants=network-online.target

After=network-online.target

 

[Container]

Image=docker.io/library/mysql:8.4.6

ContainerName=mysql8

PublishPort=3306:3306

Volume=/mnt/blockstorage/mysql_data:/var/lib/mysql:Z

 

# 复用旧数据盘时,下列 ENV 不会重新初始化,仅留作文档

Environment=TZ=America/New_York

Environment=MYSQL_ROOT_PASSWORD=xxx

Environment=MYSQL_DATABASE=appdb

Environment=MYSQL_USER=appuser

Environment=MYSQL_PASSWORD=xxx

 

# 原 compose 的 command 参数 → Exec=(5.4支持)

Exec=--character-set-server=utf8mb4

Exec=--collation-server=utf8mb4_0900_ai_ci

Exec=--skip-name-resolve

Exec=--innodb_flush_method=O_DIRECT

Exec=--innodb_buffer_pool_size=512M

Exec=--innodb_buffer_pool_instances=1

Exec=--innodb_redo_log_capacity=256M

Exec=--innodb_flush_log_at_trx_commit=1

Exec=--binlog_expire_logs_seconds=604800

Exec=--log-bin=/var/lib/mysql/mysql-bin

Exec=--server-id=1

Exec=--default-time-zone=America/New_York

 

# 资源限制(Podman 5.4 用 PodmanArgs 传递)

PodmanArgs=--memory=1200m

# 如需CPU约束(二选一,按需取消注释)

# PodmanArgs=--cpus=1

# PodmanArgs=--cpuset-cpus=0

 

[Service]

Restart=always

RestartSec=3

 

[Install]

WantedBy=multi-user.target

 

启动流程

 

 

  1. 生成 systemd unit

 

sudo systemctl daemon-reload

 

  1.  

  2. 手动启动 MySQL

 

sudo systemctl start mysql.service

 

  1.  

  2. 查看状态

 

systemctl status mysql.service

 

  1.  

  2. 实时日志

 

journalctl -u mysql.service -f

 

 


 

 

常见运维命令

 

# 启动/停止/重启
sudo systemctl start mysql.service
sudo systemctl stop mysql.service
sudo systemctl restart mysql.service

# 查看容器
podman ps

# 登录 MySQL
podman exec -it mysql8 mysql -uroot -p

 


 

 

重点说明

 

 

  • .container 文件改动后,必须执行:

 

sudo systemctl daemon-reload && sudo systemctl restart mysql.service

 

  •  

  • 复用旧数据盘时,MYSQL_ROOT_PASSWORD 等环境变量不会生效,仍需使用 旧密码 登录。

  • 配置文件只是模板,实际参数(内存大小、缓冲池大小等)需根据机器规格调整。

  • 如果需要开机自启,可以执行:

 

sudo systemctl enable mysql.service

 

  • 默认情况下不会自启,便于手动控制。

  • Podman 5.4 与 5.6+ 在 Quadlet 的语法支持上有差异,升级 Podman 后可以恢复官方写法(Args、CPUQuota、Memory 直接可用)

 

 


 

要不要我再帮你加一节 对比 Docker Compose vs Podman Quadlet 的区别表格,方便你写博客的时候让读者一眼看懂?

posted @ 2025-09-09 16:38  就是想学习  阅读(34)  评论(0)    收藏  举报