在京东云ECS实例上通过Docker运行MySQL,需兼顾稳定性、安全性、性能和可维护性。以下是关键注意事项与最佳实践配置建议(按优先级分类):
✅ 一、基础环境准备
-
ECS选型建议
- 系统盘:≥100GB SSD(避免系统盘跑满影响MySQL写入)
- 内存:MySQL容器建议至少 2GB RAM(
innodb_buffer_pool_size至少设为物理内存的50%~75%,但需预留1GB给宿主机和Docker) - CPU:≥2核(高并发场景建议4核+)
- 禁用Swap(强烈推荐):MySQL对swap敏感,可通过
sudo swapoff -a && sudo sysctl vm.swappiness=0临时禁用,并在/etc/fstab中注释swap行永久生效。
-
Docker版本与内核
- 使用 Docker 20.10+(支持cgroup v2,更稳定)
- Linux内核 ≥ 4.15(推荐 Ubuntu 22.04 / CentOS 7.9+ 或 Alibaba Cloud Linux 3)
✅ 二、MySQL容器核心配置(docker run 或 docker-compose.yml)
# docker-compose.yml 示例(生产推荐)
version: '3.8'
services:
mysql:
image: mysql:8.0.33 # 明确指定小版本(避免自动升级导致兼容问题)
container_name: mysql-prod
restart: unless-stopped # 故障自动恢复
environment:
MYSQL_ROOT_PASSWORD: "YourStrongPass123!" # ⚠️ 生产勿用默认root密码,应使用mysql_native_password插件+独立账号
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: "AppUserPass456!"
TZ: Asia/Shanghai
command:
--default-authentication-plugin=mysql_native_password # 兼容旧客户端(如Navicat、部分Java驱动)
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--innodb-buffer-pool-size=1G # 根据ECS内存调整(例:4GB ECS → 设为2G~2.5G)
--max-connections=200
--log-bin=mysql-bin # 启用binlog(主从/备份必需)
--server-id=1
--expire-logs-days=7
--slow-query-log=1
--long-query-time=2
--bind-address=0.0.0.0 # 允许容器内监听所有地址(Docker网络隔离已保障安全)
volumes:
- /data/mysql/conf:/etc/mysql/conf.d:ro # 自定义配置挂载(只读)
- /data/mysql/data:/var/lib/mysql:rw,Z # 数据目录(Z=SELinux标签,阿里云/京东云部分镜像需)
- /data/mysql/logs:/var/log/mysql:rw,Z
- /etc/localtime:/etc/localtime:ro # 同步宿主机时区
ports:
- "3306:3306" # ⚠️ 生产环境建议:**不暴露3306到公网!** 仅限VPC内网访问
networks:
- app-net
ulimits:
nofile:
soft: 65536
hard: 65536
🔑 关键点说明:
:Z挂载选项:解决 SELinux 权限问题(京东云部分CentOS镜像启用SELinux)ulimits:避免连接数过多触发Too many open files错误restart: unless-stopped:保障服务高可用
✅ 三、数据持久化与备份(重中之重!)
| 风险 | 解决方案 |
|---|---|
| ❌ 容器删除导致数据丢失 | ✅ 强制绑定宿主机绝对路径卷(如 /data/mysql/data),禁止使用匿名卷或--tmpfs |
| ❌ ECS系统盘故障 | ✅ 将 /data/mysql 挂载到京东云云硬盘(SSD),并开启云硬盘自动快照策略(建议每24小时1次) |
| ❌ 误删库/表 | ✅ 每日定时 mysqldump + binlog 增量备份(脚本示例见下文)✅ 备份文件同步至京东云对象存储(JD Cloud OSS) |
备份脚本示例(/backup/mysql_backup.sh):
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/mysql"
mkdir -p $BACKUP_DIR
# 全量备份(保留7天)
docker exec mysql-prod mysqldump -u root -p'YourStrongPass123!' --all-databases --single-transaction > $BACKUP_DIR/full_$DATE.sql
find $BACKUP_DIR -name "full_*.sql" -mtime +7 -delete
# 上传至OSS(需提前配置ossutil)
ossutil cp $BACKUP_DIR/full_$DATE.sql oss://my-backup-bucket/mysql/
✅ 设置 crontab:
0 2 * * * /backup/mysql_backup.sh
✅ 四、安全加固(京东云特有注意项)
-
网络隔离
- 在京东云控制台:将ECS加入专有网络(VPC),安全组仅放行内网IP段(如
10.0.0.0/8)访问3306端口,禁止0.0.0.0/0 - 若需网络访问:必须通过 京东云云堡垒机 或 SSH隧道,严禁直接暴露3306到公网
- 在京东云控制台:将ECS加入专有网络(VPC),安全组仅放行内网IP段(如
-
MySQL账户最小权限原则
-- 创建应用专用账号(禁止root远程登录) CREATE USER 'appuser'@'10.0.10.%' IDENTIFIED BY 'StrongPass!'; GRANT SELECT,INSERT,UPDATE,DELETE ON myapp.* TO 'appuser'@'10.0.10.%'; FLUSH PRIVILEGES; -
启用SSL(可选但推荐)
- 生成证书后挂载进容器:
volumes: - /data/mysql/certs:/etc/mysql/ssl:ro command: ... --ssl-ca=/etc/mysql/ssl/ca.pem --ssl-cert=/etc/mysql/ssl/server-cert.pem --ssl-key=/etc/mysql/ssl/server-key.pem
- 生成证书后挂载进容器:
✅ 五、监控与日志
| 目标 | 实施方式 |
|---|---|
| 性能监控 | 安装 京东云云监控Agent,自定义采集 MySQL SHOW STATUS / SHOW GLOBAL VARIABLES 指标 |
| 慢查询分析 | 挂载日志卷 + 使用 pt-query-digest 分析:docker exec mysql-prod pt-query-digest /var/log/mysql/slow.log |
| 错误日志告警 | 用 tail -f /data/mysql/logs/error.log | grep -i "error|warning" + 钉钉Webhook |
⚠️ 六、避坑指南(京东云常见问题)
| 问题 | 原因 | 解决方案 |
|---|---|---|
Can't start server: Bind on TCP/IP port: Address already in use |
宿主机3306被占用(如ECS预装MySQL) | sudo netstat -tulnp | grep :3306 → sudo systemctl stop mysqld |
InnoDB: mmap(137428992 bytes) failed; errno 12 |
内存不足或vm.max_map_count过低 |
sudo sysctl -w vm.max_map_count=262144 + 加入 /etc/sysctl.conf |
| 容器启动后立即退出 | MySQL初始化失败(如权限错误、配置语法错) | 查看日志:docker logs mysql-prod;检查 /data/mysql/data 是否为空且属主为 mysql:mysql(可加 --user mysql) |
| 京东云ECS磁盘IO延迟高 | 云硬盘未开启“高性能模式” | 控制台 → 云硬盘 → 编辑 → 开启“高性能模式”(需重启ECS) |
✅ 七、生产就绪 Checklist
- [ ] ✅ 数据目录挂载到独立云硬盘(非系统盘)
- [ ] ✅
innodb_buffer_pool_size已根据内存合理设置 - [ ] ✅ 安全组严格限制3306访问源IP(仅VPC内网)
- [ ] ✅ root密码已修改,应用使用独立低权限账号
- [ ] ✅ 已配置每日全量备份 + binlog + OSS异地存储
- [ ] ✅ 已部署云监控 + 慢日志分析机制
- [ ] ✅
docker-compose.yml已纳入Git管理,配置版本化
如需进一步帮助,可提供:
🔹 您的ECS规格(CPU/内存/系统盘类型)
🔹 MySQL用途(OLTP/报表/开发测试?)
🔹 是否需要主从复制或读写分离?
我可为您定制化 docker-compose.yml 和备份/监控脚本 👇
💡 最后提醒:生产环境强烈建议使用京东云RDS for MySQL(免运维、自动备份、高可用、审计日志),Docker仅推荐用于开发测试、轻量级业务或特殊定制需求场景。
CLOUD云计算