前期准备:环境与目录布置
系统环境要求
部署前确认Docker Engine ≥20.10.14,Docker Compose ≥2.17.0。执行docker --version和docker-compose --version验证版本。确保宿主机3306端口未被占用:netstat -tlnp | grep 3306。
磁盘空间建议预留20GB,MySQL数据目录需chmod 755权限。对于生产环境,建议使用SSD存储并配置合理的IO调度策略。
项目目录规划
创建标准化目录结构,分离关注点:
mysql-docker-project/ ├── docker-compose.yml # 主配置文件 ├── data/ # 持久化数据目录(映射/var/lib/mysql) ├── conf/ # 自定义配置目录(映射/etc/mysql/conf.d) ├── init/ # 初始化SQL脚本目录 └── logs/ # 日志目录(映射/var/log/mysql)此结构确保配置、数据、日志独立管理,便于备份和迁移。data/目录建议使用命名卷替代绑定挂载以提升性能。
核心配置:docker-compose.yml详解
配置文件版本与语法结构
Compose文件采用YAML格式,版本声明决定可用特性。推荐version: '3.8',兼容Docker Engine 19.03+并支持所有现代功能。services块定义MySQL服务及其配置。
MySQL服务配置要素
镜像管理:指定image: mysql:8.0使用MySQL 8.0 LTS版本。生产环境应固定具体版本号如mysql:8.0.36,避免自动升级导致兼容性问题。开发环境可使用mysql:latest获取最新特性。
端口映射:ports: - "3306:3306"将容器3306端口映射到宿主机。生产环境建议修改宿主机端口如"3307:3306"避免冲突,或通过expose: - "3306"仅内部暴露。
重启策略:restart: always确保容器异常退出时自动重启。unless-stopped策略在手动停止后不再重启,适合需要维护的场景。
数据持久化:两种方案:
- 命名卷:
volumes: - mysql_data:/var/lib/mysql,数据由Docker管理 - 绑定挂载:
volumes: - ./data:/var/lib/mysql,直接映射宿主机目录
命名卷性能更优且便于备份,推荐生产使用。
环境变量:关键初始化参数:
environment: MYSQL_ROOT_PASSWORD: "StrongPass123!" MYSQL_DATABASE: appdb MYSQL_USER: appuser MYSQL_PASSWORD: "UserPass456" TZ: Asia/Shanghai首次启动时自动创建指定数据库和用户。密码应使用强密码并避免硬编码。
实战配置示例
基础部署模板:
version: '3.8' services: mysql: image: mysql:8.0 container_name: mysql-dev restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: "rootpass" MYSQL_DATABASE: mydb volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:生产级增强版本:
version: '3.8' services: mysql: image: mysql:8.0.36 container_name: mysql-prod restart: unless-stopped ports: - "3307:3306" environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} TZ: Asia/Shanghai volumes: - mysql_prod_data:/var/lib/mysql - ./conf:/etc/mysql/conf.d - ./logs:/var/log/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 30s timeout: 10s retries: 3 deploy: resources: limits: memory: 2G cpus: '2' volumes: mysql_prod_data:生产配置引入健康检查、资源限制,密码通过环境变量注入避免泄露。
部署执行:启动命令与操作流程
一键启动与后台运行
在docker-compose.yml所在目录执行:
docker-compose up -d-d参数使容器后台运行。启动过程输出日志显示初始化进度。验证服务状态:
docker-compose ps docker-compose logs -f mysql常用运维指令集
- 服务管理:
docker-compose stop # 停止服务 docker-compose restart # 重启服务 docker-compose down # 停止并移除容器(保留数据卷) docker-compose down -v # 停止并移除容器及数据卷- 容器操作:
docker-compose exec mysql mysql -uroot -p # 进入MySQL命令行 docker-compose top mysql # 查看进程资源使用连接测试与验证
宿主机连接测试:
mysql -h 127.0.0.1 -P 3306 -u root -p输入配置的root密码,成功连接即证明部署正常。容器内验证数据目录持久化:
docker-compose exec mysql ls -la /var/lib/mysql应看到数据库文件已生成。
进阶配置:高级功能与优化
网络配置与内部通信
创建自定义网络实现服务隔离:
networks: db-net: driver: bridge ipam: config: - subnet: 172.20.0.0/24服务声明networks: - db-net后,同一网络内容器可通过服务名直接通信。
时区与字符集优化
确保时区一致:环境变量TZ: Asia/Shanghai配合配置文件default-time-zone='+08:00'。字符集统一UTF-8:在conf/my.cnf中添加:
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci启动初始化脚本
SQL脚本放置于init/目录,Compose自动执行:
volumes: - ./init:/docker-entrypoint-initdb.d容器首次启动时按字母顺序执行.sql、.sh文件,实现数据库结构初始化。
最佳实践与故障排查
生产环境建议
- 版本固定:使用具体版本标签如
mysql:8.0.36,避免latest导致意外升级 - 密码安全:通过
.env文件管理敏感信息,禁止硬编码密码 - 备份策略:定期备份数据卷,结合binlog实现时间点恢复
常见问题诊断
- 端口冲突:修改宿主机端口映射或停止占用进程
- 连接失败:检查防火墙规则,验证容器网络配置
- 权限问题:确保挂载目录权限正确(
chown -R 999:999) - 数据异常:验证卷挂载路径,检查磁盘空间
结尾:总结与扩展应用
Docker Compose将MySQL部署简化为声明式配置,实现环境一致性、快速部署和数据持久化。后续可集成监控工具(Prometheus+mysqld_exporter)、自动备份方案,或扩展为高可用集群(主从复制、Group Replication),构建完整的数据服务栈。