以下是使用 Docker Compose 部署 MySQL 的完整方案,包含最佳实践配置:
1. 创建 docker-compose.yml
文件
yaml
version: '3.8'
services:
mysql:
image: mysql:8.0.34 # 建议指定具体版本
container_name: mysql-server
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-StrongPassword123!} # 从环境变量读取,默认值作为后备
MYSQL_DATABASE: ${DB_NAME:-myapp_db}
MYSQL_USER: ${DB_USER:-app_user}
MYSQL_PASSWORD: ${DB_PASSWORD:-UserPassword123!}
TZ: Asia/Shanghai # 设置时区
ports:
- "${DB_PORT:-3306}:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./mysql/conf.d:/etc/mysql/conf.d # 自定义配置
- ./mysql/initdb:/docker-entrypoint-initdb.d # 初始化SQL脚本
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3
restart: unless-stopped
networks:
- backend-network
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--max_connections=200
--default-authentication-plugin=mysql_native_password
volumes:
mysql_data: # 命名卷实现数据持久化
networks:
backend-network:
driver: bridge
2. 创建配置文件目录结构
bash
mkdir -p {mysql/conf.d,mysql/initdb}
3. 添加自定义配置 (可选)
在 mysql/conf.d/my-custom.cnf
中添加:
ini
[mysqld]
skip-name-resolve
innodb_buffer_pool_size = 256M
log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
4. 添加初始化脚本 (可选)
在 mysql/initdb/01-create-tables.sql
中添加:
sql
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
5. 使用环境变量文件 (推荐)
创建 .env
文件:
ini
# MySQL 配置
DB_ROOT_PASSWORD=YourSecureRootPassword
DB_NAME=production_db
DB_USER=admin_user
DB_PASSWORD=Admin@1234
DB_PORT=3307 # 避免与宿主机MySQL冲突
6. 启动服务
bash
docker-compose up -d # 后台启动
7. 管理命令
bash
# 查看日志
docker-compose logs -f mysql
# 进入容器
docker-compose exec mysql bash
# 连接MySQL
docker-compose exec mysql mysql -u root -p
# 安全关闭
docker-compose down --volumes # 警告:这会删除数据卷
8. 备份方案
创建 backup.sh
脚本:
bash
#!/bin/bash
BACKUP_DIR=/path/to/backups
DATE=$(date +%Y%m%d_%H%M%S)
docker-compose exec -T mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > $BACKUP_DIR/full_backup_$DATE.sql
高级功能扩展
- 主从复制配置:可扩展为多节点集群
- 监控集成:添加Prometheus监控
- PHPMyAdmin:添加管理界面服务
- 连接池:配合ProxySQL使用
💡 提示:生产环境建议使用 secrets 管理密码,可通过
docker-compose secrets
配置