使用Docker Compose配置MySQL并挂载my.cnf文件
【摘要】 使用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.cnf
、log.cnf
),然后在docker-compose.yml
中挂载整个目录:
volumes:
- ./conf:/etc/mysql/conf.d # 挂载整个目录
7. 常见问题排查
问题1:配置文件未生效
-
检查点:
- 确认
my.cnf
文件权限是否正确(建议644
):chmod 644 ~/mysql-docker/conf/my.cnf
- 确认文件是否挂载到正确路径:
应看到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启动失败
-
检查点:
- 查看容器日志:
docker-compose logs mysql
- 常见错误:
mysql: [ERROR] Found option without preceding group in config file
:my.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)