https://onitroad.com 更多教程

使用 Docker 实例

到目前为止,我们只讨论了启动 Docker 实例,但是如果没有客户端程序访问,它不是很有用。
使用标准 MySQL 客户端程序建立连接相当简单,因为它们使用本地套接字连接并通过 localhost 连接。
如果要使用网络 IP 进行连接,例如使用 MySQL Workbench,则稍微复杂一些。

这是本地 mysql CLI 连接的示例:

# docker exec -it mysql8 mysql -uroot

让我们分解该命令:

  • exec - 告诉 docker 在 docker 容器实例中执行命令。
  • -it - 告诉 docker 创建一个带有伪 tty 的交互式会话。
  • mysql8 - 告诉 docker 命令将在名为“mysql8”的容器实例中执行。
  • mysql -uroot - 这是 docker 在容器实例内执行的实际原始 shell 命令行。

MySQL Docker 容器包含 MySQL 命令行实用程序,例如 mysql、mysqlpump、mysqldump 等。
如果要将数据通过管道传输到命令行工具之一,例如加载转储,则需要删除 - t 从命令行,像这样:

# docker exec -i mysql8 mysql -uroot < dumpfile.sql

关闭和清理

完成测试后,如果启动时未使用 --rm ,则需要关闭 Docker 实例并清理文件。

要关闭 Docker 实例:

# docker stop mysql8

删除实例:

# docker rm mysql8

对 Docker 容器的 TCP/IP 访问

使用上面的示例命令,Docker 将为容器分配不可路由的私有 IP 地址并在系统上创建一个虚拟网络接口。
虚拟接口和容器构成了与容器中运行的服务建立 TCP/IP 连接的端点。

要找出 Linux 机器上虚拟网络接口的 IP 地址,请运行以下命令:

shell> ip addr show docker0
8: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:f7:98:c4:d1 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:f7ff:fe98:c4d1/64 scope link
valid_lft forever preferred_lft forever

在上面的示例中,我们可以看到分配给我的虚拟 Docker 接口的 IP 地址是 172.17.0.1,这是客户端应用程序将连接的端点;这是我们将用于在 MySQL 中创建用户的 IP 地址。

要确定分配给容器实例的 IP 地址,请运行以下命令,将示例中的“mysql”替换为实例名称:

shell> docker inspect mysql8 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",

在上面的输出中,容器实例的 IP 地址为 172.17.0.2,因此端点为 172.17.0.1 <-> 172.17.0.2.
接下来我们需要为客户端程序创建一个用户作为连接,否则我们将收到拒绝,因为 172.17.0.1 不是允许的主机。

shell> docker exec -it mysql8 mysql -uroot
mysql> create user root@172.17.0.1 identified by '';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on *.* to root@172.17.0.1 with grant option;
Query OK, 0 rows affected (0.01 sec)

创建网络用户后,我们可以以 root 身份连接到容器实例,无需密码。
172.17.0.0/16 网络是不可路由的私有网络,无法从机器外部访问,因此不会有人从外部访问 docker 容器。

Docker 是如何工作的

Docker 本身只是一个容器管理器,要有效地利用 Docker,我们需要访问 docker.io,该站点发布 Docker 容器镜像并可从中下载。
docker.io 上的 Docker 容器包含 MySQL 二进制文件的镜像和依赖项信息,以便 Docker 服务可以下载适当的运行时文件和虚拟文件系统,供 Docker 容器其中运行。

当你创建一个 Docker 容器实例时,它会为容器分配一个虚拟文件系统,该文件系统在运行中是持久的(除非你使用 -rm 开关)。
我们可以随意启动和停止 Docker 容器,并且它们将在重新启动后保持持久性。
Docker 的特性之一使其对于测试实例特别方便,即一旦停止就可以擦除容器。
如果我们使用 -rm 选项启动 Docker 容器,当容器关闭时,它也会从文件系统中删除并有助于消除垃圾。

安装

  1. 在具有 YUM 或者 DNF 并可以访问操作系统存储库的系统上,我们可以使用以下命令安装 docker:
# yum install docker docker-common

执行该命令后,YUM 应该会提示我们安装 docker 和任何必要的依赖项。

  1. 要使用 Docker,接下来需要启动服务:
# service docker start

在 CentOS/RHEL 7 发行版上,使用 systemctl:

# systemct start docker
  1. 如果我们希望每次重启后都可以使用 Docker,请使用以下命令启用它:
# chkconfig docker on

在 CentOS/RHEL 7 发行版上,使用 systemctl:

# systemct enable docker

创建和启动容器

这是在容器中启动最新 MySQL 版本并在关闭后将其删除的最简单命令:

# docker run --rm --name=mysql8 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql/mysql-server:latest

这是该命令的解码:

  • docker - docker 是用于执行所有 docker 功能的可执行文件名称。
  • run - 这是给 docker 的命令,它指示 docker 创建一个新容器并运行它。
  • -rm - 指示 docker 在停止后删除容器文件。
  • -name=mysql8 - 这告诉 docker 将容器命名为“mysql8”以供将来所有命令引用。这个名称是任意的,但应该是描述性的,以避免与多个容器实例发生冲突。
  • -e MYSQL_ALLOW_EMPTY_PASSWORD - 在创建阶段传递一个选项给容器,告诉容器在创建过程中分配一个空的 root 密码。
  • -d mysql/mysql-server:latest - 这会告诉 docker 在创建容器时要从 docker.io 下载的存储库和版本。 'latest' 这个词是一个神奇的版本,它告诉 docker 下载所有 MySQL 版本的最新版本,你也可以指定确切的版本号。

上述命令的一些有用更改可能是指定 MySQL 版本或者为其指定唯一名称。
以下是指定 MySQL 8.0.13 并使用类似唯一名称的示例:

# docker run --rm --name=mysql8013 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql/mysql-server:8.0.13

我们甚至可以通过这种方式拉起 MySQL 5.5 实例:

docker run --rm --name=mysql55 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql/mysql-server:5.5
如何创建用于测试的 MySQL Docker 容器

Docker 是一个容器运行时环境,它允许程序在没有任何外部依赖的情况下在被监禁的环境中运行。
容器在某些概念上类似于虚拟机,但是,它们不使用管理程序并在单个内检查确认例中运行,通常与其他容器共享该实例。
容器化的主要特征之一是缺乏外部依赖;容器具有运行应用程序所需的所有运行时库和组件。

自 MySQL 5.5.40 以来,Oracle 一直提供 Docker 容器镜像,因此 Docker 成为跨多个 MySQL 版本和发行版执行测试的绝佳选择。
很多时候,需要对错误进行回归测试以确定错误影响的版本或者量化版本之间的行为如何变化。

Docker 可以在测试完成后通过自动清理功能启动相当轻量的 MySQL 实例。
在这篇文章中,将介绍一些可以使用 Docker 启动 MySQL 并将其用于测试的方法。

在我们可以使用 Docker 之前,它必须安装在测试机器上。
如果我们无法直接访问 Linux 系统,我建议我们获取 VirtualBox 并创建一个 Linux 虚拟机来运行 Docker 镜像,操作系统的一些不错的选择是 CentOS 7 或者 Fedora(最新)。
Fedora 可以被视为企业 Linux 变体的上游,因此将保证拥有最新的技术支持。

日期:2020-09-17 00:16:26 来源:oir作者:oir