阿里云ECS如何安装docker的mysql镜像?

在阿里云 ECS 上部署 MySQL 镜像,其实和在其他 Linux 服务器上操作没本质区别,核心步骤就是:装 Docker -> 拉取镜像 -> 运行容器。但考虑到是生产环境或半生产环境,有几个“坑”和最佳实践得提前说清楚,不然上线后容易出故障。

下面我按最稳妥、最常用的方式(使用 docker run 命令)来拆解,顺便提一下为什么不建议直接用阿里云的 RDS 替代所有场景(比如你需要自定义配置、或者做开发测试时)。

第一步:确保 ECS 环境就绪

  1. 系统选择:建议用 Alibaba Cloud Linux 3、CentOS 7/8 或 Ubuntu 20.04+。这些对 Docker 支持最好。
  2. 安全组配置(关键!):
    • 默认情况下,MySQL 端口 3306 是不开放的。
    • 如果你打算从本地或其他服务器连接这个 MySQL,必须在阿里云控制台 -> 安全组 -> 入方向规则中,放行 TCP 协议的 3306 端口。
    • 注意:出于安全考虑,建议只对你自己的 IP 开放 3306,不要对 0.0.0.0/0 开放,除非你非常清楚自己在做什么。

第二步:安装 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 就完事了。这在测试环境可以,在生产环境绝对不行!

原因:

  1. 数据丢失风险:容器重启或销毁后,数据全丢。
  2. 字符集乱码:默认字符集可能不是 utf8mb4,导致中文存进去变成问号。
  3. 性能瓶颈:没有挂载主机目录,无法持久化日志和数据文件。
  4. 时区问题:容器内默认 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 自动跟着起来。

第五步:验证与连接

  1. 检查容器状态:

    docker ps | grep mysql

    确保状态是 Up。

  2. 查看初始日志(第一次启动可能需要几秒初始化):

    docker logs -f mysql-prod

    看到 [Note] A temporary password is generated for root@localhost: 表示启动成功。如果你用了上面的命令设置了密码,就不会有临时密码提示。

  3. 本地连接测试:
    在你的电脑上用 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云枢 » 阿里云ECS如何安装docker的mysql镜像?