在京东云(JD Cloud)服务器上使用 Docker 部署 MySQL 数据库,是一个高效、可复现的方案。以下是完整、安全、生产可用的部署指南(基于 Ubuntu/Debian 或 CentOS 系统),涵盖环境准备、Docker 安装、MySQL 容器部署、持久化配置、安全加固及连接验证。
✅ 前提条件
- 已购买并登录京东云 ECS 实例(推荐:2核4G+,系统建议 Ubuntu 22.04 LTS / CentOS 7.9+)
- 已配置安全组规则:放行 3306 端口(TCP)(仅限可信 IP,生产环境不建议全开放!)
- 具备
root或sudo权限
🔧 步骤 1:更新系统 & 安装 Docker
Ubuntu/Debian:
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装 Docker(官方方式)
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
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
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl enable docker
sudo systemctl start docker
# 将当前用户加入 docker 组(避免每次用 sudo)
sudo usermod -aG docker $USER
newgrp docker # 刷新组权限(或重新登录 SSH)
CentOS 7/8:
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker $USER
newgrp docker
✅ 验证 Docker:
docker --version # 如:Docker version 24.0.7, build afdd53b
docker run hello-world # 首次拉取并运行测试容器
🐳 步骤 2:创建持久化目录(关键!防止数据丢失)
# 创建 MySQL 数据、配置、日志目录(建议挂载到大容量云盘,如 /data)
sudo mkdir -p /data/mysql/{conf,data,logs}
# 设置权限(MySQL 容器内以 mysql 用户(uid=999)运行)
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
# 持久化与性能
innodb_buffer_pool_size = 1G # 根据内存调整(建议 50%~70%)
innodb_log_file_size = 256M
max_connections = 200
wait_timeout = 28800
interactive_timeout = 28800
# 安全加固
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
default_authentication_plugin = mysql_native_password
# 日志
log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
[client]
default-character-set = utf8mb4
EOF
💡 提示:
/data/mysql/conf/my.cnf会通过-v挂载覆盖容器默认配置,确保字符集、密码插件等符合现代应用要求。
🚀 步骤 3:启动 MySQL 容器(推荐使用 docker run 命令)
docker run -d
--name mysql-prod
--restart=unless-stopped
--network=host # 或使用 bridge 网络(见下方说明)
-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:rw
-v /data/mysql/logs:/var/log/mysql:rw
-p 3306:3306
--ulimit nofile=65536:65536
--memory=2g
--cpus=2
-d mysql:8.0.33
--default-authentication-plugin=mysql_native_password
🔍 参数说明:
| 参数 | 说明 |
|---|---|
--restart=unless-stopped |
服务器重启后自动恢复容器(生产必备) |
--network=host |
直接使用宿主机网络(端口映射更简单,性能略优) ⚠️ 若需多容器隔离,改用 --network bridge + -p 3306:3306 |
-e MYSQL_ROOT_PASSWORD |
必须设置强密码!(避免空密码风险) |
-v ... :ro |
配置文件只读挂载,防容器内误修改 |
--ulimit nofile=... |
提升文件句柄数,避免连接过多报错 |
--memory/--cpus |
资源限制,防 MySQL 占满资源 |
✅ 启动后检查:
docker ps -f name=mysql-prod
docker logs -f mysql-prod # 查看初始化日志(首次启动会初始化数据库)
⚠️ 注意:首次启动需等待约 30–60 秒完成数据目录初始化(日志中出现
MySQL init process done. Ready for start up.即成功)
🔐 步骤 4:安全加固(生产环境必做)
1️⃣ 连接远程客户端前,先登录容器执行初始化安全操作:
docker exec -it mysql-prod mysql -uroot -p'YourStrongRootPass123!'
在 MySQL 内执行:
-- 1. 删除匿名用户(如有)
DELETE FROM mysql.user WHERE User='';
-- 2. 禁用 root 远程登录(仅保留本地)
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
-- 3. 创建专用应用用户(已通过 -e 创建,但可额外授权)
CREATE USER IF NOT EXISTS 'appuser'@'%' IDENTIFIED BY 'AppUserPass456!';
GRANT SELECT,INSERT,UPDATE,DELETE ON myapp.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
-- 4. (可选)启用 SSL(京东云 RDS 支持,Docker 自建需自行配置证书)
-- SHOW VARIABLES LIKE '%ssl%'; -- 查看是否启用
2️⃣ 京东云安全组优化:
- 登录 京东云控制台 → 云服务器 ECS → 安全组
- 编辑入方向规则:仅放行
3306 TCP给 你的办公 IP 或跳板机 IP,禁止0.0.0.0/0 - ✅ 强烈建议:生产环境通过 京东云私有网络 VPC 内网访问(ECS 与应用部署在同一 VPC),完全关闭 3306 公网暴露
🌐 步骤 5:连接测试(本地 & 远程)
✅ 本地连接(ECS 内):
mysql -h 127.0.0.1 -u appuser -p'AppUserPass456!' -D myapp
# 或用 root(仅调试)
mysql -h 127.0.0.1 -u root -p'YourStrongRootPass123!'
✅ 远程连接(从你本地电脑):
# 确保安全组已放行你的公网 IP(临时调试用)
mysql -h <你的ECS公网IP> -P 3306 -u appuser -p'AppUserPass456!' -D myapp
🔒 如果连接失败,请排查:
telnet <ECS公网IP> 3306是否通(检查防火墙/安全组)sudo ufw status(Ubuntu)或sudo firewall-cmd --state(CentOS)是否禁用防火墙- MySQL 是否监听
0.0.0.0(检查容器内netstat -tlnp | grep :3306)
📦 进阶推荐(生产级)
| 方案 | 说明 | 推荐度 |
|---|---|---|
| ✅ Docker Compose | 使用 docker-compose.yml 管理,支持一键启停、版本回滚 |
⭐⭐⭐⭐⭐ |
| ✅ 挂载独立云硬盘 | 将 /data/mysql/data 挂载到京东云高 IO 云硬盘,保障 IOPS 和数据可靠性 |
⭐⭐⭐⭐⭐ |
| ✅ 定期备份脚本 | 结合 mysqldump + cron + 京东云对象存储(OSS)自动归档 |
⭐⭐⭐⭐ |
| ⚠️ 避免使用 latest 标签 | 固定镜像版本(如 mysql:8.0.33),防止意外升级导致兼容问题 |
⭐⭐⭐⭐⭐ |
| ❌ 不推荐 | --privileged、--net=host(若非必要)、空密码、root 公网直连 |
❌ |
示例 docker-compose.yml(放在 /opt/mysql/docker-compose.yml):
version: '3.8'
services:
mysql:
image: mysql:8.0.33
container_name: mysql-prod
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "YourStrongRootPass123!"
MYSQL_DATABASE: "myapp"
MYSQL_USER: "appuser"
MYSQL_PASSWORD: "AppUserPass456!"
volumes:
- "/data/mysql/conf/my.cnf:/etc/mysql/my.cnf:ro"
- "/data/mysql/data:/var/lib/mysql:rw"
- "/data/mysql/logs:/var/log/mysql:rw"
ports:
- "3306:3306"
ulimits:
nofile:
soft: 65536
hard: 65536
deploy:
resources:
limits:
memory: 2G
cpus: '2.0'
启动命令:
cd /opt/mysql
docker-compose up -d
📚 补充资源
- ✅ MySQL 官方 Docker 文档:https://hub.docker.com/_/mysql
- ✅ 京东云 Docker 镜像提速(国内更快):
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] } EOF sudo systemctl restart docker
如需我为你生成:
- ✅ 完整的备份脚本(每日压缩 + 上传 OSS)
- ✅ Grafana + Prometheus 监控 MySQL 容器
- ✅ 主从复制 Docker 部署方案
- ✅ 与 Spring Boot / Django 应用集成示例
欢迎随时告诉我 👇 我可立即为你定制!
祝你在京东云上顺利构建稳定、安全的 MySQL 数据库服务!🚀
云服务器