在腾讯云 CVM(云服务器)上基于 Ubuntu 系统部署 Docker 版本的 MySQL,核心逻辑其实很清晰:环境准备 -> 安装 Docker -> 拉取镜像 -> 运行容器 -> 验证连接。
下面我把步骤拆解得细一点,顺便避开几个容易踩的坑。
第一步:登录服务器并更新系统
首先通过 SSH 登录到你的 Ubuntu CVM。建议先执行一下基础的系统更新,确保软件源是最新的,避免后续安装依赖时出现版本冲突。
sudo apt update && sudo apt upgrade -y
第二步:安装 Docker Engine
Ubuntu 官方源里的 Docker 版本可能不是最新的,推荐直接使用 Docker 官方的 APT 仓库来安装,这样更稳定且方便后续升级。
- 安装前置依赖
sudo apt install -y ca-certificates curl gnupg lsb-release
- 添加 Docker 官方 GPG 密钥和仓库
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 再次更新索引并安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
- 验证安装
docker --version
docker run hello-world
如果 hello-world 能正常打印欢迎信息,说明 Docker 引擎没问题。
第三步:创建数据持久化目录
Docker 容器的文件系统是临时的,一旦容器删除或重建,数据就没了。所以必须把 MySQL 的数据文件挂载到宿主机的某个目录,实现数据持久化。
建议在 /opt 或者 /data 下创建一个专用目录:
sudo mkdir -p /data/mysql
sudo chown -R 999:999 /data/mysql
注意:MySQL 镜像内部默认用户 ID 通常是 999(取决于具体版本),赋予该目录权限可以防止容器启动时因权限不足报错。
第四步:运行 MySQL 容器
这是最关键的一步。使用 docker run 命令启动容器。这里以 MySQL 8.0 为例(目前主流版本),并配置了端口映射、密码、字符集等关键参数。
sudo docker run -d
--name mysql-server
-p 3306:3306
-v /data/mysql:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=YourStrongPassword123!
-e TZ=Asia/Shanghai
--restart=always
mysql:8.0
参数解析:
-d: 后台运行。--name mysql-server: 给容器起个名字,方便后续管理。-p 3306:3306: 将宿主机的 3306 端口映射到容器的 3306 端口。注意:如果你打算从公网访问,需要去腾讯云控制台的安全组里放行 3306 端口;如果是内网应用调用,通常不需要开公网端口,但安全组规则依然要允许相应 IP 访问。-v /data/mysql:/var/lib/mysql: 数据卷挂载,保证数据不丢失。-e MYSQL_ROOT_PASSWORD=...: 设置 root 用户的密码。务必使用强密码。-e TZ=Asia/Shanghai: 设置时区,避免数据库时间与北京时间不一致。--restart=always: 保证服务器重启后容器自动拉起。
第五步:验证部署是否成功
- 查看容器状态
sudo docker ps
确保 mysql-server 的状态是 Up,且端口映射正确。
- 进入容器测试连接
sudo docker exec -it mysql-server mysql -uroot -p
输入刚才设置的密码。如果能成功进入 mysql> 命令行界面,说明数据库服务本身是正常的。
- 检查字符集(可选但推荐)
在 MySQL 命令行中执行:
SHOW VARIABLES LIKE 'character_set%';
默认情况下,MySQL 8.0 使用的是 utf8mb4,这已经支持 Emoji 表情和多语言,基本无需额外修改。如果发现是 latin1,可以在启动容器时加上环境变量 -e MYSQL_CHARSET=utf8mb4 或者在挂载的配置文件中进行调整。
常见问题与避坑指南
-
网络连不上?
- 第一反应查腾讯云安全组。CVM 默认只开放了 22 (SSH)、80、443 等常用端口。3306 必须在安全组的入方向规则中添加,来源可以是
0.0.0.0/0(不推荐,安全性低)或指定你的固定 IP。 - 第二反应查防火墙。虽然 Docker 会处理 iptables,但有时
ufw开启会影响。可以临时关闭测试:sudo ufw disable。
- 第一反应查腾讯云安全组。CVM 默认只开放了 22 (SSH)、80、443 等常用端口。3306 必须在安全组的入方向规则中添加,来源可以是
-
中文乱码?
- 确保客户端连接时也指定了
utf8mb4字符集。 - 如果在
docker run中没有显式指定,MySQL 8.0 默认就是utf8mb4,一般不会有乱码问题。如果是旧版 MySQL 5.7,可能需要手动配置my.cnf。
- 确保客户端连接时也指定了
-
内存占用过高?
- MySQL 比较吃内存。如果你的 CVM 配置较低(如 2核 2G),建议限制 MySQL 的最大连接数和缓冲池大小。可以通过挂载自定义的
my.cnf文件来实现,例如:-v /data/mysql/my.cnf:/etc/mysql/my.cnf然后在宿主机
/data/mysql/my.cnf中写入:[mysqld] innodb_buffer_pool_size=128M max_connections=50
- MySQL 比较吃内存。如果你的 CVM 配置较低(如 2核 2G),建议限制 MySQL 的最大连接数和缓冲池大小。可以通过挂载自定义的
-
备份策略
- 既然用了 Docker,数据都在
/data/mysql目录下。建议定期用tar或rsync将这个目录打包备份到 COS(对象存储)或其他备份位置,不要只依赖 Docker 自身的机制。
- 既然用了 Docker,数据都在
这套流程走下来,一个标准的、生产环境可用的 MySQL 实例就跑起来了。如果有更复杂的集群需求(如主从复制),那需要考虑使用 MySQL Router 或者专门的 K8s Operator,但对于单机部署,上述方案足够稳健。
云技术博客