#### 2.5.6.1 使用 Docker 部署 MySQL 服务器的基本步骤

警告

MySQL 团队维护的 MySQL Docker 镜像是专门为 Linux 平台构建的。不支持其他平台，并且在其上使用这些 MySQL Docker 映像的用户自行承担风险。看[这里的讨论](deploy-mysql-nonlinux-docker.html)了解在非 Linux 操作系统上运行这些容器的一些已知限制。

-   [下载 MySQL 服务器 Docker 映像](docker-mysql-getting-started.html#docker-download-image)

-   [启动 MySQL 服务器实例](docker-mysql-getting-started.html#docker-starting-mysql-server)

-   [从容器内连接到 MySQL 服务器](docker-mysql-getting-started.html#docker-connecting-within-container)

-   [容器外壳访问](docker-mysql-getting-started.html#docker-shell-access)

-   [停止和删除 MySQL 容器](docker-mysql-getting-started.html#docker-stopping-deleting)

-   [升级 MySQL 服务器容器](docker-mysql-getting-started.html#docker-upgrading)

-   [更多关于使用 Docker 部署 MySQL 服务器的主题](docker-mysql-getting-started.html#docker-more-topics)

##### 下载 MySQL 服务器 Docker 映像

重要的

*MySQL企业版用户*：需要订阅才能使用 MySQL 企业版的 Docker 镜像。订阅采用自带许可模式；看[如何购买 MySQL 产品和服务](https://www.mysql.com/buy-mysql/)详情。

在单独的步骤中下载服务器映像并不是绝对必要的；但是，在创建 Docker 容器之前执行此步骤可确保您的本地映像是最新的。要下载 MySQL Community Edition 映像，请运行以下命令：

```
docker pull mysql/mysql-server:tag
```

这*`标签`*是您要提取的图像版本的标签（例如，`5.6`,`5.7`,`8.0`， 要么`最新的`）。如果**`:*`标签`*`**被省略，则`最新的`使用标签，并下载 MySQL Community Server 最新 GA 版本的镜像。有关可用版本，请参阅标签列表[Docker Hub 中的 mysql/mysql-server 页面](https://hub.docker.com/r/mysql/mysql-server/tags/).

要从 Oracle Container Registry (OCR) 下载 MySQL Community Edition 映像，请运行以下命令：

```
docker pull container-registry.oracle.com/mysql/mysql-server:tag
```

要从 OCR 下载 MySQL 企业版镜像，您需要首先接受 OCR 上的许可协议并使用您的 Docker 客户端登录到容器存储库：

-   访问 OCR<https://container-registry.oracle.com/>并选择 MySQL。

-   在 MySQL 存储库列表下，选择`企业服务器`.

-   如果您尚未登录 OCR，请单击页面右侧的登录按钮，然后在提示时输入您的 Oracle 帐户凭据。

-   按照页面右侧的说明接受许可协议。

-   使用 Docker 客户端（`码头工人`命令）使用`码头工人登录`命令：

    ```
    # docker login container-registry.oracle.com
    Username: Oracle-Account-ID
    Password: password
    Login successful.
    ```

    使用以下命令从 OCR 下载 MySQL 企业版的 Docker 映像：


```
docker pull  container-registry.oracle.com/mysql/enterprise-server:tag
```

有不同的选择**`*`标签`*`**，对应OCR提供的不同版本的MySQL Docker镜像：

-   `8.0`, `8.0.*`x`*` (*`x`*是 8.0 系列中的最新版本号），`最新的`: MySQL 8.0，最新GA

-   `5.7`, `5.7.*`是的`*` (*`是的`*是5.7系列的最新版本号）：MySQL 5.7

    从以下位置下载 MySQL 企业版映像[我的 Oracle 支持](https://support.oracle.com/)网站，进入网站，登录到您的 Oracle 帐户，然后在您进入登录页面后执行以下步骤：

-   选择补丁和更新选项卡。

-   转到 Patch Search 区域，然后在 Search 选项卡上切换到 Product or Family (Advanced) 子选项卡。

-   在 Product 字段中输入“MySQL Server”，在 Release 字段中输入所需的版本号。

-   使用其他过滤器的下拉菜单选择描述—包含，然后在文本字段中输入“Docker”。

    下图显示了 MySQL Server 8.0 的 MySQL Enterprise Edition 镜像的搜索设置：

    <img alt="Diagram showing search settings for MySQL Enterprise image" src="images/docker-search2.png" height="298" width="922" />

-   单击“搜索”按钮，从结果列表中选择所需的版本，然后单击“下载”按钮。

-   在出现的文件下载对话框中，单击并下载`。压缩`Docker 映像的文件。

    解压下载的`。压缩`存档以获取里面的压缩包（`mysql-企业服务器-*`版本`*。柏油`)，然后通过运行以下命令加载图像：


```
docker load -i mysql-enterprise-server-version.tar
```

您可以使用以下命令列出下载的 Docker 映像：

```
$> docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
mysql/mysql-server   latest              3157d7f55f8d        4 weeks ago         241MB
```

##### 启动 MySQL 服务器实例

要为 MySQL 服务器启动新的 Docker 容器，请使用以下命令：

```
docker run --name=container_name  --restart on-failure -d image_name:tag
```

图像名称可以使用**码头工人图像**命令，如中所述[下载 MySQL 服务器 Docker 映像](docker-mysql-getting-started.html#docker-download-image).

这`- 姓名`选项，用于为您的服务器容器提供自定义名称，是可选的；如果没有提供容器名称，则会生成一个随机名称。

这`- 重新开始`选项用于配置[重启政策](https://docs.docker.com/config/containers/start-containers-automatically/)用于您的容器；它应该设置为值`失败时`, 以支持在客户端会话中重新启动服务器（例如，当[重新开始](restart.html)语句由客户端执行或在[InnoDB 集群实例的配置](https://dev.mysql.com/doc/mysql-shell/8.0/en/configuring-production-instances.html#configuring-local-instances)）。启用对重新启动的支持后，在客户端会话中发出重新启动会导致服务器和容器停止然后重新启动。*MySQL 8.0.21 及更高版本支持服务器重启。*

例如，要为 MySQL 社区服务器启动一个新的 Docker 容器，请使用以下命令：

```
docker run --name=mysql1 --restart on-failure -d mysql/mysql-server:8.0
```

要使用从 OCR 下载的 Docker 映像为 MySQL Enterprise Server 启动新的 Docker 容器，请使用以下命令：

```
docker run --name=mysql1 --restart on-failure -d container-registry.oracle.com/mysql/enterprise-server:8.0
```

要使用从 My Oracle Support 下载的 Docker 映像为 MySQL Enterprise Server 启动新的 Docker 容器，请使用以下命令：

```
docker run --name=mysql1 --restart on-failure -d mysql/enterprise-server:8.0
```

如果指定名称和标签的 Docker 镜像没有被之前的**码头工人拉**要么**码头运行**命令，图像现在已下载。容器的初始化开始，当您运行容器时，容器会出现在正在运行的容器列表中**码头工人ps**命令。例如：

```
$> docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED             STATUS                              PORTS                NAMES
a24888f0d6f4   mysql/mysql-server   "/entrypoint.sh my..."   14 seconds ago      Up 13 seconds (health: starting)    3306/tcp, 33060/tcp  mysql1
```

容器初始化可能需要一些时间。当服务器准备好使用时，`状态`容器的输出中的**码头工人ps**命令从`（健康：开始）`到`（健康）`.

这`-d`中使用的选项**码头运行**上面的命令使容器在后台运行。使用此命令监视容器的输出：

```
docker logs mysql1
```

初始化完成后，命令的输出将包含为 root 用户生成的随机密码；例如，使用以下命令检查密码：

```
$> docker logs mysql1 2>&1 | grep GENERATED
GENERATED ROOT PASSWORD: Axegh3kAJyDLaRuBemecis&EShOs
```

##### 从容器内连接到 MySQL 服务器

服务器准备就绪后，您可以运行[**mysql**](mysql.html)刚刚启动的 MySQL Server 容器中的客户端，并将其连接到 MySQL Server。使用**码头工人执行-它**命令启动[**mysql**](mysql.html)您已启动的 Docker 容器内的客户端，如下所示：

```
docker exec -it mysql1 mysql -uroot -p
```

当被询问时，输入生成的 root 密码（请参阅中的最后一步[启动 MySQL 服务器实例](docker-mysql-getting-started.html#docker-starting-mysql-server)上面关于如何找到密码）。因为[`MYSQL_ONETIME_PASSWORD`](docker-mysql-more-topics.html#docker_var_mysql_onetime_password)选项默认为真，连接后[**mysql**](mysql.html)客户端到服务器，您必须通过发出以下语句重置服务器根密码：

```
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
```

代替*`密码`*使用您选择的密码。重置密码后，服务器就可以使用了。

##### 容器外壳访问

要拥有对 MySQL 服务器容器的 shell 访问权限，请使用**码头工人执行-它**在容器内启动 bash shell 的命令：

```
$> docker exec -it mysql1 bash
bash-4.2#
```

然后，您可以在容器内运行 Linux 命令。例如，要查看容器内服务器数据目录中的内容，请使用以下命令：

```
bash-4.2# ls /var/lib/mysql
auto.cnf    ca.pem	     client-key.pem  ib_logfile0  ibdata1  mysql       mysql.sock.lock	   private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile1  ibtmp1   mysql.sock  performance_schema  public_key.pem   server-key.pem
```

##### 停止和删除 MySQL 容器

要停止我们创建的 MySQL 服务器容器，请使用以下命令：

```
docker stop mysql1
```

**码头工人站**发送一个 SIGTERM 信号到[**mysqld**](mysqld.html)进程，以便服务器正常关闭。

还要注意，当一个容器的主进程（[**mysqld**](mysqld.html)在 MySQL Server 容器的情况下）停止，Docker 容器会自动停止。

再次启动 MySQL 服务器容器：

```
docker start mysql1
```

要使用单个命令停止并重新启动 MySQL 服务器容器：

```
docker restart mysql1
```

要删除 MySQL 容器，请先将其停止，然后使用**码头工人**命令：

```
docker stop mysql1
```

```
docker rm mysql1
```

如果你想要[服务器数据目录的 Docker 卷](docker-mysql-more-topics.html#docker-persisting-data-configuration)要同时删除，添加`-v`选项**码头工人**命令。

##### 升级 MySQL 服务器容器

重要的

-   在对 MySQL 进行任何升级之前，请仔细遵循中的说明[第 2.11 节，“升级 MySQL”](upgrading.html).在此处讨论的其他说明中，在升级之前备份数据库尤为重要。

-   本节中的说明要求服务器的数据和配置已持久保存在主机上。看[持久化数据和配置更改](docker-mysql-more-topics.html#docker-persisting-data-configuration)详情。

    按照以下步骤将 MySQL 5.7 的 Docker 安装升级到 8.0：

-   停止 MySQL 5.7 服务器（容器名称为`mysql57`在这个例子中）：

    ```
    docker stop mysql57
    ```

-   下载 MySQL 8.0 服务器 Docker 映像。请参阅中的说明[下载 MySQL 服务器 Docker 映像](docker-mysql-getting-started.html#docker-download-image);确保为 MySQL 8.0 使用正确的标签。

-   启动一个新的 MySQL 8.0 Docker 容器（名为`mysql80`在这个例子中）使用旧的服务器数据和配置（如果需要，进行适当的修改——见[第 2.11 节，“升级 MySQL”](upgrading.html)）已在主机上（由[绑定安装](https://docs.docker.com/engine/reference/commandline/service_create/#add-bind-mounts-or-volumes)在这个例子中）。对于 MySQL 社区服务器，运行以下命令：

    ```
    docker run --name=mysql80 \
       --mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf \
       --mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql \
       -d mysql/mysql-server:8.0
    ```

    如果需要，调整`mysql/mysql-服务器`到正确的图像名称 - 例如，将其替换为`container-registry.oracle.com/mysql/enterprise-server`对于从 OCR 下载的 MySQL 企业版图像，或`mysql/企业服务器`用于从下载的 MySQL Enterprise Edition 映像[我的 Oracle 支持](https://support.oracle.com/).

-   等待服务器完成启动。您可以使用以下命令检查服务器的状态**码头工人ps**命令（见[启动 MySQL 服务器实例](docker-mysql-getting-started.html#docker-starting-mysql-server)如何做到这一点）。

-   *对于 MySQL 8.0.15 及更早版本：*跑过[mysql\_升级](mysql-upgrade.html)MySQL 8.0 Server 容器中的实用程序（MySQL 8.0.16 及更高版本不需要）：

    ```
    docker exec -it mysql80 mysql_upgrade -uroot -p
    ```

    出现提示时，输入旧 MySQL 5.7 服务器的 root 密码。

-   通过重启 MySQL 8.0 Server 容器完成升级：

    ```
    docker restart mysql80
    ```

##### 更多关于使用 Docker 部署 MySQL 服务器的主题

有关使用 Docker 部署 MySQL 服务器的更多主题，例如服务器配置、持久化数据和配置、服务器错误日志和容器环境变量，请参阅[第 2.5.6.2 节，“使用 Docker 部署 MySQL 服务器的更多主题”](docker-mysql-more-topics.html).
