使用 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
启动流程
- 
生成 systemd unit 
sudo systemctl daemon-reload
- 
- 
手动启动 MySQL 
sudo systemctl start mysql.service
- 
- 
查看状态 
systemctl status mysql.service
- 
- 
实时日志 
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 的区别表格,方便你写博客的时候让读者一眼看懂?
 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号