Mastering Docker & MySQL: A Step-by-Step Tutorial – wiki词典

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

Docker and 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带来的便利吧!

滚动至顶部