如何在京东云服务器上使用Docker部署MySQL数据库?

在京东云服务器(JD Cloud ECS)上使用 Docker 部署 MySQL 数据库,是一个高效、可复现的方案。以下是详细、安全、生产就绪(兼顾开发与轻量生产)的部署指南,涵盖环境准备、Docker 安装、MySQL 容器部署、持久化、安全配置、远程访问及基础管理。


✅ 前提条件

  1. 已开通京东云账号,并成功创建一台 Linux ECS 实例(推荐 Ubuntu 22.04 / CentOS 7+/Alibaba Cloud Linux 3,内存 ≥2GB,磁盘 ≥40GB)。
  2. 已通过 SSH 登录到该服务器(如:ssh -i your-key.pem ubuntu@your-server-ip)。
  3. 确保实例安全组已放行:
    • 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 --versiondocker 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.cnfbind-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云枢 » 如何在京东云服务器上使用Docker部署MySQL数据库?