在京东云ECS实例上通过Docker运行MySQL,虽便捷但需兼顾安全性、稳定性、性能和可维护性。以下是关键配置注意事项(按优先级和场景分类):
✅ 一、基础安全与合规(必须项)
-
禁止使用
root用户暴露于网络- 启动容器时禁用
--privileged,不挂载宿主机敏感目录(如/etc、/root)。 - 使用
--user 999:999(非root用户)运行MySQL(需镜像支持,推荐mysql:8.0+或自定义Dockerfile切换用户)。 - 强制设置强密码:通过
-e MYSQL_ROOT_PASSWORD=xxx或更安全的--secret(Docker 20.10+)方式传入。
- 启动容器时禁用
-
网络隔离
- 禁用
--network host:避免MySQL端口(3306)直接暴露在宿主机网络中。 - 使用自定义桥接网络 + 显式端口映射:
docker network create mysql-net docker run -d --name mysql-prod --network mysql-net -p 127.0.0.1:3306:3306 # 仅允许本机访问(推荐) # 或 -p 3306:3306(若需X_X访问,见下条) -e MYSQL_ROOT_PASSWORD=... -v /data/mysql:/var/lib/mysql -v /etc/mysql/conf.d:/etc/mysql/conf.d:ro mysql:8.0 - ⚠️ 若需X_X访问(不推荐生产):
- 必须在京东云控制台安全组中严格限制源IP(如只放行应用服务器IP);
- 禁止开放到
0.0.0.0/0; - 建议通过京东云SLB或NAT网关做二次访问控制。
- 禁用
✅ 二、数据持久化与可靠性(核心)
-
强制绑定挂载(Bind Mount)或命名卷(Named Volume)
- ❌ 禁止使用
--tmpfs或无挂载运行(容器销毁即丢库)。 - ✅ 推荐方式(京东云ECS建议):
# 创建高性能云硬盘(SSD)挂载到 /data/mysql(需提前格式化并挂载到ECS) # 然后: -v /data/mysql:/var/lib/mysql:rw,Z # Z 表示SELinux标签(如启用) - 数据目录权限:确保宿主机目录属主为
999:999(MySQL 8.0默认用户),执行:sudo chown -R 999:999 /data/mysql sudo chmod -R 750 /data/mysql
- ❌ 禁止使用
-
配置文件外部化管理
- 创建
/etc/mysql/conf.d/my.cnf(宿主机路径),挂载只读:[mysqld] # 必须项 skip-host-cache skip-name-resolve default-authentication-plugin=mysql_native_password # 兼容旧客户端 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # 性能与安全 max_connections=200 wait_timeout=28800 interactive_timeout=28800 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 日志(重要!) log-error=/var/log/mysql/error.log slow_query_log=ON slow_query_log_file=/var/log/mysql/slow.log long_query_time=2
- 创建
✅ 三、性能与资源控制(京东云ECS适配)
-
限制容器资源,防止单点故障
- 根据ECS规格合理分配:
--memory=4g --memory-swap=4g --cpus=2 --pids-limit=512 - 避免内存超卖:MySQL实际内存占用 ≈
innodb_buffer_pool_size+ 连接内存,建议该参数设为宿主机内存的 50%~70%(需在my.cnf中配置)。
- 根据ECS规格合理分配:
-
存储I/O优化
- 京东云ECS挂载的云硬盘(尤其SSD云盘)需开启
noatime,nobarrier(挂载选项); - MySQL配置中启用:
innodb_flush_method=O_DIRECT # 避免双重缓存(Linux ext4/xfs推荐) innodb_use_native_aio=ON # 启用异步IO(需内核支持)
- 京东云ECS挂载的云硬盘(尤其SSD云盘)需开启
✅ 四、高可用与运维保障(生产必备)
| 场景 | 推荐方案 |
|---|---|
| 备份 | 每日 mysqldump + mysqlpump 或物理备份(Percona XtraBackup);备份文件同步至京东云对象存储(JD Cloud OSS) |
| 监控 | 部署 mysqld_exporter + Prometheus + Grafana;或接入京东云云监控(需安装CloudMonitor Agent) |
| 日志 | 容器日志驱动设为 json-file 并限制大小:--log-driver json-file --log-opt max-size=100m --log-opt max-file=3错误日志、慢日志挂载到宿主机统一收集(如Filebeat→ES) |
| 升级与回滚 | 使用 docker tag 管理版本;备份数据卷后再升级镜像;避免 latest 标签用于生产 |
⚠️ 五、京东云特有注意事项
- 内网DNS解析:ECS默认使用京东云内网DNS(如
100.100.2.136),确保MySQL容器能解析内网服务(如Redis、其他DB)。测试命令:docker exec mysql-prod nslookup redis.internal.jdcloud - 时间同步:京东云ECS已默认启用NTP(
chronyd),但MySQL容器内仍建议挂载宿主机时区:-v /etc/localtime:/etc/localtime:ro - 安全组 & VPC:MySQL容器应部署在私有子网(Private Subnet),仅应用服务器所在安全组可访问3306端口;禁止公网直接访问。
✅ 六、最小化启动示例(生产就绪)
docker run -d
--name mysql-prod
--restart=unless-stopped
--network mysql-net
--ip 172.20.0.10
-p 127.0.0.1:3306:3306
--memory=4g --cpus=2
--user 999:999
-e MYSQL_ROOT_PASSWORD='StrongPass!2024'
-e MYSQL_DATABASE=app_db
-v /data/mysql:/var/lib/mysql:rw,Z
-v /etc/mysql/conf.d:/etc/mysql/conf.d:ro
-v /var/log/mysql:/var/log/mysql:rw,Z
-v /etc/localtime:/etc/localtime:ro
--log-driver json-file --log-opt max-size=100m --log-opt max-file=3
--health-cmd="mysqladmin ping -h127.0.0.1 -uroot -p${MYSQL_ROOT_PASSWORD}"
--health-interval=30s --health-timeout=10s --health-retries=3
mysql:8.0.33
💡 最后建议:
- 生产环境优先考虑京东云云数据库RDS for MySQL(自动备份、高可用、审计、一键扩容);
- Docker部署MySQL更适合开发测试、CI/CD环境、轻量级业务或需深度定制的场景;
- 所有配置变更前务必在测试环境验证,并保留完整备份!
如需我提供:
- 完整的
my.cnf生产级模板(含京东云SSD优化参数) - 自动化备份脚本(上传OSS + 清理策略)
- Prometheus监控指标告警规则
欢迎随时告知,可立即生成 👇
轻量云Cloud