1. 概述

在当今的技术时代,企业需要快速发布应用以吸引并留住业务。这就要求开发团队能够更快地构建和配置部署环境,同时降低成本。然而,容器化技术为构建轻量级基础设施提供了帮助。

本文将详细阐述如何在一个基于容器的环境中部署和连接MySQL服务器。

现在,让我们深入探讨其细节。

2. MySQL容器部署

首先,我们来看看MySQL容器部署的步骤。MySQL遵循客户端-服务器架构模型,其中服务器是一个包含数据库的容器镜像,而客户端用于在主机机器上访问数据库。

我们将部署流程分为三个部分。

2.1. MySQL服务器部署

现在,让我们将MySQL服务器实例引入Docker。我们可以简单地基于从Docker Hub拉取的MySQL镜像构建一个容器。选择从Docker Hub拉取哪个版本的镜像时,我们需要考虑两点:

  • 官方镜像标记:这些是由MySQL开发者团队提供的更安全、经过精心挑选的镜像。
  • 最新标签:除非我们对MySQL版本有所保留,否则可以选择仓库中可用的最新版本。

使用docker pull命令从Docker Hub拉取官方MySQL镜像:

$ docker pull mysql:latest
latest: Pulling from library/mysql
f003217c5aae: Pull complete
…
… output truncated …
…
70f46ebb971a: Pull complete
db6ea71d471d: Waiting
c2920c795b25: Downloading [=================================================> ]  105.6MB/107.8MB
26c3bdf75ff5: Download complete

通常,镜像由紧密耦合在一起的有序层组成,这些层存储在manifest文件中。我们的docker pull命令会从blob存储获取镜像的层,并自动使用manifest文件创建镜像:

…
… output truncated …
…
4607fa685ac6: Pull complete
Digest: sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

打包后的镜像将获得一个哈希代码,如上所示供后续参考。

现在,让我们运行容器。通常,docker run命令会在镜像层之上创建可写的容器层。我们需要使用-name参数提供容器名称,并使用带有最新标签的MySQL镜像。此外,我们将通过环境变量MYSQL_ROOT_PASSWORD设置MySQL服务器密码。在我们的例子中,密码设置为"baeldung"。

最后,使用-d选项以守护进程模式运行容器。输出会抛出另一个哈希代码,以便于后续的容器管理:

$ docker run --name bael-mysql-demo -e MYSQL_ROOT_PASSWORD=baeldung -d mysql:latest
fedf880ce2b690f9205c7a37f32d75f669fdb1da2505e485e44cadd0b912bd35

我们可以通过docker ps命令查看主机上的所有运行中的容器

$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                 NAMES
fedf880ce2b6   mysql:latest   "docker-entrypoint.s…"   17 seconds ago   Up 16 seconds   3306/tcp, 33060/tcp   bael-mysql-demo

2.2. MySQL客户端安装

为了方便访问MySQL服务器,必须安装客户端。根据需要,我们可以在主机机器或其他具有与服务器容器网络可达性的机器或容器上安装客户端:

$ sudo apt install mysql-client -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
mysql-client is already the newest version (5.7.37-0ubuntu0.18.04.1).
…
… output truncated …
…

现在,让我们启用安装路径和MySQL客户端版本的提取:

$ which mysql
/usr/bin/mysql
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.37, for Linux (x86_64) using  EditLine wrapper

2.3. 建立通信

接下来,使用已安装的客户端登录服务器。传统上,我们使用用户名和密码登录服务器。但在基于容器的解决方案中,这将无法工作

$ mysql -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

如上图所示,我们将收到socket错误。重要的是要理解MySQL服务器是一个容器,而不是简单地安装在主机机器上。正如上一节所述,容器是拥有自己的计算资源、网络和存储的轻量级服务器。

docker inspect命令有助于为MySQL服务器实例分配IP地址

$ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' bael-mysql-demo
172.17.0.2

在客户端的主机选项中,让我们提供上述IP地址,使用默认端口号和TCP协议类型:

$ mysql -h 172.17.0.2 -P 3306 --protocol=tcp -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
…
… output truncated …
…
mysql>
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> exit
Bye

恭喜,我们成功登录到MySQL服务器!

3. 总结

总之,我们详细介绍了在基于容器的环境中部署MySQL服务器、在主机机器上安装MySQL客户端以及最终使用容器信息建立两者之间连接的步骤。