Docker Compose 部署 MySQL
MySQL 作为最流行的开源关系型数据库之一,通过 Docker Compose 部署可以简化安装过程并确保环境一致性。以下是详细的部署方法和最佳实践。
一、基础部署方案
1. 单节点基础配置
yaml
version: "3.8"
services:
mysql:
image: mysql:8.0
container_name: mysql-server
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: app_db
MYSQL_USER: app_user
MYSQL_PASSWORD: userpassword
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- ./data:/var/lib/mysql
- ./conf/my.cnf:/etc/mysql/conf.d/my.cnf
restart: unless-stopped
关键配置说明:
MYSQL_ROOT_PASSWORD
:设置 root 用户密码(生产环境建议使用复杂密码)volumes
:实现数据持久化和配置自定义restart
:确保容器异常退出后自动重启
2. 生产环境推荐配置
yaml
version: "3.8"
services:
mysql:
image: mysql:8.0.34
container_name: production_mysql
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
TZ: Asia/Shanghai
ports:
- "${DB_PORT}:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./config/my.cnf:/etc/mysql/conf.d/my.cnf:ro
networks:
- backend
deploy:
resources:
limits:
cpus: "2"
memory: 2G
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3
volumes:
mysql_data:
driver: local
driver_opts:
type: none
device: ./data/mysql
o: bind
networks:
backend:
driver: bridge
生产环境增强特性:
- 资源限制防止单个服务耗尽主机资源
- 健康检查确保服务可用性
- 独立网络增强安全性
- 使用环境变量文件(.env)管理敏感信息
二、高级配置技巧
1. 主从复制集群
yaml
services:
mysql-master:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: masterpass
MYSQL_REPLICATION_USER: repl_user
MYSQL_REPLICATION_PASSWORD: repl_pass
command:
- --server-id=1
- --log-bin=mysql-bin
- --binlog-format=ROW
volumes:
- master_data:/var/lib/mysql
networks:
- mysql-cluster
mysql-slave:
image: mysql:8.0
depends_on:
- mysql-master
environment:
MYSQL_ROOT_PASSWORD: slavepass
MYSQL_MASTER_HOST: mysql-master
MYSQL_MASTER_USER: repl_user
MYSQL_MASTER_PASSWORD: repl_pass
command:
- --server-id=2
volumes:
- slave_data:/var/lib/mysql
networks:
- mysql-cluster
volumes:
master_data:
slave_data:
networks:
mysql-cluster:
driver: bridge
主从复制关键点:
- 每个节点需要唯一 server-id
- 主节点需开启二进制日志
- 从节点通过环境变量连接主节点
2. 多环境配置管理
使用扩展配置实现开发/生产环境差异化:
base-compose.yml (基础配置):
yaml
services:
mysql:
image: mysql:${MYSQL_VERSION:-8.0}
volumes:
- ${DATA_VOLUME:-mysql_data}:/var/lib/mysql
docker-compose.prod.yml (生产环境扩展):
yaml
services:
mysql:
extends:
file: base-compose.yml
service: mysql
environment:
- MYSQL_ROOT_PASSWORD=${PROD_DB_PASSWORD}
deploy:
resources:
limits:
memory: 4G
通过不同环境变量文件切换配置
三、安全加固方案
1. 基础安全配置
yaml
services:
mysql:
image: mysql:8.0
user: "999:999" # 使用非root用户运行
cap_drop:
- ALL # 移除所有特权
security_opt:
- no-new-privileges:true
environment:
- MYSQL_SECURE_TRANSPORT=ON
- MYSQL_SSL=ON
volumes:
- ./ssl:/etc/mysql/ssl # SSL证书目录
2. 网络隔离
yaml
networks:
internal:
internal: true # 内部专用网络
external:
driver: bridge
services:
mysql:
networks:
- internal # 数据库只连接内部网络
app:
networks:
- internal
- external # 应用可连接内外网络
通过网络隔离限制数据库暴露范围
四、性能优化建议
1. 关键参数调优
在 my.cnf 配置文件中添加:
ini
[mysqld]
innodb_buffer_pool_size = 4G # 物理内存的70%-80%
innodb_log_file_size = 1G
table_open_cache = 2000
max_connections = 500
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
2. 容器资源限制
yaml
deploy:
resources:
limits:
cpus: "4"
memory: 8G
reservations:
memory: 6G
根据服务器资源配置合理的资源限制
五、日常运维管理
1. 常用命令
bash
# 启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f mysql
# 执行备份
docker-compose exec mysql mysqldump -u root -p${DB_ROOT_PASSWORD} --all-databases > backup.sql
# 进入MySQL命令行
docker-compose exec mysql mysql -uroot -p
2. 备份与恢复方案
定时备份服务配置:
yaml
services:
backup:
image: mysql:8.0
depends_on:
- mysql
volumes:
- ./backups:/backups
command: >
sh -c 'while true; do
sleep 86400;
mysqldump -h mysql -u root -p$$MYSQL_ROOT_PASSWORD --all-databases | gzip > /backups/backup_$$(date +%Y%m%d).sql.gz;
done'
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
数据恢复流程:
bash
# 停止服务
docker-compose stop mysql
# 恢复数据
docker-compose run --rm mysql bash -c "gunzip < /backups/backup_20230101.sql.gz | mysql -u root -p${DB_ROOT_PASSWORD}"
# 重启服务
docker-compose start mysql
确保重要数据定期备份
六、常见问题排查
容器启动后立即退出
- 检查数据目录权限:
chown -R 999:999 data
(MySQL 容器默认 UID/GID) - 查看日志定位具体错误:
docker-compose logs mysql
- 检查数据目录权限:
远程客户端无法连接
- 确认防火墙规则放行端口
- 检查 MySQL 用户权限设置
sqlGRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
初始化脚本未执行
- 确认 SQL 文件已放入
/docker-entrypoint-initdb.d
目录 - 检查文件权限:
chmod +x initdb/*.sql
- 确认 SQL 文件已放入
通过以上方案,您可以快速构建适应不同场景的 MySQL 服务,从开发测试到生产环境都能获得良好的体验。根据实际业务需求调整配置参数,并定期进行压力测试以确保数据库性能满足要求。