在京东云ECS实例上通过Docker运行MySQL,虽便捷但需兼顾稳定性、安全性、性能与可维护性。以下是关键配置注意事项(按优先级和实践重要性组织):
✅ 一、基础环境准备
-
ECS选型建议
- 内存 ≥ 4GB(MySQL容器本身 + OS + 其他服务),生产环境建议 ≥ 8GB;
- 系统盘建议SSD(如云硬盘GP3),数据盘务必挂载独立高性能云硬盘(如SSD云硬盘)并挂载至
/data/mysql,避免使用系统盘存储数据(防IO争抢、扩容难、快照/备份受限); - 操作系统推荐 CentOS 7.9+/Alibaba Cloud Linux 3/Ubuntu 20.04+(内核稳定、Docker兼容性好)。
-
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
- 使用京东云官方镜像或标准源安装 Docker CE(≥20.10),启用
✅ 二、MySQL容器核心配置(强烈建议使用 docker run 或 docker-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
✅ 三、运维与高可用增强(生产必备)
| 类别 | 措施 | 说明 |
|---|---|---|
| 备份 | ✅ 每日 mysqldump 或 mysqlpump + 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云枢