【保姆级教程】Docker部署MySQL 8.0,支持远程连接+数据持久化
大家好,我是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了!
如果本文对你有帮助,欢迎点赞、收藏、评论!
有问题随时在评论区留言,我看到就会回复。
更多推荐
所有评论(0)