在京东云ECS实例上通过Docker运行MySQL需要注意哪些配置?

在京东云ECS实例上通过Docker运行MySQL,虽便捷但需兼顾稳定性、安全性、性能与可维护性。以下是关键配置注意事项(按优先级和实践重要性组织):


✅ 一、基础环境准备

  1. ECS选型建议

    • 内存 ≥ 4GB(MySQL容器本身 + OS + 其他服务),生产环境建议 ≥ 8GB;
    • 系统盘建议SSD(如云硬盘GP3),数据盘务必挂载独立高性能云硬盘(如SSD云硬盘)并挂载至 /data/mysql,避免使用系统盘存储数据(防IO争抢、扩容难、快照/备份受限);
    • 操作系统推荐 CentOS 7.9+/Alibaba Cloud Linux 3/Ubuntu 20.04+(内核稳定、Docker兼容性好)。
  2. Docker安装与配置

    • 使用京东云官方镜像或标准源安装 Docker CE(≥20.10),启用 systemd 管理;
    • 配置 Docker 数据根目录到高性能数据盘(如 /data/docker),避免 /var/lib/docker 占满系统盘:
      // /etc/docker/daemon.json
      {
      "data-root": "/data/docker",
      "storage-driver": "overlay2",
      "log-driver": "json-file",
      "log-opts": {
       "max-size": "100m",
       "max-file": "3"
      }
      }
    • 重启 Docker:sudo systemctl restart docker

✅ 二、MySQL容器核心配置(强烈建议使用 docker rundocker-compose.yml 显式声明)

🔐 安全配置(必做)

项目 推荐配置 说明
Root密码 MYSQL_ROOT_PASSWORD=your_strong_password ❌ 禁用空密码;密码需含大小写字母+数字+符号,长度≥12位
非root用户 创建专用应用用户(如 appuser),仅授必要库/表权限 避免应用直连 root
网络暴露 --publish 3306:3306 → 改为 --publish 127.0.0.1:3306:3306 仅允许本地访问,禁止直接暴露3306到公网!如需远程访问,应通过京东云SLB+安全组白名单+跳板机,或使用VPC内网连接
安全组 ECS安全组:入方向仅放行业务所需端口(如80/443),彻底屏蔽3306公网入站 这是第一道防线!

💾 存储与持久化(关键!)

# ✅ 正确方式:绑定挂载(Bind Mount)到独立云硬盘
docker run -d 
  --name mysql-prod 
  -v /data/mysql/conf:/etc/mysql/conf.d:ro       # 自定义配置
  -v /data/mysql/data:/var/lib/mysql:rw         # 数据目录(必须!)
  -v /data/mysql/logs:/var/log/mysql:rw         # 日志目录(可选但推荐)
  -e MYSQL_ROOT_PASSWORD=... 
  -p 127.0.0.1:3306:3306 
  --restart=unless-stopped 
  -d mysql:8.0.33
  • ❌ 禁止使用 --tmpfs /var/lib/mysql 或匿名卷(数据易丢失);
  • /data/mysql/data 目录需提前创建,并赋予 mysql 用户权限(容器内UID 999):
    sudo mkdir -p /data/mysql/{data,conf,logs}
    sudo chown -R 999:999 /data/mysql/data  # MySQL 8.0 默认用户 UID=999

⚙️ 性能与稳定性配置

配置项 推荐值 说明
内存限制 --memory=4g --memory-reservation=3g 防止OOM Killer杀进程;需根据ECS总内存合理设置(留1~2G给OS)
CPU限制 --cpus="2.5" 避免单实例抢占全部CPU资源(尤其多容器场景)
InnoDB缓冲池 my.cnf 中设 innodb_buffer_pool_size = 2G(≈物理内存50%~75%) ⚠️ 必须显式配置!Docker默认值极小(128MB),严重拖慢性能
日志模式 innodb_flush_log_at_trx_commit=1(强一致性)+ sync_binlog=1(如需主从) 生产环境勿调为0/2(丢数据风险)
最大连接数 max_connections=500(根据业务预估) 避免默认151导致连接拒绝

📜 自定义配置文件(/data/mysql/conf/my.cnf 示例)

[mysqld]
# 基础
skip-host-cache
skip-name-resolve
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# InnoDB
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT

# 连接与超时
max_connections = 500
wait_timeout = 28800
interactive_timeout = 28800

# 日志
log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

# 安全
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

✅ 三、运维与高可用增强(生产必备)

类别 措施 说明
备份 ✅ 每日 mysqldumpmysqlpump + cron + 上传京东云对象存储(OSS) 示例脚本:mysqldump --single-transaction --routines --triggers -u root -p$PASS --all-databases > backup_$(date +%F).sql
监控 集成京东云云监控(JCloud Monitor)或 Prometheus+mysqld_exporter 关注:QPS、连接数、InnoDB Buffer Hit Rate、Slow Queries、磁盘IO等待
升级与维护 使用 docker pull mysql:8.0.x + docker stop && docker rm && docker run(配合卷挂载,数据不丢失) ❗ 升级前务必测试兼容性并备份!
日志管理 Docker日志轮转(见上文 daemon.json) + MySQL错误日志/慢日志定期清理(logrotate 防止日志占满磁盘
网络优化 ECS与MySQL容器同VPC、同可用区;若应用在另一ECS,使用内网IP连接(非127.0.0.1) 降低延迟,提升吞吐

⚠️ 四、常见陷阱与避坑指南

  • 不要用 latest 标签 → 改用 mysql:8.0.33 等固定版本,避免意外升级导致兼容问题;
  • 不要在容器内修改配置后不持久化 → 所有配置必须通过挂载 my.cnf 或环境变量(如 MYSQL_INITDB_SKIP_TZINFO=1);
  • 不要忽略时区 → 启动时加 -e TZ=Asia/Shanghai 并在 my.cnf 中设 default-time-zone='+08:00'
  • 不要在生产环境用 --privileged 或挂载 /proc//sys → 安全风险极高;
  • 建议开启京东云「云硬盘自动快照」策略(如每天1次,保留7天)→ 作为备份补充。

✅ 五、进阶建议(中大型业务)

  • 主从复制:用2台ECS部署主从(注意网络延迟、GTID、半同步);
  • 高可用:结合京东云 云数据库RDS for MySQL(更省心,自带备份/监控/故障切换)—— Docker方案更适合开发测试、轻量业务或特殊定制需求;
  • 容器编排:生产环境建议用 Kubernetes(京东云Kubernetes服务JDKE) 管理,实现滚动更新、健康检查、自动扩缩容。

一句话总结
“独立云硬盘存数据 + 强密码+内网访问 + 显式资源限制 + 自定义my.cnf调优 + 自动备份+云监控” = 可靠的Docker MySQL生产部署。

如需,我可为你提供:

  • 完整的 docker-compose.yml 示例(含备份脚本);
  • 京东云安全组规则配置截图指引;
  • 自动化部署Shell脚本;
  • RDS迁移Docker的checklist。

欢迎随时提出具体场景(如:是否需要主从?并发量多少?是否已有数据?),我可进一步定制建议。

未经允许不得转载:CLOUD云枢 » 在京东云ECS实例上通过Docker运行MySQL需要注意哪些配置?