CHAPTER 3 · DOCKER MYSQL
03
现在,用 Docker 安装一个 MySQL。
一条命令,就启动了一个完整的 MySQL。
执行之前
这条命令里,有四个地方不能随便写
MySQL 版本要固定
mysql:8.4
为什么不直接写 mysql:latest?
latest对应的版本可能变化。- 不同时间拉取可能得到不同版本。
- 团队成员之间的运行环境可能不一致。
- 项目依赖应该尽量可复现。
结论:镜像版本要明确,不要依赖不断变化的 latest。
本机端口可能冲突
-p 3306:3306
本机 3306 端口 → 容器 3306 端口
如果本机已经安装了 MySQL,占用了 3306,会发生什么?
容器启动失败,因为同一个本机端口不能同时被两个服务占用。
docker run ... -p 3307:3306 ...DBeaver 连接端口:3307 · 容器内 MySQL 端口:3306
冒号左边是本机端口,右边是容器端口。
数据必须持久化
-v album-mysql-data:/var/lib/mysql
如果数据库数据只保存在容器内部,删除容器后会发生什么?
容器内部数据
↓
删除容器
↓
数据一起消失
MySQL 容器
↓
album-mysql-data 数据卷
↓
重建容器后仍可继续使用
album-mysql-data是 Docker 数据卷名称。/var/lib/mysql是 MySQL 在容器内保存数据的目录。- 删除容器不会自动删除命名数据卷。
- 主动删除数据卷会导致数据丢失。
危险命令,执行前必须确认其中的数据不再需要。
docker volume rm album-mysql-data数据库容器可以删除,数据库数据不能跟着一起删除。
密码不能用于真实环境
-e MYSQL_ROOT_PASSWORD=123456
这段命令可以直接复制到生产环境吗?
不可以。123456 只是一个临时测试密码。
- 正式项目不能使用弱密码。
- 密码不能写入公开仓库。
- 密码应通过环境变量或密钥管理系统提供。
- 业务服务不应长期使用 root 账号连接数据库。
继续追问:为什么应用程序不应该使用 root 连接 MySQL?
检查结果
检查是否安装成功
查看运行中的容器
docker ps看到容器状态是 Up,不一定代表 MySQL 已经可以连接。容器进程已经启动,但 MySQL 可能仍在初始化。
查看 MySQL 日志
docker logs album-mysql
docker logs -f album-mysql日志中出现类似 ready for connections 的信息后,再尝试连接。
进入 MySQL
docker exec -it album-mysql \
mysql -uroot -p输入密码:123456
SHOW DATABASES;
USE album;
SELECT VERSION();任务完成标准
- □ 容器正在运行
- □ 日志中没有明显错误
- □ 可以登录 MySQL
- □ 可以看到 album 数据库
- □ 可以查询 MySQL 版本
连接客户端
接下来,用 DBeaver 连接它
| 配置项 | 内容 |
|---|---|
| 数据库类型 | MySQL |
| Host | localhost |
| Port | 3306 |
| Database | album |
| Username | root |
| Password | 123456 |
如果启动时使用 -p 3307:3306,则 DBeaver 端口填写 3307。
MySQL 是数据库服务,DBeaver 是连接和操作数据库的客户端。
概念解释
我们刚才到底安装了什么?
镜像:mysql:8.4
镜像可以理解为已经准备好的 MySQL 运行环境和程序模板。镜像本身不会运行,一个镜像可以创建多个 MySQL 容器。
MySQL 镜像
↓ 创建
MySQL 容器
容器:album-mysql
容器是镜像运行起来后的实例。镜像是程序模板,容器是正在运行的程序实例。
docker stop album-mysql
docker start album-mysql
docker restart album-mysql
docker rm album-mysql端口映射:-p 3306:3306
容器有自己的网络空间,需要通过端口映射让本机程序访问容器中的 MySQL。
DBeaver
↓ localhost:3306
本机端口 3306
↓
容器端口 3306
↓
MySQL
数据卷:-v album-mysql-data:/var/lib/mysql
数据卷用于把需要长期保存的数据,从容器生命周期中独立出来。代码容器可以重建,数据库数据不能随时丢失。
环境变量:-e
环境变量用于向容器传递启动配置。同一个镜像可以使用不同配置启动。
-e MYSQL_ROOT_PASSWORD=123456
-e MYSQL_DATABASE=album镜像保持一致,配置可以因环境而不同。
为什么用 Docker
Docker 带来了什么优势?
环境统一
统一使用 MySQL 8.4、容器内端口 3306、数据库名 album,可以避免版本和配置漂移。
安装和清理简单
docker run 安装,docker stop 停止,docker rm 删除,不需要改大量系统配置。
可以快速重建
容器配置出问题时,可以删除并重新创建。只要保留数据卷,删除容器不等于删除数据。
方便共享环境
同一条命令可以在不同机器上启动同样的镜像和参数。之后还可以用 Docker Compose 编排 MySQL、Go 后端和前端。
更接近项目交付方式
Docker 不只是方便安装软件,它还解决怎样把应用及其运行环境一起交付给别人。
继续追问:如果前端、后端和数据库都需要分别执行 Docker 命令,能不能用一份配置统一启动?
最后判断
判断题直接给答案
删除 MySQL 容器后,数据一定会丢失。
答案:不一定。使用命名数据卷后,删除容器不会自动删除数据卷。
-p 3307:3306 表示 MySQL 在容器内监听 3307。
答案:错误。容器内仍然是 3306,本机通过 3307 访问。
mysql:latest 永远代表同一个 MySQL 版本。
答案:错误。latest 指向的版本可能发生变化。
Docker 镜像和 Docker 容器是同一个东西。
答案:错误。镜像是模板,容器是镜像运行后的实例。
DBeaver 是一个 MySQL 数据库。
答案:错误。DBeaver 是数据库客户端。
这一页最终只需要记住
- 使用 Docker 可以快速启动统一版本的 MySQL。
-p负责端口映射。-v负责数据持久化。-e负责传递启动配置。- 镜像是模板,容器是运行实例。
- 数据库容器可以重建,但数据卷需要谨慎保护。
MySQL 已经运行了,Go 后端应该如何连接它?
每次请求都创建一个新连接可以吗?