在京东云ECS实例上通过Docker运行MySQL,需兼顾安全性、稳定性、性能、数据持久性及云环境适配性。以下是关键配置注意事项与最佳实践(按优先级和场景分类):
✅ 一、核心安全配置(必须项)
| 项目 | 推荐配置 | 说明 |
|---|---|---|
| 禁止 root 远程登录 | --env MYSQL_ROOT_PASSWORD=xxx + 不暴露3306端口给公网 |
默认root密码需强密码;严禁将3306映射到0.0.0.0:3306(尤其ECS有公网IP时)。如需远程访问,应: • 仅绑定内网IP: -p 127.0.0.1:3306:3306• 或通过京东云安全组限制源IP(如仅允许跳板机/应用服务器IP) • 或使用京东云云数据库X_X/私有网络VPC互通替代直接暴露 |
| 非root用户与最小权限原则 | 创建专用用户并授权:CREATE USER 'app'@'%' IDENTIFIED BY 'strong_pwd'; GRANT SELECT,INSERT ON mydb.* TO 'app'@'%'; |
避免应用使用root连接;生产环境禁用%通配符,改用具体内网IP或子网(如'app'@'10.0.0.%') |
| 禁用符号链接 & 本地文件读取 | 添加启动参数:--secure-file-priv=/tmp/mysql-files(并确保该目录存在且权限受限) |
防止利用LOAD DATA INFILE或SELECT ... INTO OUTFILE进行恶意文件操作 |
| 启用SSL(推荐) | 挂载自签名或京东云SSL证书,并配置:--ssl-ca=/etc/mysql/certs/ca.pem --ssl-cert=/etc/mysql/certs/server-cert.pem --ssl-key=/etc/mysql/certs/server-key.pem |
尤其跨VPC或公网传输时必备;京东云可申请免费SSL证书 |
✅ 二、数据持久化与可靠性(强推荐)
| 项目 | 正确做法 | ❌ 错误示例 |
|---|---|---|
| 必须使用命名卷或挂载宿主机目录 | docker run -v mysql-data:/var/lib/mysql ... 或 -v /data/mysql:/var/lib/mysql |
docker run -v /tmp/mysql:/var/lib/mysql(临时目录无保障) |
| 宿主机目录权限修复 | 启动前执行:sudo mkdir -p /data/mysqlsudo chown -R 999:999 /data/mysql(MySQL容器默认用户ID为999) |
忽略权限 → 容器启动失败(Permission denied) |
| 定期备份策略 | • 使用mysqldump定时快照(挂载备份卷)• 或京东云对象存储(JDOS)自动上传 • 配合京东云云硬盘快照(对挂载的云硬盘做快照) |
仅依赖容器层备份(重启即丢) |
💡 京东云特别提示:
- 建议将MySQL数据目录挂载到高性能云硬盘(SSD),而非系统盘(IOPS低、容量小);
- 开启云硬盘自动快照策略(如每天1次,保留7天),作为灾难恢复兜底。
✅ 三、性能与资源控制(避免OOM/IO瓶颈)
| 项目 | 推荐配置 | 说明 |
|---|---|---|
| 内存限制 | --memory=2g --memory-swap=2g --oom-kill-disable=false |
防止MySQL耗尽ECS内存导致OOM Killer杀进程;务必设置合理上限(根据ECS规格预留50%内存给系统) |
| CPU限制 | --cpus="2.5"(避免超卖影响其他服务) |
若ECS为共享型实例,建议限制CPU避免争抢 |
| MySQL配置优化 | 通过my.cnf挂载定制: |
关键参数示例(适用于4C8G ECS):ini<br>[mysqld]<br>innodb_buffer_pool_size = 4G<br>max_connections = 200<br>innodb_log_file_size = 256M<br>skip-host-cache<br>skip-name-resolve<br>⚠️ 注意: innodb_buffer_pool_size ≤ 容器内存限制的70% |
| 禁用swap交换 | --memory-swappiness=0 |
避免MySQL因swap抖动导致性能暴跌 |
✅ 四、高可用与运维友好性
| 项目 | 实践建议 | |
|---|---|---|
| 健康检查 | 添加--health-cmd="mysqladmin ping -h127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD" --health-interval=30s |
便于Docker监控及K8s探针集成 |
| 日志管理 | • MySQL日志重定向到stdout/stderr(方便docker logs)• 或挂载日志卷: -v /data/mysql/logs:/var/log/mysql• 京东云日志服务(JDLA)接入:采集慢查询日志、错误日志 |
|
| 升级与回滚 | • 使用docker commit保存镜像快照• 或基于 docker-compose.yml定义版本(如mysql:8.0.33)• 禁止直接 apt upgrade更新容器内MySQL(破坏不可变性) |
|
| 网络模式 | --network jdcloud-vpc(自定义Docker网络桥接京东云VPC) |
确保与同VPC内其他服务(如Redis、应用服务器)低延迟互通,避免NAT损耗 |
⚠️ 五、京东云ECS特有注意事项
-
安全组(Security Group)
- 入方向规则:仅放行应用服务器内网IP段的3306端口,禁止0.0.0.0/0;
- 出方向:MySQL需访问网络(如下载插件)?建议关闭,改用京东云NAT网关白名单。
-
云硬盘(Cloud Disk)
- 选择SSD云硬盘(非普通云硬盘),并开启多副本;
- 格式化时使用
xfs(比ext4更适合MySQL大文件IO); - 挂载参数添加
noatime,nobarrier(提升IO性能,需确认业务可接受)。
-
监控告警
- 在京东云控制台开启云监控(JCM),配置:
• MySQL连接数 > 90%阈值告警
• 磁盘使用率 > 85%告警
• CPU持续 > 95%告警
- 在京东云控制台开启云监控(JCM),配置:
-
合规与审计
- 开启MySQL通用查询日志(谨慎!仅调试期)或慢查询日志;
- 结合京东云操作审计(JDA) 记录所有ECS操作(如Docker命令执行人、时间)。
✅ 六、推荐启动命令(生产级精简版)
docker run -d
--name mysql-prod
--restart=unless-stopped
--network jdcloud-vpc
--ip 10.0.0.100 # 静态IP(需提前创建自定义Docker网络)
--memory=4g --memory-swap=4g --cpus=2
--ulimit nofile=65536:65536
--health-cmd="mysqladmin ping -h127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD"
--mount type=bind,source=/data/mysql/conf/my.cnf,target=/etc/mysql/my.cnf,readonly
--mount type=volume,source=mysql-data,target=/var/lib/mysql
--mount type=volume,source=mysql-logs,target=/var/log/mysql
-e MYSQL_ROOT_PASSWORD='StrongP@ssw0rd2024!'
-e TZ=Asia/Shanghai
-p 127.0.0.1:3306:3306
-d mysql:8.0.33
--default-authentication-plugin=mysql_native_password
🔑 最后检查清单:
- [ ] 安全组仅允许可信内网IP访问3306
- [ ] 数据目录挂载到SSD云硬盘且权限正确(chown 999)
- [ ]
my.cnf中bind-address=127.0.0.1(若仅本地访问)或0.0.0.0(配合安全组)- [ ] 已配置京东云云监控+告警
- [ ] 备份脚本已部署并验证可恢复
如需进一步支持,可提供:
🔹 完整 docker-compose.yml 示例(含主从复制)
🔹 京东云VPC+Docker网络打通方案
🔹 自动化备份到JDOS的Shell脚本
🔹 MySQL 8.0+ SSL双向认证配置详解
欢迎补充您的ECS规格(CPU/内存/磁盘类型)和业务场景(OLTP/分析/开发测试),我可为您定制优化建议。
云服务器