Docker 部署与配置 MySQL 5.7
使用 Docker 来管理数据库非常方便,它可以将数据库环境与你的主机系统完全隔离,实现快速部署、轻松迁移和清理。本教程将带你完成所有必要步骤。
第一步:拉取 MySQL 5.7 镜像
首先,我们需要从 Docker Hub 上获取官方的 MySQL 5.7 镜像。打开你的终端或命令行工具,输入以下命令:
docker pull mysql:5.7
第二步:运行 MySQL 容器并设置密码 (docker run 方式)
这是最关键的一步。在运行容器时,我们必须通过环境变量来设置 root 用户的初始密码。
docker run --name my-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=your_strong_password -d mysql:5.7
--name my-mysql
: 给你的容器起一个好记的名字。-p 3306:3306
: 将主机的 3306 端口映射到容器的 3306 端口。-e MYSQL_ROOT_PASSWORD=...
: 设置 root 用户的密码。请务必将your_strong_password
替换为你自己的强密码!-d
: 在后台运行容器。
第三步:连接到你的 MySQL 数据库
你可以通过主机上的 MySQL 客户端(如 Navicat, DataGrip)或进入容器内部进行连接。
- 主机/IP:
127.0.0.1
- 端口:
3306
- 用户:
root
- 密码: 你设置的密码
要进入容器内部,请使用 docker exec -it my-mysql bash
,然后运行 mysql -u root -p
。
第四步:数据持久化(非常重要!)
为了防止容器删除后数据丢失,我们需要将数据目录挂载到主机上。如果你已通过第二步启动了容器,请先用 docker stop my-mysql
和 docker rm my-mysql
将其停止并删除。
然后使用 -v
参数重新启动:
docker run --name my-mysql \
-p 3306:3306 \
-v /my/custom/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=your_strong_password \
-d mysql:5.7
-v /my/custom/mysql/data:/var/lib/mysql
: 将主机上的/my/custom/mysql/data
目录(你可以自定义)挂载到容器内的/var/lib/mysql
目录。
第五步:基本数据库操作
连接成功后,你可以执行标准的 SQL 命令,如 CREATE DATABASE my_app_db;
等。
第六步:使用 Docker Compose 管理 MySQL (推荐)
当你的应用变得复杂(例如,一个网站后端 + 一个数据库),使用 docker run
命令来管理多个容器会非常繁琐。Docker Compose 允许你使用一个 YAML 文件来定义和运行一个多容器的 Docker 应用。
1. 创建 docker-compose.yml
文件
在你的项目目录下,创建一个名为 docker-compose.yml
的文件,并填入以下内容:
# 指定 docker-compose 文件版本
version: '3.7'# 定义服务
services:# 服务名称,可以自定义,这里叫 dbdb:# 使用的镜像image: mysql:5.7# 容器名称container_name: my-mysql-compose# 设置容器在退出时总是重新启动,以保证服务高可用restart: always# 环境变量,等同于 docker run 的 -e 参数environment:MYSQL_ROOT_PASSWORD: your_strong_password # 在这里设置你的密码# 你也可以在这里设置其他环境变量,例如:# MYSQL_DATABASE: my_app_db# MYSQL_USER: app_user# MYSQL_PASSWORD: user_password# 端口映射,等同于 docker run 的 -p 参数ports:- "3306:3306"# 数据卷挂载,等同于 docker run 的 -v 参数volumes:- ./mysql-data:/var/lib/mysql# 你也可以在这里定义一个顶层 volumes,更规范
# volumes:
# mysql_data:
# 然后在上面的 services.db.volumes 中使用 - mysql_data:/var/lib/mysql
文件解析:
version
: 定义了docker-compose.yml
文件的语法版本。services
: 定义了应用包含的所有服务(容器)。db
: 我们为 MySQL 服务起的名字。image
,container_name
,ports
,environment
: 这些都与docker run
命令中的参数一一对应。restart: always
: 这是一个非常有用的配置,它能确保在 Docker 重启或容器因故退出后,自动重新启动该容器。volumes
: 定义数据卷挂载。这里的./mysql-data:/var/lib/mysql
表示将当前目录下的mysql-data
文件夹挂载到容器的/var/lib/mysql
。Compose 会自动为你创建这个文件夹。
2. 启动和停止服务
现在,你只需要在 docker-compose.yml
文件所在的目录下,使用简单的命令就可以管理你的 MySQL 服务了。
-
启动服务(后台运行):
docker-compose up -d
-
查看服务状态和日志:
docker-compose ps docker-compose logs -f db
-
停止并移除容器、网络:
docker-compose down
使用
docker-compose down
命令会停止并删除容器,但通过volumes
挂载的数据(即mysql-data
文件夹)会保留下来,这正是我们想要的。
附录:数据卷挂载 (Volume) vs. 文件拷贝 (COPY)
这是一个非常重要的概念,理解它们的区别有助于你正确地管理 Docker 数据。
特性 | 数据卷挂载 (Volume / Mount) | 文件拷贝 (COPY / docker cp ) |
---|---|---|
核心机制 | 实时映射/链接 | 一次性复制 |
数据流向 | 双向同步。主机和容器的更改会立即互相反映。 | 单向。从主机复制到容器(或反向),之后两者独立。 |
生命周期 | 数据独立于容器存在。删除容器后,主机上的数据依然保留。 | 数据成为容器/镜像的一部分。删除容器,复制进去的数据也会随之删除。 |
性能 | 通常性能更高,特别是对于大量读写操作(如数据库)。 | 每次复制都需要 I/O 操作,不适合频繁更改的数据。 |
使用场景 | 1. 数据库文件 2. 日志文件 3. 需要在主机上直接编辑的配置文件 | 1. 构建镜像时 (COPY 指令),将应用代码、静态资源打包进镜像。2. 运行时 ( docker cp ),从容器里取出一个日志快照,或向容器里传入一个临时文件。 |
命令示例 | docker run -v ... volumes: (in docker-compose) | COPY . /app (in Dockerfile)docker cp file.txt my-container:/tmp |
简单类比:
- 数据卷挂载就像在你电脑上为某个文件夹创建了一个快捷方式。你通过快捷方式修改文件,实际上修改的是原始文件。删除快捷方式,原始文件不受影响。
- 文件拷贝就像你把一个文件复制粘贴到另一个地方。之后你有了两个独立的文件副本,修改其中一个不会影响另一个。
对于数据库这种需要持久化且数据会频繁变动的应用,永远应该使用数据卷挂载。