2.5.6.1 使用 Docker 部署 MySQL 服务器的基本步骤
MySQL 团队维护的 Docker 镜像专门为 Linux 平台构建。其他平台不受支持,使用这些 MySQL Docker 镜像的用户需要自行承担风险。请查看这里了解在非 Linux 操作系统上运行容器的已知限制。
对于 MySQL Enterprise Edition 的用户:需要订阅以使用 Docker 映像。订阅遵循 Bring Your Own License 模型;请参见购买 MySQL 产品和服务了解详细信息。
下载服务器映像单独步骤不必要,但是在创建 Docker 容器之前执行这个步骤确保本地映像是最新的。从Oracle 容器注册表(OCR)下载 MySQL 社区版映像,运行以下命令:
docker pull container-registry.oracle.com/mysql/community-server:tag
tag
是您想要拉取的映像版本标签(例如 8.4
、8.3
或 latest
)。如果省略了:
,将使用 tag
latest
标签,并下载 MySQL 社区服务器的最新 GA 发布版本(即最新创新发布)的映像。
从 OCR 下载 MySQL Enterprise Edition 映像,您需要首先在 OCR 上接受许可协议,然后使用 Docker 客户端登录容器存储库。按照以下步骤操作:
-
访问 OCR https://container-registry.oracle.com/,选择MySQL。
-
在 MySQL 仓库列表下,选择
enterprise-server
。 -
如果您还没有登录 OCR,请单击页面右侧的
按钮,然后输入 Oracle 账户凭证时提示。 -
按照页面右侧的指令接受许可协议。
-
使用容器客户端,例如,使用
docker login
命令登录OCR:# docker login container-registry.oracle.com Username: Oracle-Account-ID Password: password Login successful.
从OCR下载 MySQL Enterprise Edition 镜像,以此命令:
docker pull container-registry.oracle.com/mysql/enterprise-server:tag
在My Oracle Support网站上,登陆Oracle账户,然后在首页执行以下步骤:
-
选择
标签。 -
转到补丁搜索区域,在搜索标签,切换到产品或家谱(高级)子标签。
-
在“MySQL Server”,在 字段输入所需的版本号。
字段输入 -
使用下拉框选择“Docker”。
— ,并在文本框中输入以下图像显示了 MySQL Enterprise Edition 镜像的搜索设置,用于 MySQL Server 8.0:
-
单击
按钮,从结果列表中选择要下载的版本,然后单击 按钮。 -
出现的文件下载对话框,单击并下载
.zip
文件以获取 Docker 镜像。
将下载的 .zip
归档解压缩,获取内部的tar包(mysql-enterprise-server-
),然后运行以下命令来加载图像:version
.tar
docker load -i mysql-enterprise-server-version.tar
可以使用以下命令列出下载的 Docker 图像:
$> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
container-registry.oracle.com/mysql/community-server latest 1d9c2219ff69 2 months ago 496MB
要启动一个新的 MySQL 服务器 Docker 容器,使用以下命令:
docker run --name=container_name --restart on-failure -d image_name:tag
image_name
是要用来启动容器的图像名称;见下载 MySQL 服务器 Docker 图像以获取更多信息。
--name
选项是供给容器名称的可选项;如果不提供容器名称,会生成一个随机名称。
--restart
选项是配置容器重启策略,应该设置为on-failure
,以便在客户端会话中支持服务器重启(例如,在客户端执行RESTART语句或 Innodb 集群实例配置时)。当支持重启启用时,客户端会话中发出重启命令将导致服务器和容器停止,然后重新启动。
例如,要启动一个新的 MySQL 社区服务器 Docker 容器,使用以下命令:
docker run --name=mysql1 --restart on-failure -d container-registry.oracle.com/mysql/community-server:latest
要启动一个新的 MySQL 企业服务器 Docker 容器,使用从 OCR 下载的 Docker 图像,使用以下命令:
docker run --name=mysql1 --restart on-failure -d container-registry.oracle.com/mysql/enterprise-server:latest
使用从 My Oracle Support 下载的 MySQL 企业服务器 Docker 镜像启动新容器,使用以下命令:
docker run --name=mysql1 --restart on-failure -d mysql/enterprise-server:latest
如果指定名称和标签的 Docker 镜像尚未通过docker pull或docker run命令下载,则现在下载镜像。容器初始化开始,运行docker ps命令时,容器将出现在正在运行的容器列表中。例如:
$> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cd4129b3211 container-registry.oracle.com/mysql/community-server:latest "/entrypoint.sh mysq…" 8 seconds ago Up 7 seconds (health: starting) 3306/tcp, 33060-33061/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
连接 to MySQL Server from within the Container
当服务器准备就绪时,您可以在刚启动的 MySQL 服务器容器中运行mysql客户端,并连接到 MySQL 服务器。使用docker exec -it命令在您启动的 Docker 容器中启动mysql客户端,例如:
docker exec -it mysql1 mysql -uroot -p
当被询问时,输入生成的root密码(见启动MySQL服务器实例上一步中如何找到密码)。由于默认情况下MYSQL_ONETIME_PASSWORD
选项为真,因此在连接到服务器后,你必须使用以下语句重置服务器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 Server容器,可以使用以下命令:
docker stop mysql1
docker stop将SIGTERM信号发送给mysqld进程,因此服务器可以优雅地关闭。
也注意,当容器的主要进程(在MySQL Server容器中为mysqld)停止时,Docker容器自动停止。
要重新启动MySQL Server容器:
docker start mysql1
使用单个命令停止并重新启动 MySQL 服务器容器:
docker restart mysql1
要删除 MySQL 容器,首先停止它,然后使用docker rm命令:
docker stop mysql1
docker rm mysql1
如果您想在删除容器时同时删除服务器数据目录的 Docker 卷,添加 -v
选项到docker rm命令。
-
在升级 MySQL 之前,请仔细阅读第 3 章,升级 MySQL中的说明。其中特别重要的是在升级之前备份数据库。
-
本节中的指令要求服务器数据和配置已经在主机上 persisted。见保留数据和配置更改的详细信息。
按照以下步骤升级 MySQL 8.4 到 8.3:
-
停止 MySQL 8.4 服务器(容器名称在本例中是
mysql84
):docker stop mysql84
-
下载 MySQL 8.3 服务器 Docker 镜像。见下载 MySQL 服务器 Docker 镜像中的说明,确保使用正确的 MySQL 8.3 标签。
-
使用 Docker 启动一个名为
mysql83
的 MySQL 8.3 容器(在本例中),该容器带有宿主机上的老服务器数据和配置(如果需要进行修改—见第3章,升级 MySQLbind-mounting 在本例中)。对于 MySQL 社区服务器,运行以下命令:docker run --name=mysql84 \ --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 container-registry.oracle.com/mysql/community-server:8.3
如果需要,调整
container-registry.oracle.com/mysql/community-server
到正确的镜像名称—for 例如,替换为container-registry.oracle.com/mysql/enterprise-server
对 MySQL_ENTERPRISE_Edition 镜像从 OCR 下载,或者mysql/enterprise-server
对 MySQL_ENTERPRISE_Edition 镜像从 My Oracle 支持下载。 -
等待服务器完成启动。您可以使用docker ps 命令检查服务器状态(见启动 MySQL 服务器实例了解如何做到这点。
对升级在 8.3 系列(即从 release 8.3.x
到 8.3.y
)进行相同步骤:停止原始容器,然后启动一个新的容器,带有老服务器数据和配置。如果您使用了 8.3 或 latest
标签启动原始容器,现在想要升级到新版本,您必须首先使用以下命令拉取新版本镜像:
docker pull container-registry.oracle.com/mysql/community-server:8.3
然后,您可以通过启动一个新的容器,使用相同的标签和老数据、配置(如果使用MySQL Enterprise Edition,需要调整图像名称;见下载 MySQL 服务器 Docker 图像):
docker run --name=mysql84new \
--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 container-registry.oracle.com/mysql/community-server:8.3
有关使用 Docker 部署 MySQL 服务器的更多主题
关于使用 Docker 部署 MySQL 服务器的更多主题,例如服务器配置、持久化数据和配置、服务器错误日志和容器环境变量,请见第2.5.6.2节,“使用 Docker 部署 MySQL 服务器”。