大家好,我是Goya!

今天带来Docker部署系列的第一篇文章:用Docker部署MySQL 8.0。

为什么要用Docker部署MySQL?

  • ✅ 5分钟搞定,不用一步步安装配置

  • ✅ 环境隔离,不影响宿主机

  • ✅ 删除容器不留垃圾,数据还能保留

  • ✅ 想换版本?改个镜像标签就行

跟着这篇文章操作,保证你能一次成功!

一、准备工作

1.1 检查Docker环境

首先确认你的机器上已经安装了Docker:

docker --version

能看到类似Docker version 24.0.7的输出就行。如果没有安装,请移步Docker官网安装。

1.2 拉取MySQL镜像

我们选择最常用的MySQL 8.0版本:

docker pull mysql:8.0

小贴士:如果想用MySQL 5.7,把8.0改成5.7即可

拉取完成后查看镜像:

docker images | grep mysql

二、创建挂载目录(数据持久化)

容器删了数据不能丢,这是生产环境的基本要求。我们需要在宿主机上创建目录,用来存放MySQL的数据和配置:

二、创建挂载目录(数据持久化)
容器删了数据不能丢,这是生产环境的基本要求。我们需要在宿主机上创建目录,用来存放MySQL的数据和配置:

目录说明:

  • ~/docker/mysql/data:存放数据库文件(表结构、数据)

  • ~/docker/mysql/config:存放自定义配置文件

三、配置MySQL(解决中文乱码)

创建一个配置文件,设置字符集等参数:

vim ~/docker/mysql/config/my.cnf

粘贴以下内容:

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

# 允许最大连接数
max_connections=200

为什么要用utf8mb4?因为真正的UTF-8,支持emoji表情和所有生僻字

保存退出(vim操作:按i进入插入模式,粘贴后按ESC,输入:wq回车)

四、运行MySQL容器

这是最核心的一步,执行下面的命令:

docker run -d \
  --name mysql8 \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v ~/docker/mysql/data:/var/lib/mysql \
  -v ~/docker/mysql/config/my.cnf:/etc/mysql/my.cnf \
  --restart=always \
  mysql:8.0

命令参数详解:
以下是整理后的表格形式:

参数说明
-d后台运行容器
–name mysql8给容器起个名字,方便管理
-p 3306:3306端口映射:宿主机3306 → 容器3306
-e MYSQL_ROOT_PASSWORD=123456设置root密码(建议改成复杂密码)
-v ~/docker/mysql/data:/var/lib/mysql挂载数据目录(持久化关键)
-v ~/docker/mysql/config/my.cnf:/etc/mysql/my.cnf挂载配置文件
–restart=always容器异常退出自动重启

五、验证部署是否成功

5.1 查看容器状态

docker ps

应该能看到mysql8容器,状态是Up(运行中)

5.2 查看容器日志

docker logs mysql8

没有ERROR就是好的

5.3 进入容器连接MySQL

# 进入容器
docker exec -it mysql8 bash

# 连接MySQL
mysql -uroot -p123456

看到mysql>提示符,说明成功了!

试试执行SQL:

show databases;

能看到默认的数据库列表:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

六、开启远程连接(Navicat/DBeaver连接)

默认情况下,MySQL只允许本地连接(localhost)。如果想用图形化客户端从外部连接,需要修改权限。

6.1 进入MySQL修改权限

在容器内的MySQL命令行中执行:

-- 切换到mysql数据库
use mysql;

-- 查看当前root用户的访问权限
select host, user from user where user='root';

如果host列显示localhost,说明只能本地连接。我们需要改成%(允许所有IP):

-- 修改root允许所有IP连接
update user set host='%' where user='root';

-- 刷新权限
flush privileges;

6.2 MySQL 8.0特别注意:修改加密规则

MySQL 8.0默认使用了新的加密方式caching_sha2_password,很多旧版客户端(如Navicat)不支持。需要改成mysql_native_password:

-- 修改加密规则
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

-- 刷新权限
flush privileges;

6.3 退出

exit;  -- 退出MySQL
exit  -- 退出容器

七、常用Docker命令备忘

# 停止容器
docker stop mysql8

# 启动容器
docker start mysql8

# 重启容器
docker restart mysql8

# 查看实时日志
docker logs -f mysql8

# 进入容器(不进MySQL,只进容器shell)
docker exec -it mysql8 bash

# 删除容器(数据还在,因为挂载到宿主机了)
docker rm -f mysql8

# 如果要彻底删除数据(谨慎!)
rm -rf ~/docker/mysql/data

八、常见问题排查

Q1:端口3306被占用了怎么办?
A:修改宿主机的映射端口,比如改成3307:

docker run -d ... -p 3307:3306 ...

连接的时候用3307端口即可。

Q2:远程连接报错"Host ‘xxx’ is not allowed to connect"
A:没有执行上面的权限修改命令。按照第六步重新设置host和加密规则。

Q3:连接报错"Authentication plugin ‘caching_sha2_password’"
A:没有修改加密规则。执行:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';

Q4:中文显示乱码
A:检查配置文件是否挂载成功,进入容器查看字符集:

docker exec -it mysql8 mysql -uroot -p123456 -e "show variables like 'character%';"

应该看到全是utf8mb4。如果不是,检查my.cnf是否正确挂载。

Q5:容器启动失败,怎么查看原因?

docker logs mysql8

把最后的错误信息复制出来搜索,或者评论区问我。

九、总结

通过本文,我们成功实现了:

✅ Docker一键部署MySQL 8.0

✅ 数据持久化到宿主机

✅ 配置文件自定义(解决中文乱码)

✅ 开启远程连接

✅ 支持Navicat等客户端连接

现在你的MySQL已经跑起来了,可以开始愉快的CRUD了!

如果本文对你有帮助,欢迎点赞、收藏、评论!
有问题随时在评论区留言,我看到就会回复。

更多推荐