在京东云服务器(JD Cloud ECS)上使用 Docker 部署 MySQL 数据库,是一个高效、可复现的方案。以下是详细、安全、生产就绪(兼顾开发与轻量生产)的部署指南,涵盖环境准备、Docker 安装、MySQL 容器部署、持久化、安全配置、远程访问及基础管理。
✅ 前提条件
- 已开通京东云账号,并成功创建一台 Linux ECS 实例(推荐 Ubuntu 22.04 / CentOS 7+/Alibaba Cloud Linux 3,内存 ≥2GB,磁盘 ≥40GB)。
- 已通过 SSH 登录到该服务器(如:
ssh -i your-key.pem ubuntu@your-server-ip)。 - 确保实例安全组已放行:
- 3306 端口(TCP)(如需远程连接 MySQL)
- 22 端口(SSH)
- (可选)80/443(若后续部署 Web 管理工具如 phpMyAdmin)
🛠️ 步骤 1:更新系统 & 安装 Docker(以 Ubuntu 22.04 为例)
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装 Docker 依赖
sudo apt install -y curl gnupg2 software-properties-common ca-certificates
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker APT 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新包索引并安装 Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl enable docker
sudo systemctl start docker
# 验证安装(非 root 用户可加当前用户到 docker 组,避免每次用 sudo)
sudo usermod -aG docker $USER
# ⚠️ 注意:执行后需重新登录 SSH 或运行 `newgrp docker` 生效
✅ 验证:
docker --version和docker run hello-world应正常输出。
🐳 步骤 2:创建持久化目录(关键!避免数据丢失)
# 创建 MySQL 数据、配置、日志目录(建议挂载到大容量云硬盘)
sudo mkdir -p /data/mysql/{conf,logs,data}
# 设置权限(MySQL 容器内默认用户 mysql(uid=999),需确保可写)
sudo chown -R 999:999 /data/mysql/data
sudo chmod -R 755 /data/mysql
💡 说明:
/data/mysql/data→ 存储数据库文件(InnoDB 表空间、binlog 等)/data/mysql/conf→ 自定义配置(如my.cnf)/data/mysql/logs→ 错误日志、慢查询日志等
📄 步骤 3:准备 MySQL 配置文件(可选但强烈推荐)
创建 /data/mysql/conf/my.cnf:
[mysqld]
# 基础配置
port = 3306
bind-address = 0.0.0.0 # 允许容器内所有地址访问(Docker 网络内)
max_connections = 200
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 持久化与安全
innodb_file_per_table = 1
skip-host-cache
skip-name-resolve
# 日志
log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# 时区(重要!避免应用时区不一致)
default-time-zone = '+08:00'
# 安全加固(生产环境必加)
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
✅ 保存后确保权限正确:
sudo chown 999:999 /data/mysql/conf/my.cnf && sudo chmod 644 /data/mysql/conf/my.cnf
🐬 步骤 4:拉取并运行 MySQL 容器(推荐 MySQL 8.0+)
docker run -d
--name mysql8
--restart=unless-stopped
--network=bridge
-p 3306:3306
-e MYSQL_ROOT_PASSWORD=YourStrongRootPass123! # 🔒 必须修改!
-e MYSQL_DATABASE=myapp
-e MYSQL_USER=appuser
-e MYSQL_PASSWORD=AppUserPass456!
-v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf:ro
-v /data/mysql/data:/var/lib/mysql
-v /data/mysql/logs:/var/log/mysql
-v /etc/localtime:/etc/localtime:ro
--ulimit nofile=65536:65536
--memory=2g --cpus=2
-d mysql:8.0.33
--default-authentication-plugin=mysql_native_password # 兼容旧客户端(如 Navicat、部分 JDBC)
✅ 参数说明:
--restart=unless-stopped:自动重启(系统重启后也恢复)-p 3306:3306:将宿主机 3306 映射到容器-e MYSQL_*:初始化 root 密码 + 默认库 + 应用用户(首次启动生效)--default-authentication-plugin=mysql_native_password:解决 MySQL 8 默认caching_sha2_password认证兼容性问题--memory=2g --cpus=2:限制资源,防 OOM(按 ECS 规格调整)--ulimit nofile=...:提升文件句柄数,适应高并发⚠️ 安全警告:
❌ 切勿在生产环境使用root远程直连;✅ 建议后续创建专用用户并限制 host(如'appuser'@'10.0.0.%')。
🔍 步骤 5:验证部署 & 连接测试
1. 查看容器状态
docker ps -f name=mysql8
# 应显示 STATUS "Up X minutes"
docker logs mysql8 | tail -20 # 查看启动日志,确认无 ERROR
2. 进入容器执行 SQL(本地测试)
docker exec -it mysql8 mysql -uroot -p'YourStrongRootPass123!'
-- 查看用户(确认 appuser 已创建)
SELECT user,host,authentication_string FROM mysql.user;
-- 创建远程访问用户(示例:允许从任意 IP 连接 appuser,仅限测试!)
CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppUserPass456!';
GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
-- 查看字符集
SHOW VARIABLES LIKE 'character_set%';
3. 从本地电脑连接(需确保京东云安全组已放行 3306)
使用 MySQL 客户端(如 MySQL Workbench、Navicat、命令行):
Host: your-server-public-ip
Port: 3306
Username: appuser
Password: AppUserPass456!
Database: myapp
✅ 成功连接即部署完成!
🛡️ 生产增强建议(进阶)
| 类别 | 推荐操作 |
|---|---|
| 备份 | 使用 mysqldump 定时备份到京东云对象存储(JSO)或 NAS:docker exec mysql8 mysqldump -uappuser -p'xxx' myapp | gzip > /backup/myapp_$(date +%F).sql.gz |
| 监控 | 部署 mysqld_exporter + Prometheus + Grafana;或使用京东云「云监控」集成 |
| 高可用 | 单节点 Docker 适合开发/测试;生产建议: • 主从复制(2 个 MySQL 容器 + binlog 同步) • 或直接使用京东云 云数据库 RDS for MySQL(更稳定、自动备份、一键扩缩容) |
| 网络隔离 | 创建自定义 Docker 网络,禁止容器间随意通信:docker network create --driver bridge --subnet=172.20.0.0/16 mysql-net,启动时加 --network mysql-net |
| SSL 加密 | 生成证书挂载到容器,启用 require_secure_transport=ON(参考 MySQL 官方文档) |
🚫 常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
Can't connect to MySQL server |
安全组未开放 3306 / 防火墙拦截 | sudo ufw status(Ubuntu)或 sudo firewall-cmd --list-all(CentOS),开放端口 |
| 容器启动失败/闪退 | 数据目录权限错误 / 配置语法错误 | docker logs mysql8 查看错误;检查 /data/mysql/data 所有者是否为 999 |
| 远程连接被拒绝 | MySQL 绑定地址为 127.0.0.1 |
确认 my.cnf 中 bind-address = 0.0.0.0,且容器内无覆盖 |
| 中文乱码 | 字符集未生效 | 检查 my.cnf 配置 + 连接时指定 charset=utf8mb4(如 JDBC URL 加 ?characterEncoding=utf8mb4) |
✅ 总结
你已在京东云 ECS 上成功通过 Docker 部署了安全、持久、可维护的 MySQL 服务。核心要点回顾:
✅ 使用命名卷或绑定挂载实现数据持久化
✅ 通过 my.cnf 统一管理配置,支持时区、字符集、日志等定制
✅ 设置强密码 + 专用应用用户,禁用 root 远程登录(最佳实践)
✅ 资源限制 + 自动重启,保障稳定性
✅ 后续可无缝接入备份、监控、SSL 等生产能力
💡 最后建议:对于核心业务数据库,京东云 RDS for MySQL 是更优选择(免运维、X_X级高可用、自动备份、审计日志、秒级监控告警)。Docker 方案更适合 DevOps 测试环境、CI/CD、微服务临时 DB 或学习验证。
如需我为你生成:
- ✅ 自动化部署脚本(一键安装 Docker + 启动 MySQL)
- ✅ MySQL 主从复制 Docker Compose 文件
- ✅ 定时备份上传 JSO 的 Shell 脚本
- ✅ Nginx + phpMyAdmin 管理界面部署指南
欢迎随时告诉我 👇
祝你部署顺利!🚀
CLOUD云枢