精通 Docker 与 MySQL:一步步教你从入门到精通

在现代Web开发中,数据库管理是一项核心技能。MySQL作为世界上最受欢迎的关系型数据库之一,其部署和管理方式也在不断演进。Docker的出现,为我们提供了一种全新的、更高效的方式来处理MySQL实例。
本教程将引导你从零开始,学习如何使用Docker来管理MySQL数据库,内容涵盖从基础入门到进阶的最佳实践。
为什么选择Docker来管理MySQL?
- 环境一致性: Docker确保了在开发、测试和生产环境中的MySQL版本和配置完全一致,避免了“在我电脑上明明是好的”这类典型问题。
- 快速部署: 只需一条命令,你就可以在几秒钟内启动一个全新的MySQL实例。
- 隔离性: 每个MySQL容器都运行在自己的隔离环境中,互不干扰,便于管理多个项目。
- 易于迁移和扩展: Docker容器可以轻松地在不同服务器之间迁移,并且可以方便地进行水平扩展。
- 版本控制: 你可以精确控制所使用的MySQL版本,轻松升级或降级。
先决条件
在开始之前,请确保你的系统已经安装了Docker和Docker Compose。
安装完成后,打开你的终端或命令行工具,让我们开始吧!
第一步:从Docker Hub拉取MySQL镜像
Docker镜像是一个轻量级、可执行的软件包,包含了运行特定应用所需的一切。我们可以从Docker Hub(官方的镜像仓库)上获取官方的MySQL镜像。
打开终端,运行以下命令:
bash
docker pull mysql:8.0
这条命令会从Docker Hub下载MySQL 8.0版本的镜像。你可以通过 :tag 来指定特定版本,例如 mysql:5.7。如果不指定标签,默认会下载 latest 版本。
第二步:运行一个基础的MySQL容器
拉取镜像后,我们就可以用它来启动一个MySQL容器了。
bash
docker run --name my-mysql-container -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.0
让我们来分解一下这条命令:
docker run: 这是启动一个新容器的命令。--name my-mysql-container: 为你的容器指定一个好记的名字。-e MYSQL_ROOT_PASSWORD=my-secret-pw: 这是最关键的一步。通过-e标志设置环境变量。MYSQL_ROOT_PASSWORD是MySQL镜像要求的必须变量,用于设置root用户的密码。请务必替换my-secret-pw为你自己的强密码。-d:detached模式,让容器在后台运行。mysql:8.0: 指定用来创建容器的镜像。
现在,一个MySQL数据库实例已经在你的机器上运行起来了!你可以通过 docker ps 命令查看正在运行的容器。
第三步:持久化数据 – 使用Docker数据卷
上面的命令虽然启动了MySQL,但有一个严重问题:如果容器被删除,所有的数据都会丢失!因为数据默认存储在容器的可写层里。
为了解决这个问题,我们需要使用数据卷(Volumes)。数据卷可以将主机的目录映射到容器内部,从而将数据持久化到主机上。
首先,停止并删除刚刚创建的容器:
bash
docker stop my-mysql-container
docker rm my-mysql-container
然后,创建一个使用数据卷的新容器:
bash
docker run --name my-mysql-db -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.0
新参数的解释:
-v mysql-data:/var/lib/mysql: 这是数据卷的核心。mysql-data是我们创建的数据卷的名称。Docker会自动为你管理这个数据卷。/var/lib/mysql是MySQL容器内部存储数据的默认路径。- 这条配置将我们命名为
mysql-data的数据卷挂载到了容器的/var/lib/mysql目录。
现在,即使你删除这个容器 (my-mysql-db),只要 mysql-data 数据卷还在,你的数据就是安全的。当你下次用同一个数据卷启动新容器时,数据会自动加载。
第四步:连接到MySQL容器
容器已经运行起来了,我们该如何连接它呢?
1. 通过命令行工具连接
你可以使用 docker exec 命令进入容器内部,然后使用MySQL客户端。
bash
docker exec -it my-mysql-db mysql -u root -p
docker exec -it: 以交互模式进入一个正在运行的container。my-mysql-db: 你的容器名称。mysql -u root -p: 在容器内部执行mysql命令,使用root用户登录。
执行后,系统会提示你输入密码,也就是你之前设置的 my-secret-pw。
2. 通过图形化工具连接(如DBeaver, DataGrip, Navicat)
要在你的电脑上通过图形化工具连接,你需要把容器的端口映射到主机上。
首先,停止并删除旧的容器。然后,使用 -p 参数重新启动:
bash
docker run --name my-mysql-db \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-d mysql:8.0
新参数解释:
-p 3306:3306: 将主机的3306端口映射到容器的3306端口。- 前一个
3306是主机端口,后一个3306是容器端口。 - 如果你本地已经有服务占用了3306端口,可以将主机端口改为其他端口,例如
-p 3307:3306。
- 前一个
现在,你可以用任何MySQL图形化工具连接到 localhost:3306 (或者你设置的其他主机端口),用户名为 root,密码为你设置的密码。
第五步:使用Docker Compose – 更优雅的管理方式
当你的应用需要同时运行多个服务(例如一个Web应用和一个数据库)时,docker run 命令会变得非常长且难以管理。这时,Docker Compose 就派上用场了。
Docker Compose允许你使用一个 YAML 文件来定义和运行多容器的Docker应用。
在你的项目根目录下,创建一个名为 docker-compose.yml 的文件,并添加以下内容:
“`yaml
version: ‘3.8’
services:
db:
image: mysql:8.0
container_name: mysql_service
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
MYSQL_DATABASE: my_app_db
MYSQL_USER: my_app_user
MYSQL_PASSWORD: user_password
ports:
– “3306:3306”
volumes:
– mysql-data:/var/lib/mysql
volumes:
mysql-data:
“`
这个 docker-compose.yml 文件做了什么?
version: '3.8': 指定了Compose文件的版本。services: 定义了所有要运行的服务。我们这里只有一个db服务。db:image: 使用的镜像。container_name: 容器的名称。restart: unless-stopped: 除非手动停止,否则容器总会自动重启。environment: 设置环境变量。这里我们除了root密码,还额外创建了一个专用于应用的数据库(my_app_db)和用户(my_app_user),这是一个很好的安全实践。ports: 端口映射。volumes: 数据卷挂载。
volumes: 在文件末尾声明了要使用的命名数据卷。
现在,在 docker-compose.yml 文件所在的目录下,只需运行:
bash
docker-compose up -d
Docker Compose会自动读取配置文件,并为你创建和启动所有定义好的服务。
要停止并删除所有服务,运行:
bash
docker-compose down
使用Docker Compose极大地简化了复杂应用的部署和管理。
常用命令和技巧
- 查看正在运行的容器:
docker ps - 查看所有容器 (包括已停止的):
docker ps -a - 查看容器日志:
docker logs <container_name> - 停止容器:
docker stop <container_name> - 启动已停止的容器:
docker start <container_name> - 删除容器:
docker rm <container_name>(必须先停止) - 查看数据卷列表:
docker volume ls - 删除数据卷:
docker volume rm <volume_name>(请谨慎操作!)
总结
恭喜你!通过本教程,你已经掌握了使用Docker管理MySQL的核心技能。从简单的单容器运行,到使用数据卷进行数据持久化,再到利用Docker Compose进行优雅编排,你现在已经有能力在你的下一个项目中高效、可靠地部署MySQL了。
将Docker融入你的工作流,你会发现开发和部署变得前所未有的简单和有趣。继续探索,享受Docker带来的便利吧!