Documentation Home

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

警告

MySQL 团队维护的 MySQL Docker 镜像是专门为 Linux 平台构建的。不支持其他平台,在这些平台上使用这些 MySQL Docker 映像的用户需自行承担风险。有关在非 Linux 操作系统上运行这些容器的一些已知限制, 请参阅 此处的讨论。

下载 MySQL 服务器 Docker 镜像
重要的

对于 MySQL Enterprise Edition 的用户:需要订阅才能使用 MySQL Enterprise Edition 的 Docker 映像。订阅通过自带许可模式进行;有关详细信息,请参阅 如何购买 MySQL 产品和服务

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

docker pull mysql/mysql-server:tag

是您要拉取的映像版本的tag标签(例如 、5.65.78.0latest。如果 省略,则使用标签,并下载 MySQL Community Server 最新 GA 版本的图像。请参阅Docker Hub 中 mysql/mysql-server 页面上可用版本的标签列表 。 :taglatest

要从 Oracle 容器注册表 (OCR) 下载 MySQL 社区版映像,请运行以下命令:

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

从OCR下载MySQL企业版镜像,需要先在OCR上接受许可协议,然后使用Docker客户端登录容器仓库:

  • 访问 https://container-registry.oracle.com/上的 OCR并选择MySQL

  • 在 MySQL 存储库列表下,选择 enterprise-server.

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

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

  • 使用以下命令通过Docker 客户端( docker命令)登录 OCR docker login

    # 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

有不同的选择 tag,对应OCR提供的不同版本的MySQL Docker镜像:

  • 8.0, (是8.0系列最新版本号) ,:MySQL 8.0,最新GA 8.0.xxlatest

  • 5.7, (是5.7系列中最新的版本号): MySQL 5.7 5.7.yy

要从 My Oracle Support网站下载 MySQL Enterprise Edition 映像,请访问该网站,登录您的 Oracle 帐户,并在进入登录页面后执行以下步骤:

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

  • 转到补丁搜索区域,然后在搜索选项卡上切换到 产品或系列(高级)子选项卡。

  • Product字段中 输入MySQL Server,并在Release 字段中输入所需的版本号。

  • 使用其他过滤器的下拉菜单选择 Descriptioncontains ,然后在文本字段中 输入Docker ” 。

    下图为MySQL Server 8.0的MySQL企业版镜像搜索设置:

    显示 MySQL Enterprise 图像的搜索设置的图表
  • 单击“搜索”按钮,然后从结果列表中选择所需的版本,然后单击“下载”按钮。

  • 在出现的“文件下载”对话框中,单击并下载 .zipDocker 映像的文件。

解压缩下载的.zip存档以获取里面的 tarball ( ),然后通过运行以下命令加载图像: mysql-enterprise-server-version.tar

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

可以使用docker images命令获取图像名称,如 下载 MySQL 服务器 Docker 图像中所述

为服务器容器提供自定义名称的--name选项是可选的;如果未提供容器名称,则会生成一个随机容器名称。

--restart选项用于为您的容器配置 重启策略;它应该设置为 value on-failure,以启用对客户端会话中服务器重启的支持(例如,当客户端执行 RESTART语句时或在InnoDB 集群实例的配置期间)。启用重启支持后,在客户端会话中发出重启会导致服务器和容器停止然后重启。 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 pulldocker run命令 没有下载指定名称和标签的 Docker 镜像,则现在下载该镜像。容器初始化开始,当您运行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

容器初始化可能需要一些时间。当服务器准备好使用时,docker ps 命令STATUS输出中容器的将从变为 。 (health: starting)(healthy)

上面的docker run命令中使用 的-d选项使容器在后台运行。使用此命令监视容器的输出:

docker logs mysql1

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

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

从容器内连接到 MySQL 服务器

服务器准备就绪后,您可以在刚刚启动的 MySQL 服务器容器中运行 mysql客户端,并将其连接到 MySQL 服务器。使用docker exec -it命令在您启动的 Docker 容器内启动一个 mysql客户端,如下所示:

docker exec -it mysql1 mysql -uroot -p

当询问时,输入生成的 root 密码(请参阅上面启动 MySQL 服务器实例中的最后一步,了解如何查找密码)。因为该 MYSQL_ONETIME_PASSWORD 选项默认为 true, 所以在将mysql客户端连接到服务器后,您必须通过发出以下语句来重置服务器 root 密码:

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

替换password为您选择的密码。重置密码后,服务器就可以使用了。

容器外壳访问

要获得对 MySQL Server 容器的 shell 访问权限,请使用 docker exec -it命令在容器内启动 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

docker stop向mysqld进程发送 SIGTERM 信号 ,以便正常关闭服务器。

另请注意,当容器的主进程(在 MySQL Server 容器中为mysqld)停止时,Docker 容器会自动停止。

再次启动 MySQL 服务器容器:

docker start mysql1

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

docker restart mysql1

要删除 MySQL 容器,请先将其停止,然后使用 docker rm命令:

docker stop mysql1
docker rm mysql1

如果要 同时删除服务器数据目录的 Docker 卷-v,请将选项添加到 docker rm命令。

升级 MySQL 服务器容器
重要的
  • 在对 MySQL 执行任何升级之前,请仔细按照第 2.11 节“升级 MySQL”中的说明进行操作。在那里讨论的其他说明中,在升级之前备份数据库尤为重要。

  • 本节中的说明要求服务器的数据和配置已保存在主机上。有关详细信息,请参阅持久化数据和配置更改

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

  • 停止 MySQL 5.7 服务器(本例中为容器名称 mysql57):

    docker stop mysql57
  • 下载 MySQL 8.0 服务器 Docker 映像。请参阅下载 MySQL 服务器 Docker 映像中的说明。确保为 MySQL 8.0 使用正确的标签。

  • 启动一个新的 MySQL 8.0 Docker 容器( mysql80在这个例子中命名),旧的服务器数据和配置(如果需要进行适当的修改 - 请参阅第 2.11 节,“升级 MySQL”)已经持久化在主机上(通过 绑定安装 在这个例子)。对于 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

    如果需要,调整为正确的图像名称——例如, 对于从 OCR 下载的 MySQL 企业版图像,或者 对于从My Oracle Supportmysql/mysql-server下载的 MySQL 企业版图像,将其替换 为。 container-registry.oracle.com/mysql/enterprise-servermysql/enterprise-server

  • 等待服务器完成启动。您可以使用docker ps 命令检查服务器的状态( 有关如何执行此操作, 请参阅启动 MySQL 服务器实例)。

按照相同的步骤在 8.0 系列中升级(即从 8.0 版升级x到 8.0版y):停止原始容器,并在旧服务器数据和配置上使用更新的映像启动一个新容器。如果您在启动原始容器时使用了8.0latest标签,并且现在有一个新的 MySQL 8.0 版本要升级到它,则必须首先使用以下命令拉取新版本的映像:

docker pull mysql/mysql-server:8.0

然后,您可以通过在旧数据和配置上使用相同标签启动一个新容器 来升级 (如果您使用的是 MySQL 企业版,请调整存储库名称;请参阅 下载 MySQL 服务器 Docker 映像):

docker run --name=mysql80new \
   --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 8.0.15 及更早版本:您需要通过 在 MySQL 8.0 Server 容器中 运行mysql_upgrade实用程序来完成升级过程( MySQL 8.0.16 及更高版本不需要该步骤)

  • docker exec -it mysql80 mysql_upgrade -uroot -p

    出现提示时,输入旧服务器的根密码。

  • 通过重新启动新容器来完成升级:

    docker restart mysql80
有关使用 Docker 部署 MySQL 服务器的更多主题

有关使用 Docker 部署 MySQL 服务器的更多主题,如服务器配置、持久数据和配置、服务器错误日志和容器环境变量,请参阅 第 2.5.6.2 节,“有关使用 Docker 部署 MySQL 服务器的更多主题”