在京东云服务器(JD Cloud ECS)上使用 Docker 部署 MySQL 数据库,是一个高效、可复现的方案。以下是完整、安全、生产就绪(兼顾开发/测试)的详细步骤指南,涵盖环境准备、Docker 安装、MySQL 容器部署、持久化、安全配置、远程访问及验证。
✅ 前提条件
- 已开通京东云账号,并成功创建一台 Linux 云服务器(ECS)(推荐 CentOS 7+/Ubuntu 20.04+,内存 ≥2GB,磁盘 ≥40GB)。
- 已通过 SSH 登录到该服务器(如
ssh -i key.pem root@your-server-ip)。 - 服务器已配置安全组规则(放行 MySQL 默认端口
3306,仅限可信 IP 访问,生产环境严禁全网开放!)。
🔧 步骤 1:更新系统 & 安装基础工具
# CentOS 7/8
sudo yum update -y
sudo yum install -y curl wget vim net-tools
# Ubuntu/Debian
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget vim net-tools
🐳 步骤 2:安装 Docker(推荐使用官方源)
✅ 推荐方式:安装 Docker Engine(非 Docker Desktop)
# 卸载旧版本(如有)
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # CentOS
# 或
sudo apt remove docker docker-engine docker.io containerd runc # Ubuntu
# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # CentOS
# Ubuntu 可跳过,直接执行下一步
# 添加 Docker 官方仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # CentOS
# Ubuntu:
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 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 yum install -y docker-ce docker-ce-cli containerd.io # CentOS
# Ubuntu:sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
sudo docker --version # 应输出类似:Docker version 24.0.7, build ...
sudo docker run hello-world # 测试运行成功即 OK
💡 提示:如需免
sudo运行 Docker,将当前用户加入docker组:sudo usermod -aG docker $USER newgrp docker # 刷新组权限(或重新登录 SSH)
🗃️ 步骤 3:准备 MySQL 持久化目录(关键!避免数据丢失)
# 创建宿主机目录(建议挂载到大容量云硬盘,如 /data)
sudo mkdir -p /data/mysql/{conf,data,logs}
# 设置权限(MySQL 容器内以 UID=999 运行,对应 mysql 用户)
sudo chown -R 999:999 /data/mysql/data
sudo chown -R 999:999 /data/mysql/logs
sudo chmod -R 755 /data/mysql/conf
# (可选)创建自定义配置文件(提升安全性与性能)
sudo tee /data/mysql/conf/my.cnf << 'EOF'
[mysqld]
# 基础配置
bind-address = 0.0.0.0
port = 3306
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake = true
# 安全增强
default-authentication-plugin = mysql_native_password
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# 日志
log-error = /var/log/mysql/error.log
slow-query-log = 1
slow-query-log-file = /var/log/mysql/slow.log
long_query_time = 2
# InnoDB
innodb_buffer_pool_size = 512M
innodb_log_file_size = 64M
# 最大连接数
max_connections = 200
[client]
default-character-set = utf8mb4
EOF
🐬 步骤 4:拉取并运行 MySQL 容器(推荐 MySQL 8.0+)
# 拉取官方 MySQL 镜像(指定稳定版本,避免 latest 不可控)
sudo docker pull mysql:8.0.33
# 运行容器(关键参数说明见注释)
sudo docker run -d
--name mysql-prod
--restart=unless-stopped
--publish 3306:3306
--ulimit nofile=65536:65536
--memory="1g"
--cpus="1"
--network=bridge
--mount type=bind,src=/data/mysql/conf/my.cnf,dst=/etc/mysql/my.cnf,readonly
--mount type=bind,src=/data/mysql/data,dst=/var/lib/mysql
--mount type=bind,src=/data/mysql/logs,dst=/var/log/mysql
-e MYSQL_ROOT_PASSWORD=YourStrongRootPass123! # 🔒 必须修改!禁止使用简单密码
-e MYSQL_DATABASE=myappdb # 可选:启动时创建数据库
-e MYSQL_USER=appuser # 可选:创建普通用户
-e MYSQL_PASSWORD=AppUserPass456! # 可选:该用户的密码
-e TZ=Asia/Shanghai
--log-driver json-file
--log-opt max-size=10m --log-opt max-file=3
mysql:8.0.33
# ✅ 查看容器状态
sudo docker ps -a | grep mysql
# ✅ 查看日志(确认初始化完成)
sudo docker logs -f mysql-prod
# 等待出现类似:`... mysqld: ready for connections.` 即启动成功
⚠️ 安全警告:
MYSQL_ROOT_PASSWORD必须强密码(大小写字母+数字+符号,≥12位),切勿明文写在脚本中(生产环境建议用 Docker secrets 或环境变量文件)。- 生产环境禁止映射 3306 到公网,应通过内网 VPC 访问,或配合京东云「云防火墙」/「安全组」严格限制源 IP。
🔐 步骤 5:配置远程访问(仅限必要场景)
MySQL 8 默认只允许本地 root 登录。如需远程连接(例如本地 Navicat 连接):
方法 A:进入容器执行 SQL(推荐)
# 进入容器
sudo docker exec -it mysql-prod mysql -uroot -p
# 在 MySQL CLI 中执行(替换 'your_client_ip' 为你的公网IP,或 '%' 表示任意IP(不推荐)):
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'YourStrongRootPass123!';
FLUSH PRIVILEGES;
# 若需授权给 appuser 远程访问:
CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppUserPass456!';
GRANT ALL PRIVILEGES ON myappdb.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
方法 B:启动时通过 --init-file 初始化(更规范)
# 创建初始化 SQL 文件
sudo tee /data/mysql/conf/init.sql << 'EOF'
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongRootPass123!';
CREATE USER 'root'@'%' IDENTIFIED BY 'YourStrongRootPass123!';
GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EOF
# 启动时添加参数:
# --mount type=bind,src=/data/mysql/conf/init.sql,dst=/docker-entrypoint-initdb.d/init.sql
✅ 再次强调:生产环境务必限制访问 IP!
- 京东云控制台 → 云服务器 ECS → 实例详情 → 安全组 → 编辑入方向规则:
- 协议:TCP
- 端口:3306
- 授权对象:
你的办公IP/32(如203.208.60.1/32)或内网网段(如10.0.0.0/16)
🧪 步骤 6:验证连接
本地测试(在京东云服务器内部):
# 安装 MySQL 客户端(如未安装)
sudo yum install -y mysql # CentOS
# 或
sudo apt install -y mysql-client # Ubuntu
# 连接测试
mysql -h 127.0.0.1 -u root -p # 输入密码
# 或连接 appuser
mysql -h 127.0.0.1 -u appuser -p myappdb
外部测试(从你本地电脑):
mysql -h your-server-public-ip -P 3306 -u root -p
✅ 成功连接即部署完成!
🛡️ 进阶建议(生产环境必做)
| 项目 | 建议 |
|---|---|
| 备份 | 使用 mysqldump 定时备份到京东云对象存储(OSS):docker exec mysql-prod mysqldump -uroot -p$PASS --all-databases > /backup/all.sql + ossutil cp |
| 监控 | 部署 Prometheus + Grafana + mysqld_exporter 监控容器与 MySQL 性能 |
| 高可用 | 生产建议使用京东云 云数据库 RDS for MySQL(自动主从、备份、扩缩容),Docker 更适合开发/测试/轻量应用 |
| 升级 | docker pull mysql:8.0.34 → docker stop mysql-prod → docker rm mysql-prod → 用新镜像重新 run(确保数据卷挂载不变) |
| SSL 加密 | 生成证书挂载到 /etc/mysql/ssl/,并在 my.cnf 中启用 require_secure_transport=ON |
❌ 常见问题排查
| 现象 | 解决方案 |
|---|---|
Can't connect to local MySQL server |
检查容器是否运行:docker ps;检查端口是否被占用:netstat -tuln | grep 3306;检查 bind-address 是否为 0.0.0.0 |
| 容器启动后立即退出 | docker logs mysql-prod 查错误;常见原因:数据目录权限不对(chown -R 999:999 /data/mysql/data)、配置文件语法错误 |
| 远程连接被拒绝 | 检查京东云安全组、Linux 防火墙(sudo systemctl stop firewalld 或放行 3306)、MySQL 用户 host 是否为 % |
| 中文乱码 | 确认 my.cnf 中 character-set-server=utf8mb4 + 客户端连接时指定 charset=utf8mb4 |
✅ 总结:你已成功在京东云 ECS 上通过 Docker 部署一个安全、持久、可管理的 MySQL 实例。
📌 下一步建议:
➡️ 将数据库连接信息配置到你的应用(Spring Boot / Django / Node.js 等)
➡️ 配置定时备份脚本(推荐京东云 OSS 存储)
➡️ 如需更高 SLA,平滑迁移至京东云 RDS(提供一键迁移工具)
需要我为你生成 全自动部署脚本(bash)、Docker Compose 版本、备份脚本 或 对接京东云 OSS 的备份方案,欢迎随时告诉我! 😊
云计算