在阿里云 ECS 上部署 MySQL 镜像,其实和在其他 Linux 服务器上操作没本质区别,核心步骤就是:装 Docker -> 拉取镜像 -> 运行容器。但考虑到是生产环境或半生产环境,有几个“坑”和最佳实践得提前说清楚,不然上线后容易出故障。
下面我按最稳妥、最常用的方式(使用 docker run 命令)来拆解,顺便提一下为什么不建议直接用阿里云的 RDS 替代所有场景(比如你需要自定义配置、或者做开发测试时)。
第一步:确保 ECS 环境就绪
- 系统选择:建议用 Alibaba Cloud Linux 3、CentOS 7/8 或 Ubuntu 20.04+。这些对 Docker 支持最好。
- 安全组配置(关键!):
- 默认情况下,MySQL 端口
3306是不开放的。 - 如果你打算从本地或其他服务器连接这个 MySQL,必须在阿里云控制台 -> 安全组 -> 入方向规则中,放行 TCP 协议的
3306端口。 - 注意:出于安全考虑,建议只对你自己的 IP 开放 3306,不要对
0.0.0.0/0开放,除非你非常清楚自己在做什么。
- 默认情况下,MySQL 端口
第二步:安装 Docker Engine
不要在 ECS 上用 yum install docker 直接装那个老版本,去官方仓库装最新稳定版。以 CentOS/Alibaba Cloud Linux 为例:
# 1. 卸载旧版本(如果有)
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
# 2. 安装依赖
sudo yum install -y yum-utils
# 3. 设置镜像源(推荐用阿里云镜像源提速下载)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4. 安装 Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 5. 启动并设为开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 6. 验证安装
docker --version
提示:如果是 Ubuntu,用
apt-get流程类似,同样建议换源到阿里云镜像源,否则拉镜像会慢到怀疑人生。
第三步:拉取 MySQL 镜像
这里有个选择问题:你要哪个版本?
- 如果追求稳定,选
mysql:5.7 - 如果要用新特性(如 JSON 函数优化、窗口函数等),选
mysql:8.0
# 拉取 MySQL 8.0 镜像(国内网络可能较慢,耐心等待)
docker pull mysql:8.0
第四步:运行 MySQL 容器(重点来了)
很多人直接 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0 就完事了。这在测试环境可以,在生产环境绝对不行!
原因:
- 数据丢失风险:容器重启或销毁后,数据全丢。
- 字符集乱码:默认字符集可能不是 utf8mb4,导致中文存进去变成问号。
- 性能瓶颈:没有挂载主机目录,无法持久化日志和数据文件。
- 时区问题:容器内默认 UTC,和中国时间差 8 小时,查出来的时间都是错的。
✅ 推荐的生产级运行命令:
创建一个目录用于存放数据和配置:
mkdir -p /data/mysql/conf /data/mysql/data
然后执行:
docker run -d
--name mysql-prod
-p 3306:3306
-v /data/mysql/conf:/etc/mysql/conf.d
-v /data/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=YourStrongPassword123!
-e TZ=Asia/Shanghai
--restart=always
mysql:8.0
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
参数解释:
-v /data/mysql/data:/var/lib/mysql:把数据库文件映射到宿主机,这样即使删了容器,数据还在。-v /data/mysql/conf:/etc/mysql/conf.d:方便后续修改配置文件(比如加索引优化、慢查询日志等),不用进容器改。-e TZ=Asia/Shanghai:解决时区问题,重要!--character-set-server=utf8mb4:确保支持 emoji 和生僻字,避免乱码。--restart=always:ECS 重启或 Docker 服务重启后,MySQL 自动跟着起来。
第五步:验证与连接
-
检查容器状态:
docker ps | grep mysql确保状态是
Up。 -
查看初始日志(第一次启动可能需要几秒初始化):
docker logs -f mysql-prod看到
[Note] A temporary password is generated for root@localhost:表示启动成功。如果你用了上面的命令设置了密码,就不会有临时密码提示。 -
本地连接测试:
在你的电脑上用 Navicat、DBeaver 或命令行连接:- Host: 你的 ECS 公网 IP
- Port: 3306
- User: root
- Password: 你设置的密码
⚠️ 如果连不上,90% 是因为安全组没开 3306 端口,或者防火墙(firewalld/ufw)没放行。
常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 连接超时 | 安全组未放行 3306 | 去阿里云控制台添加入方向规则 |
| 认证失败 | 密码错误或 MySQL 8.0 加密方式变化 | MySQL 8.0 默认 caching_sha2_password,部分老客户端不支持。可创建用户指定加密方式:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword'; |
| 中文乱码 | 未设置 utf8mb4 | 重新建容器,加上 --character-set-server=utf8mb4 |
| 磁盘空间不足 | 日志或数据文件太大 | 清理 /data/mysql/data 下的 ib_logfile 或 binlog,或扩容云盘 |
补充建议:是否真的需要自己装?
如果你的业务只是简单的 CRUD,且团队没有 DBA,强烈建议直接使用阿里云 RDS(关系型数据库服务)。
理由:
- RDS 自带备份、高可用、监控、自动补丁。
- ECS 上跑 MySQL,你得自己负责备份、主从切换、性能调优、安全加固。
- 对于小项目,RDS 入门版价格并不贵,比你自己折腾省心的多。
但如果你是为了学习 Docker、做微服务架构、或者需要深度定制 MySQL 内核参数,那就在 ECS 上自建吧。
最后提醒:务必定期备份 /data/mysql/data 目录,可以用脚本定时打包上传到 OSS,这是底线。
CLOUD云枢