使用Docker Compose配置MySQL并挂载my.cnf文件

举报
鱼弦 发表于 2025/06/12 11:58:06 2025/06/12
【摘要】 使用Docker Compose配置MySQL并挂载my.cnf文件完整操作指南1. 创建项目目录结构首先创建一个项目目录,用于存放配置文件和数据卷:mkdir -p ~/mysql-docker/{conf,data} # conf存放my.cnf,data存放数据库文件cd ~/mysql-docker2. 创建自定义配置文件my.cnf在conf目录下创建my.cnf,按需配置SQL...

使用Docker Compose配置MySQL并挂载my.cnf文件


完整操作指南

1. 创建项目目录结构

首先创建一个项目目录,用于存放配置文件和数据卷:

mkdir -p ~/mysql-docker/{conf,data}  # conf存放my.cnf,data存放数据库文件
cd ~/mysql-docker

2. 创建自定义配置文件my.cnf

conf目录下创建my.cnf,按需配置SQL Mode和其他参数(示例配置如下):

# ~/mysql-docker/conf/my.cnf
[mysqld]
# SQL Mode配置(按需调整)
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,ONLY_FULL_GROUP_BY

# 其他可选配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-authentication-plugin = mysql_native_password

[client]
default-character-set = utf8mb4

​参数说明​​:

  • sql_mode:控制SQL语法和数据校验规则(如严格模式、零日期检查等)。
  • character-set-server:指定服务器默认字符集(推荐utf8mb4以支持完整的Unicode,包括Emoji)。

3. 编写docker-compose.yml文件

在项目根目录创建docker-compose.yml,配置MySQL服务并挂载my.cnf

# ~/mysql-docker/docker-compose.yml
version: '3.8'

services:
  mysql:
    image: mysql:8.0  # 使用官方MySQL 8.0镜像
    container_name: mysql-server
    environment:
      MYSQL_ROOT_PASSWORD: Dameng123  # 设置root密码(必需)
      MYSQL_DATABASE: testdb          # 可选:初始化数据库
      MYSQL_USER: user1               # 可选:创建新用户
      MYSQL_PASSWORD: user123         # 可选:设置用户密码
    volumes:
      - ./data:/var/lib/mysql         # 挂载数据卷(持久化存储)
      - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf  # 挂载自定义配置文件
    ports:
      - "3306:3306"                   # 映射宿主机端口
    restart: unless-stopped           # 容器异常退出时自动重启

​关键配置说明​​:

  • volumes
    • ./data:/var/lib/mysql:将宿主机data目录挂载到容器内的MySQL数据存储路径,实现数据持久化。
    • ./conf/my.cnf:/etc/mysql/conf.d/my.cnf:将自定义配置文件挂载到容器的配置目录(/etc/mysql/conf.d/),优先级高于镜像默认配置。
  • environment:通过环境变量初始化数据库(首次启动时生效)。

4. 启动MySQL容器

在项目目录下执行以下命令启动服务:

docker-compose up -d

​验证容器状态​​:

docker-compose ps

预期输出:

   Name                 Command               State           Ports         
-------------------------------------------------------------------------
mysql-server   docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp

5. 验证配置是否生效

方法1:进入容器查看SQL Mode

docker exec -it mysql-server mysql -uroot -pDameng123

在MySQL命令行中执行:

SHOW VARIABLES LIKE 'sql_mode';

预期输出应包含你在my.cnf中配置的模式(如STRICT_TRANS_TABLES,NO_ZERO_DATE,ONLY_FULL_GROUP_BY)。

方法2:测试SQL行为

  • ​严格模式测试​​:尝试插入非法日期(如'0000-00-00'),验证是否报错:
    CREATE TABLE test_table (id INT, date_col DATE);
    INSERT INTO test_table VALUES (1, '0000-00-00');  -- 应报错
  • ​字符集测试​​:插入包含Emoji的数据,验证是否正常存储:
    INSERT INTO test_table VALUES (2, '😊');
    SELECT * FROM test_table;

6. 高级配置选项(按需扩展)

动态修改SQL Mode(无需重启容器)

若需临时调整SQL Mode(如测试场景),可进入容器执行:

docker exec -it mysql-server mysql -uroot -pDameng123 -e "SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';"

验证修改:

SHOW GLOBAL VARIABLES LIKE 'sql_mode';

⚠️ 此修改在容器重启后会失效,持久化需通过my.cnf配置。


挂载多个配置文件

若需拆分配置(如单独管理字符集、日志等),可在conf目录下创建多个文件(如charset.cnflog.cnf),然后在docker-compose.yml中挂载整个目录:

volumes:
  - ./conf:/etc/mysql/conf.d  # 挂载整个目录

7. 常见问题排查

问题1:配置文件未生效

  • ​检查点​​:

    1. 确认my.cnf文件权限是否正确(建议644):
      chmod 644 ~/mysql-docker/conf/my.cnf
    2. 确认文件是否挂载到正确路径:
      docker exec -it mysql-server ls -l /etc/mysql/conf.d/
      应看到my.cnf文件。
  • ​解决方案​​:
    若文件未挂载,检查docker-compose.yml中的路径是否拼写错误,或重新启动容器:

    docker-compose down && docker-compose up -d

问题2:MySQL启动失败

  • ​检查点​​:

    1. 查看容器日志:
      docker-compose logs mysql
    2. 常见错误:
      • mysql: [ERROR] Found option without preceding group in config filemy.cnf格式错误(如缺少[mysqld]分段)。
      • mysql: [ERROR] Unknown/unsupported storage engine:配置了不支持的存储引擎(如误删default-storage-engine)。
  • ​解决方案​​:
    根据日志修正my.cnf语法错误,或参考调整配置。


总结

​步骤​ ​关键命令/文件​
创建项目目录 mkdir -p ~/mysql-docker/{conf,data}
编写配置文件 ~/mysql-docker/conf/my.cnf(按需配置sql_mode等参数)
编排Docker服务 ~/mysql-docker/docker-compose.yml(挂载配置和数据卷)
启动服务 docker-compose up -d
验证配置 docker exec -it mysql-server mysql -uroot -pDameng123 + SHOW VARIABLES

通过以上步骤,你可以灵活管理MySQL的配置,实现数据持久化、字符集优化、SQL行为控制等功能,满足生产环境的需求。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。