在 Podman 中安装并使用 MySQL 主要分三步:拉取镜像、创建并运行容器、连接使用。以下是详细的操作指南。
1. 拉取 MySQL 镜像
首先,从 Docker Hub 拉取官方 MySQL 镜像。
建议拉取一个明确的版本号,比如 8.0,而不是 latest,这样更稳定。
# 拉取 MySQL 8.0 镜像
podman pull mysql:8.0
2. 创建并运行 MySQL 容器
这是最关键的一步,直接运行以下命令即可创建并启动一个 MySQL 容器。
podman run --name my-mysql -d \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -v /path/to/mysql/data:/var/lib/mysql \ mysql:8.0
参数说明:
-
--name my-mysql: 为容器命名为my-mysql,方便后续管理。 -
-d: 让容器在后台运行(detach 模式)。 -
-p 3306:3306: 将宿主机的 3306 端口映射到容器的 3306 端口-。 -
-e MYSQL_ROOT_PASSWORD=my-secret-pw: 必须设置,通过环境变量指定 MySQLroot用户的密码-。 -
-v /path/to/mysql/data:/var/lib/mysql: 强烈建议添加,将容器内的数据目录挂载到宿主机,实现数据持久化。请将/path/to/mysql/data替换为你希望存储数据的实际路径。
可选:使用 Podman 卷 (Volume) 管理数据
除了挂载宿主机目录,也可以使用 Podman 卷来管理数据,这通常被认为更规范。
# 1. 创建一个名为 mysql-data 的卷 podman volume create mysql-data # 2. 运行容器时挂载这个卷 podman run --name my-mysql -d \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -v mysql-data:/var/lib/mysql \ mysql:8.0
3. 连接到 MySQL 容器
容器启动后,可以通过 podman exec 命令进入容器内部,并使用 MySQL 客户端连接。
# 进入容器并连接 MySQL
podman exec -it my-mysql mysql -uroot -p
执行后,系统会提示你输入密码,即上一步设置的 my-secret-pw。输入正确后,你就会进入 MySQL 的命令行界面。
📌 验证与高级配置
-
验证容器运行状态
使用以下命令确保容器正常运行:podman ps你应该能看到名为
my-mysql的容器状态为Up。 -
创建数据库和用户 (可选)
如果你想在容器首次启动时就自动创建一个数据库和一个专用用户,可以添加额外的环境变量。podman run --name my-mysql -d \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -e MYSQL_DATABASE=myapp \ -e MYSQL_USER=appuser \ -e MYSQL_PASSWORD=app-secret \ -v mysql-data:/var/lib/mysql \ mysql:8.0
-
使用自定义配置文件
如果你需要对 MySQL 进行性能调优,可以挂载自定义配置文件。# 1. 创建配置文件目录和文件 mkdir -p ~/mysql-config cat > ~/mysql-config/custom.cnf <<'EOF' [mysqld] innodb_buffer_pool_size = 256M max_connections = 200 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci EOF # 2. 运行容器时挂载配置文件 podman run --name my-mysql -d \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -v mysql-data:/var/lib/mysql \ -v ~/mysql-config/custom.cnf:/etc/mysql/conf.d/custom.cnf:Z \ mysql:8.0
注意:
-v参数最后的:Z是 SELinux 相关的标记,在你之前遇到的Permission denied问题场景下,加上它可以避免权限错误。 -
允许远程连接
默认情况下,MySQL root 用户只允许从localhost(即容器内部)连接。如果需要从宿主机或其他机器远程连接,需要在进入 MySQL 后执行授权命令。-- 进入 MySQL 容器后执行 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
💎 总结
至此,你已经成功在 Podman 中安装并运行了一个 MySQL 数据库服务。核心步骤是:
-
podman pull mysql:8.0拉取镜像。 -
podman run命令创建并启动容器,务必设置MYSQL_ROOT_PASSWORD环境变量,并挂载数据卷以实现持久化。 -
使用
podman exec -it进入容器连接数据库。
---解决sqlyog12和mysql8的连接问题---
操作步骤(结合Podman 环境):
# 进入 MySQL 容器 podman exec -it my-mysql mysql -uroot -p # 输入 root 密码后,执行下面的 SQL 语句
MySQL 8.0+ 的新密码加密方式(caching_sha2_password)与你使用的旧版 SQLyog(12.08)不兼容导致的。
🔍 根本原因
-
MySQL 8.0+ 默认使用
caching_sha2_password作为身份验证插件,安全性更高。 -
SQLyog 12.08(2018年发布) 的 MySQL 客户端库较老,不支持这种新插件,因此报错
Plugin caching_sha2_password could not be loaded。
✅ 解决方案(三选一,推荐方案一)
方案一:修改 MySQL 用户认证插件为 mysql_native_password(推荐,最快)
在 MySQL 容器内执行以下 SQL 命令(将 root 和 '192.168.0.100' 替换为你的实际用户名和主机地址):
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;
如果不想用 root,可以新建一个专用用户:
CREATE USER 'wt'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; GRANT ALL PRIVILEGES ON *.* TO 'wt'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
修改完成后,用 SQLyog 重新连接,选择 MySQL 选项卡(不是 HTTP/SSH),填入:
-
主机地址:
192.168.0.100 -
用户名:
root或wt -
密码:你设置的密码
点击 测试连接 应该就能成功了。
解决中文乱码问题:
针对 Podman 容器中 MySQL 8 的配置,通常有两种方法。
最推荐的方法是将配置文件挂载到容器外部。这样,你只需在宿主机上修改文件,重启容器即可生效,无需进入容器内部操作,也避免了容器重建后配置丢失的问题。
下面是两种方法的具体操作:
方法一:将配置文件挂载到宿主机(最推荐)
这种方法的核心是,在启动容器时,用 -v 参数将你宿主机上的一个目录或文件,映射到容器内的配置目录。
-
停止并删除现有的 MySQL 容器
首先,需要停止并删除你正在运行的容器。注意:请确保你的数据已经通过卷(如mysql-data)持久化,否则数据会丢失。podman stop <你的mysql容器名或ID> podman rm <你的mysql容器名或ID>
-
在宿主机上创建配置文件目录和文件
# 创建一个目录来存放配置文件,例如 /root/mysql-conf mkdir -p /root/mysql-conf # 进入该目录 cd /root/mysql-conf # 创建你的自定义配置文件,例如 custom.cnf vi custom.cnf
-
编辑配置文件
在custom.cnf文件中写入你的配置。必须以[mysqld]开头-。
例如,解决你遇到的中文乱码问题,可以添加以下内容来设置默认字符集-11:[client] default_character_set=utf8 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default_authentication_plugin=mysql_native_password
关于文件权限:如果配置文件权限是
777,MySQL可能会忽略它-。建议将权限设置为644:1️⃣ 调整宿主机文件权限
确保该文件对“其他用户”有读权限:
chmod 644 /root/mysql-conf/custom.cnf
2️⃣ 设置 SELinux 上下文(关键!)
为这个文件打上容器可读的标签:
chcon -t container_file_t /root/mysql-conf/custom.cnf
-
重新创建并启动容器,挂载配置文件
在podman run命令中,使用-v /root/mysql-conf/custom.cnf:/etc/mysql/conf.d/custom.cnf将你的配置文件挂载到容器内的/etc/mysql/conf.d/目录下--1。podman run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=your-password \ -v mysql-data:/var/lib/mysql \ -v /root/mysql-conf/custom.cnf:/etc/mysql/conf.d/custom.cnf \ mysql:latest
#:Z是 SELinux 标签,确保容器有权访问。可以不用执行这个命令。chcon -t container_file_t /root/mysql-conf/custom.cnf
podman run -d \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ -v /wtuse/log/mysql:/var/log/mysql:Z \ -v mysql-data:/var/lib/mysql:Z \ -v /wtuse/conf/mysql-conf/custom.cnf:/etc/mysql/conf.d/custom.cnf:Z \ --name mysql8 \ mysql:8.0命令解释:
-
-v /root/mysql-conf/custom.cnf:/etc/mysql/conf.d/custom.cnf: 将宿主机上的/root/mysql-conf/custom.cnf文件挂载到容器内的/etc/mysql/conf.d/custom.cnf。容器启动时会自动读取这个目录下的.cnf文件。 -
mysql:latest: 替换为你的MySQL镜像名。
-
-
验证配置是否生效
容器启动后,可以进入容器检查:在MySQL命令行中执行以下命令,查看字符集是否已修改:
SHOW VARIABLES LIKE 'character_set_%';
当出现权限错误时,参考如下:
📌 关于权限和 SELinux 的补充说明
| 操作 | 命令 |
|---|---|
| 查看文件权限 | ls -l /root/mysql-conf/custom.cnf |
| 查看 SELinux 上下文 | ls -Z /root/mysql-conf/custom.cnf |
| 临时关闭 SELinux(测试用) | setenforce 0(测试完记得 setenforce 1) |
| 永久添加标签 | chcon -t container_file_t /root/mysql-conf/custom.cnf |
| 挂载时自动处理(推荐) | -v 宿主机路径:容器路径:Z(私有)或 :z(共享) |
为 MySQL 容器添加日志持久化,通常需要做两件事:
-
在 MySQL 配置文件中指定日志文件路径(默认日志可能输出到
stderr或容器内非持久路径)。 -
将该路径挂载为宿主机目录或 Podman 卷,实现日志持久化,便于长期存储和分析。
以下是完整操作步骤(基于你已挂载配置目录 /root/mysql-conf.d/ 的前提):
📝 第一步:修改自定义配置文件
编辑你的配置文件 /root/mysql-conf.d/custom.cnf,在 [mysqld] 段中添加如下内容(按需启用):
[mysqld]
# 通用设置(示例)
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password
# ===== 日志相关设置 =====
# 错误日志(默认输出到 stderr,这里指定文件)
log-error=/var/log/mysql/error.log
# 通用查询日志(记录所有操作,慎用,会增大IO)
general-log=1
general-log-file=/var/log/mysql/general.log
# 慢查询日志
slow-query-log=1
slow-query-log-file=/var/log/mysql/slow.log
long_query_time=2
# 二进制日志(如果需要,也可以单独设置路径)
# log-bin=/var/log/mysql/binlog
# expire_logs_days=7
保存文件。
🗂️ 第二步:在宿主机准备日志目录
# 创建日志目录
mkdir -p /root/mysql-logs
# 设置权限(MySQL 容器内用户 UID=999,需可写)
chown 999:999 /root/mysql-logs
chmod 755 /root/mysql-logs
# 处理 SELinux 标签(如果系统启用了 SELinux)
chcon -Rt container_file_t /root/mysql-logs
🚀 第三步:重新创建容器(挂载配置 + 日志目录)
由于需要添加新的挂载点,需停止并删除现有容器,再用完整命令重新创建。数据卷 mysql-data 保持不变,数据不会丢失。
# 停止并删除旧容器
podman stop mysql8
podman rm mysql8
# 重新创建,挂载配置目录(:Z 自动处理 SELinux)和日志目录
podman run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=你的密码 \
-v mysql-data:/var/lib/mysql \
-v /root/mysql-conf.d/:/etc/mysql/conf.d/:Z \
-v /root/mysql-logs/:/var/log/mysql/:Z \
mysql:latest
注意:
-v /root/mysql-logs/:/var/log/mysql/:Z将宿主机目录挂载到容器内的/var/log/mysql,MySQL 会将所有日志写入该位置。
✅ 第四步:验证日志是否生成
容器启动后,稍等片刻,查看宿主机日志目录:
ls -l /root/mysql-logs/
应该能看到 error.log、general.log、slow.log 等文件(取决于配置)。
也可以查看容器内日志内容:
podman exec mysql8 cat /var/log/mysql/error.log
⚠️ 注意事项
-
日志文件权限:如果 MySQL 无法写入日志,会报错
Permission denied。请确保宿主机目录属主为999:999(MySQL 容器内用户 UID),或设置为777临时测试(不推荐)。 -
SELinux:务必处理标签,否则容器无法读写宿主机目录。使用
:Z挂载选项已自动处理,无需手动chcon。 -
日志膨胀:
general-log会记录所有操作,文件会快速变大,建议仅在调试时开启,生产环境谨慎使用。 -
日志轮转:可以考虑在宿主机上配置
logrotate来管理这些日志文件,防止磁盘占满。
🔄 如果容器已存在,不想重建
也可以在不重建容器的情况下,通过 podman exec 在容器内创建软链接或修改配置,但挂载卷必须重建容器。因此,重建是最干净的方式。
🧪 验证配置是否生效
进入 MySQL,查看日志相关变量:
SHOW VARIABLES LIKE 'log_%';
SHOW VARIABLES LIKE 'general_log%';
SHOW VARIABLES LIKE 'slow_query_log%';
确认它们都指向你设置的路径。
📌 最终状态
你现在拥有:
-
数据持久化:
mysql-data卷存储数据库文件。 -
配置持久化:
/root/mysql-conf.d/目录存放自定义配置。 -
日志持久化:
/root/mysql-logs/目录存放 MySQL 所有日志。
三者分离,便于管理和备份。
如有其他配置需求(如二进制日志、审计日志等),可在配置文件中继续添加。有问题欢迎继续提问! 😊
浙公网安备 33010602011771号