能,但必须避开root权限的常见陷阱:端口映射需用高位端口(如33066:3306)、数据卷路径须加:Z标签、显式指定--network slirp4netns、MYSQL_ROOT_PASSWORD必须非空设置,四者缺一不可。

直接说结论:能,但必须避开 root 权限的常见陷阱——端口、数据目录、SELinux 标签、网络模式这四点不调对,podman run 会静默失败或容器起不来。
端口映射不能用 3306:3306
普通用户无法绑定 1024 以下端口,-p 3306:3306 会报错或被忽略。必须改用高位端口:
-
--publish 33066:3306(宿主机 33066 → 容器 MySQL 默认端口 3306) - 连接时用
mysql -h 127.0.0.1 -P 33066 -u root -p,别漏掉-P(大写)指定端口 - 如果要用 3306,得配
sysctl net.ipv4.ip_unprivileged_port_start=0(不推荐,破坏安全边界)
数据卷路径必须可写且带 :Z
-v ~/mysql-data:/var/lib/mysql 看似合理,但在 SELinux 启用的系统(如 RHEL/CentOS/Fedora)下会因上下文不匹配导致 MySQL 启动失败,日志里常出现 Permission denied 或卡在 mysqld: Can't create/write to file。
- 必须加
:Z:写成-v ~/mysql-data:/var/lib/mysql:Z -
:Z会让 Podman 自动打上私有 SELinux 标签,即使你关了 SELinux 也建议保留——它在 rootless 模式下还负责文件属主重映射 - 确保
~/mysql-data目录存在且当前用户有读写权限:mkdir -p ~/mysql-data && chmod 700 ~/mysql-data
必须显式指定 --network slirp4netns
Podman rootless 默认用 slirp4netns 做用户态网络栈,但某些镜像或旧版 Podman 不自动启用,会导致容器内网卡没 IP、localhost 连不上自己。
- 加上
--network slirp4netns显式声明,避免依赖默认行为 - 不加时可能看到
mysql: [Warning] Using a password on the command line interface can be insecure.之后卡住,实际是网络不通 - 不要用
--network host—— rootless 下不支持
MYSQL_ROOT_PASSWORD 必须设,且不能为空
MySQL 8.4 镜像若不传 MYSQL_ROOT_PASSWORD,root 密码为空,容器虽能启动,但首次连接会失败(MySQL 8+ 默认拒绝空密码登录),报错类似 Access denied for user 'root'@'localhost'。
- 必须设:
-e MYSQL_ROOT_PASSWORD=my-secure-pw-2026 - 密码里避免
$、`、\等 shell 特殊字符,否则需单引号包裹整个-e参数 - 别用
MYSQL_ALLOW_EMPTY_PASSWORD=yes—— 它只绕过初始化检查,不解决登录问题,且极度危险
最简能跑通的命令长这样:podman run --name mysql84 -d --network slirp4netns --publish 33066:3306 -e MYSQL_ROOT_PASSWORD=abc123 -v ~/mysql-data:/var/lib/mysql:Z mysql:8.4。注意所有参数顺序无关,但缺一不可——少一个,就可能在日志里翻半小时。


















