在京东云ECS实例上通过Docker运行MySQL,虽便捷但需兼顾稳定性、安全性、性能与可维护性。以下是关键配置注意事项(按优先级和场景分类):
✅ 一、基础安全与合规(必须)
| 项目 | 推荐配置 | 说明 |
|---|---|---|
| MySQL root密码 | 必须通过 -e MYSQL_ROOT_PASSWORD=xxx 指定,禁止空密码或默认密码 |
Docker官方镜像强制要求;京东云环境严禁弱口令,建议使用16位以上含大小写字母+数字+符号的强密码 |
| 非root用户隔离 | 创建专用数据库用户(如 app_user),授权最小权限(GRANT SELECT,INSERT ON db.* TO 'app_user'@'%') |
避免应用直连 root,符合等保2.0最小权限原则 |
| 端口暴露控制 | ❌ 禁止 docker run -p 3306:3306 直接暴露公网;✅ 仅绑定内网IP(如 -p 127.0.0.1:3306:3306)或通过京东云安全组+VPC网络策略限制访问源IP |
京东云ECS若分配公网IP,直接暴露3306是高危行为,易遭暴力破解/SQL注入扫描 |
| 镜像来源 | 仅使用官方 mysql:8.0(推荐8.0.33+ LTS)或京东云可信镜像仓库(如 jdcloud/jdcloud-mysql:8.0) |
避免第三方不明镜像,防范后门风险 |
⚙️ 二、持久化与数据可靠性(核心)
| 项目 | 正确做法 | 错误示例 | 原因 |
|---|---|---|---|
| 数据卷挂载 | 使用命名卷(推荐) 或 宿主机绝对路径挂载:-v mysql-data:/var/lib/mysql或 -v /data/mysql:/var/lib/mysql |
--volumes-from other-container 或 未挂载 |
容器删除即丢失所有数据!京东云ECS系统盘为云硬盘,但容器层无持久化机制 |
| 配置文件外部化 | 将 my.cnf 挂载到容器内:-v /etc/mysql/my.cnf:/etc/mysql/my.cnf:ro |
修改容器内配置后未持久化 | 便于统一管理、审计、版本控制;避免容器重启后配置丢失 |
| 备份策略 | ✅ 结合京东云云硬盘快照 + 容器内定时 mysqldump 导出到OSS(京东云对象存储)✅ 使用 --log-bin 开启二进制日志(需配置 binlog_format=ROW) |
仅依赖容器卷,无异地备份 | 满足等保对数据备份RPO/RTO要求;OSS提供跨可用区容灾能力 |
🚀 三、性能与稳定性调优
| 场景 | 关键参数 | 配置建议 | 依据 |
|---|---|---|---|
| 内存限制 | --memory=2g --memory-swap=2g |
根据ECS规格设置(如4C8G ECS建议MySQL容器内存≤4G),禁止不设限制 | 防止OOM Killer杀进程;京东云监控可查看内存水位 |
| InnoDB缓冲池 | 在 my.cnf 中设置:innodb_buffer_pool_size = 1G(约为可用内存50%~75%) |
默认值(128M)严重不足 | 直接影响查询性能,尤其读密集型业务 |
| 连接数 | max_connections = 200(根据ECS CPU核数×50估算) |
过高导致线程开销大,过低引发连接拒绝 | 结合京东云监控中的 ConnectionCount 指标动态调整 |
| 时区与字符集 | 启动时指定:-e TZ=Asia/Shanghai -e MYSQL_TIME_ZONE='+08:00'并在 my.cnf 中设置:[client] default-character-set = utf8mb4[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci |
使用 latin1 或未设时区 |
避免中文乱码、时间错乱(京东云服务器默认UTC,需显式同步) |
🔧 四、运维与可观测性(生产必需)
| 项目 | 实施方式 | 京东云集成建议 |
|---|---|---|
| 日志管理 | -v /var/log/mysql:/var/log/mysql + 配置 log_error = /var/log/mysql/error.log |
接入京东云日志服务(JDCloud Log Service),实时采集错误日志、慢查询日志(slow_query_log=ON) |
| 健康检查 | Docker原生健康检查:--health-cmd="mysqladmin ping -h localhost -u root -p$$MYSQL_ROOT_PASSWORD" --health-interval=30s |
配合京东云云监控自定义监控项,告警通知钉钉/企业微信 |
| 容器编排 | 生产环境禁用 docker run,改用 docker-compose.yml(带重启策略 restart: unless-stopped)或京东云容器服务(JDCloud Kubernetes Service, JKCS) |
利用JKCS实现滚动更新、多副本高可用、自动扩缩容 |
⚠️ 五、京东云特有注意事项
-
安全组规则
- 仅放行业务ECS所在VPC内网IP段(如
192.168.0.0/16)访问3306端口 - 禁止开放0.0.0.0/0(即使临时调试也不建议)
- 仅放行业务ECS所在VPC内网IP段(如
-
云硬盘IO性能
- MySQL数据目录挂载的云硬盘建议选择SSD云硬盘(非普通云硬盘)
- 单盘IOPS ≥ 3000(参考京东云文档:SSD云硬盘单盘最高30000 IOPS)
-
内核参数优化(宿主机)
# 在ECS上执行(需root),提升MySQL并发能力 echo 'vm.swappiness = 1' >> /etc/sysctl.conf echo 'net.core.somaxconn = 65535' >> /etc/sysctl.conf sysctl -p -
备案与合规
- 若MySQL对外提供Web服务(如通过NginxX_X),需确保ECS已通过京东云ICP备案,且安全组开放80/443端口(非3306!)
✅ 最佳实践启动命令示例(生产环境)
docker run -d
--name mysql-prod
--restart=unless-stopped
--memory=3g --memory-swap=3g
-p 127.0.0.1:3306:3306
-e MYSQL_ROOT_PASSWORD='StrongPass!2024'
-e TZ=Asia/Shanghai
-v /data/mysql:/var/lib/mysql
-v /etc/mysql/my.cnf:/etc/mysql/my.cnf:ro
-v /var/log/mysql:/var/log/mysql
--health-cmd="mysqladmin ping -h localhost -u root -p$$MYSQL_ROOT_PASSWORD"
--health-interval=30s
--network jdcloud-vpc
-d mysql:8.0.33
💡 最后提醒:
- 测试环境:可先用京东云轻量应用服务器快速验证;
- 生产环境:强烈建议直接使用京东云云数据库RDS for MySQL(自动备份、主从高可用、SQL审计、一键扩容),比自建Docker更省心、更合规。
如需我提供 my.cnf 完整模板、Docker Compose配置、或京东云RDS迁移方案,可随时告知!
CLOUD技术博