podman安装并简单使用mysql

在 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: 必须设置,通过环境变量指定 MySQL root 用户的密码-。

  • -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 数据库服务。核心步骤是:

  1. podman pull mysql:8.0 拉取镜像。

  2. podman run 命令创建并启动容器,务必设置 MYSQL_ROOT_PASSWORD 环境变量,并挂载数据卷以实现持久化。

  3. 使用 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 参数将你宿主机上的一个目录或文件,映射到容器内的配置目录。

  1. 停止并删除现有的 MySQL 容器
    首先,需要停止并删除你正在运行的容器。注意:请确保你的数据已经通过卷(如 mysql-data)持久化,否则数据会丢失。

     
    podman stop <你的mysql容器名或ID>
    podman rm <你的mysql容器名或ID>
  2. 在宿主机上创建配置文件目录和文件

    # 创建一个目录来存放配置文件,例如 /root/mysql-conf
    mkdir -p /root/mysql-conf
    # 进入该目录
    cd /root/mysql-conf
    # 创建你的自定义配置文件,例如 custom.cnf
    vi custom.cnf

     

  3. 编辑配置文件
    在 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
  4. 重新创建并启动容器,挂载配置文件
    在 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镜像名。

     
  5. 验证配置是否生效
    容器启动后,可以进入容器检查:

    podman exec -it mysql8 bash
    mysql -uroot -p

     

    在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 容器添加日志持久化,通常需要做两件事:

  1. 在 MySQL 配置文件中指定日志文件路径(默认日志可能输出到 stderr 或容器内非持久路径)。

  2. 将该路径挂载为宿主机目录或 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 所有日志。

三者分离,便于管理和备份。

如有其他配置需求(如二进制日志、审计日志等),可在配置文件中继续添加。有问题欢迎继续提问! 😊

posted on 2026-08-11 01:01  wtsgtc  阅读(35)  评论(0)    收藏  举报