本节介绍如何使用Docker容器部署MySQL服务器。
虽然docker
客户端在以下说明中用于演示目的,但通常,Oracle提供的MySQL容器映像可以与符合OCI 1.0规范的任何容器工具一起使用。
在使用Docker容器部署MySQL之前,请确保您了解运行容器的安全风险并正确缓解它们。
使用Docker进行MySQL服务器部署的基本步骤
MySQL团队维护的MySQLDocker映像是专门为Linux平台构建的。其他平台不受支持,使用这些MySQLDocker映像的用户将自行承担风险。
下载MySQL服务器Docker镜像
对于MySQL企业版的用户:需要订阅才能使用MySQL企业版的Docker映像。
在单独的步骤中下载服务器镜像并不是绝对必要的;但是,在创建Docker容器之前执行此步骤可确保本地镜像是最新的。要从Oracle容器注册表(OCR)下载MySQL社区版镜像,请运行以下命令:
docker pull container-registry.oracle.com/mysql/community-server:tag
tag
是要拉取的镜像版本的标签/标记(例如8.4
,或9.1
,或latest
)。如果省略:
,则使用tag
latest
标签/标记,并下载MySQLCommunity Server的最新全量发布(即最新创新版本)的镜像。
要从OCR下载MySQL企业版镜像,您需要首先接受OCR的许可协议,并使用Docker客户端登录容器存储库。请按照以下步骤操作:
-
访问OCR地址https://container-registry.oracle.com/并选择MySQL。
-
在MySQL存储库列表下,选择
enterprise-server
。 -
如果您尚未登录OCR,请单击页面右侧的登录按钮,然后在提示时输入您的Oracle帐户凭据。
-
按照页面右侧的说明接受许可协议。
-
使用容器客户端登录到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
要从My Oracle Support网站下载MySQL企业版镜像,请访问该网站,签到您的Oracle帐户,并在落地页执行以下步骤:
1、选择补丁和更新选项卡。
2、转到补丁搜索区域,并在搜索选项卡上切换到产品或系列(高级)子选项卡。
3、为产品字段输入“MySQL Server”,并在发布字段中输入所需的版本号。
4、使用其他过滤器的下拉列表选择描述-包含,并在文本字段中输入“Docker”。
下图显示了MySQLServer 8.0MySQLEnterprise Edition镜像的搜索设置:
5、单击搜索按钮,然后从结果列表中选择所需的版本,然后单击下载按钮。
6、在出现的文件下载对话框中,单击并下载Docker镜像的.zip
文件。
解压下载的.zip
以获取里面的tarball(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服务器实例
要为MySQL服务器启动新的Docker容器,请使用以下命令:
docker run --name=container_name --restart on-failure -d image_name:tag
image_name
是用于启动容器的镜像的名称;
用于为服务器容器提供自定义名称的--name
选项是可选的;如果没有提供容器名称,则生成一个随机的。
--restart用于配置容器的重新启动策略;它应该设置为on-failure值,以启用对客户端会话内服务器重新启动的支持(例如,当客户端执行RESTART语句时或在配置InnoDB集群实例期间发生)。启用了对重新启动的支持后,在客户端会话中发出重新启动会导致服务器和容器停止,然后重新启动。
例如,要为MySQLCommunity Server启动新的Docker容器,请使用以下命令:
docker run --name=mysql1 --restart on-failure -d container-registry.oracle.com/mysql/community-server:latest
要使用从OCR下载的Docker镜像启动MySQLEnterprise Server的新Docker容器,请使用以下命令:
docker run --name=mysql1 --restart on-failure -d container-registry.oracle.com/mysql/enterprise-server:latest
要使用从My Oracle Support下载的Docker镜像为MySQLEnterprise Server启动新的Docker容器,请使用以下命令:
docker run --name=mysql1 --restart on-failure -d mysql/enterprise-server:latest
如果指定名称和标记的Docker镜像尚未通过先前的docker拉取或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
从容器内连接MySQL服务器
服务器准备好后,就可以在刚刚启动的MySQLServer容器内运行mysql客户端,并将其连接到MySQLServer。使用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
。密码重置后,服务器就可以使用了。
容器shell访问
要获得对MySQL服务器容器的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服务器容器的情况下为mysqld)停止时,Docker容器会自动停止。
要再次启动MySQL服务器容器:
docker start mysql1
使用以下命令停止并重新启动MySQL服务器容器:
docker restart mysql1
要删除MySQL容器,首先停止它,然后使用docker rm命令:
docker stop mysql1docker rm mysql1
如果希望同时删除服务器数据目录的Docker卷,请在docker rm命令中添加-v选项。
升级MySQL服务器容器
升级前备份数据库尤为重要。本节中的说明要求服务器的数据和配置已在主机上持久化。
按照以下步骤将MySQL8.4的Docker安装升级到9.1:
1、停止MySQL8.4服务器(本例中容器名称为mysql84
):
docker stop mysql84
2、下载MySQL9.1服务器Docker镜像。请参阅下载MySQL服务器Docker镜像中的说明。确保使用了正确的9.1MySQL标记。
3、使用旧的服务器数据和配置,启动一个新的MySQL9.1Docker容器(在本例中称为mysql91),这些数据和配置已在主机上持久化(在本例中通过绑定挂载)。对于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:9.1
-
如果需要,将
container-registry.oracle.com/mysql/community-server
调整为正确的镜像名称-例如,将其替换为从OCR下载的MySQL企业版图像的container-registry.oracle.com/mysql/enterprise-server
,或从我的Oracle支持下载的MySQL企业版镜像的mysql/enterprise-server
。
等待服务器完成启动。您可以使用docker ps命令检查服务器的状态(有关如何执行此操作,请参阅启动MySQL服务器实例)。
在9.1系列(即从版本9.1x
到9.1.y
)中升级时,请遵循相同的步骤:停止原始容器,并在旧服务器数据和配置上使用更新的镜像启动新容器。如果您在启动原始容器时使用了9.1或latest
标记,并且现在有一个新的MySQL9.1版本要升级到它,您必须首先使用以下命令拉取新版本的镜像:
docker pull container-registry.oracle.com/mysql/community-server:9.1
然后,您可以通过在旧数据和配置上启动具有相同标记的新容器来升级(如果您使用的是MySQL企业版,请调整镜像名称;请参阅 下载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:9.1
更多关于使用docker部署MySQL服务器的说明
大多数以下示例命令使用 container-registry.oracle.com/mysql/community-server 作为 Docker 镜像(例如在 docker pull 和 docker run 命令中);如果你使用的镜像来自其他仓库,请根据实际情况进行替换。
例如,如果你使用的是从 Oracle 容器注册表 (OCR) 下载的 MySQL 企业版 (Enterprise Edition) 镜像,可以将其替换为 container-registry.oracle.com/mysql/enterprise-server;或者,如果你使用的是从 My Oracle Support 下载的 MySQL 企业版镜像,可以将其替换为 mysql/enterprise-server。
针对docker对MySQL安装进行的优化
MySQL的Docker映像针对代码大小进行了优化,这意味着它们仅包含预计与在Docker容器中运行MySQL实例的大多数用户相关的关键组件。MySQLDocker安装在以下方面不同于常见的Docker安装:
-
仅包含有限数量的二进制文件。
-
所有二进制文件都被剥离;它们不包含调试信息。
用户对Docker容器执行的任何软件更新或安装(包括MySQL组件的更新或安装)都可能与Docker镜像创建的优化MySQL安装相冲突。Oracle不支持在这种更改的容器中运行的MySQL产品,或从更改的Docker镜像创建的容器。
配置MySQL服务器
启动MySQLDocker容器时,可以通过docker run命令将配置选项传递给服务器。例如:
docker run --name mysql1 -d container-registry.oracle.com/mysql/community-server:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_col
该命令以utf8mb4
作为默认字符集和utf8mb4_col
作为数据库的默认排序规则启动MySQL服务器。
配置MySQL服务器的另一种方法是准备配置文件并将其挂载到容器内服务器配置文件的位置。有关详细信息,请参阅下面关于持久化数据和配置更改。
持久化数据和配置更改
Docker容器原则上是短暂的,如果容器被删除或损坏,任何数据或配置都将丢失(参见此处的讨论)。Docker卷提供了一种机制来保存在Docker容器内创建的数据。在初始化时,MySQL服务器容器为服务器数据目录创建一个Docker卷。容器上的docker检查命令的JSON输出包括一个Mount键,其值提供有关数据目录卷的信息:
$> docker inspect mysql1
..."Mounts": [{"Type": "volume","Name": "4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652","Source": "/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data","Destination": "/var/lib/mysql","Driver": "local","Mode": "","RW": true,"Propagation": ""}],
...
输出显示源目录/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data
,其中数据保存在主机上,已挂载在容器内的服务器数据目录/var/lib/mysql
。
保存数据的另一种方法是在创建容器时使用--mount选项绑定挂载主机目录。同样的技术可用于持久化服务器的配置。以下命令创建MySQL服务器容器并绑定挂载数据目录和服务器配置文件:
docker run --name=mysql1 \
--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:tag
命令将
挂载到path-on-host-machine/my.cnf
(容器内的服务器配置文件),/etc/my.cnf
挂载到path-on-host-machine/datadir
/var/lib/mysql
(容器内的数据目录)。
-
配置文件
必须已经存在,并且必须包含用户path-on-host-machine/my.cnf
mysql
启动服务器的规范:[mysqld] user=mysql
您还可以在文件中包含其他服务器配置选项。
-
数据目录
必须已经存在。要进行服务器初始化,该目录必须为空。您也可以挂载预填充数据的目录并用它启动服务器;但是,您必须确保启动Docker容器时使用与创建数据的服务器相同的配置,并且在启动容器时挂载所需的任何主机文件或目录。path-on-host-machine/datadir
运行其他初始化脚本
如果有任何.sh
或.sql
脚本要在数据库创建后立即运行,您可以将它们放入主机目录,然后将目录挂载到容器内的/docker-entrypoint-initdb.d/
。例如:
docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/scripts/,dst=/docker-entrypoint-initdb.d/ \
-d container-registry.oracle.com/mysql/community-server:tag
从另一个Docker容器中的应用程序连接到MySQL
通过设置Docker网络,可以允许多个Docker容器相互通信,以便另一个Docker容器中的客户端应用程序可以访问服务器容器中的MySQLServer。首先,创建Docker网络:
docker network create my-custom-net
然后,当您创建和启动服务器和客户端容器时,使用--network
选项将它们放在您创建的网络上。例如:
docker run --name=mysql1 --network=my-custom-net -d container-registry.oracle.com/mysql/community-server
docker run --name=myapp1 --network=my-custom-net -d myapp
然后,myapp1
容器可以使用mysql1
主机名连接到mysql1
容器,反之亦然,Docker自动为给定的容器名称设置域名系统。在以下示例中,我们从mysql容器内部运行myapp1
客户端以连接到其自己容器中的主机mysql1
:
docker exec -it myapp1 mysql --host=mysql1 --user=myuser --password
服务器错误日志
使用服务器容器首次启动MySQL服务器时,如果以下任一条件为真,则不会生成服务器错误日志
- 已挂载主机中的服务器配置文件,但该文件不包含系统变量log_error(请参阅绑定挂载服务器配置文件时的持久化数据和配置更改)。
- 主机中的服务器配置文件尚未挂载,但Docker环境变量MYSQL_LOG_CONSOLE为true(这是该变量在MySQL8.4服务器容器中的默认状态)。然后,MySQL服务器的错误日志被重定向到stderr,以便错误日志进入Docker容器的日志,并且可以使用docker logsmysqld-container命令查看。
要使MySQL服务器在两个条件之一为真时生成错误日志,请使用--log-error选项将服务器配置为在容器内的特定位置生成错误日志。要持久化错误日志,请在容器内错误日志的位置挂载主机文件,如持久化数据和配置更改中所述。但是,您必须确保容器内的MySQL服务器对挂载的主机文件具有写访问权限。
通过docker使用MySQL企业备份
MySQL企业备份是MySQL服务器的commercially-licensed备份实用程序,MySQL企业版提供。MySQL企业备份包含在MySQL企业版的Docker安装中。
在下面的示例中,我们假设您已经有一个MySQL Server在Docker容器中运行(参见“使用Docker进行MySQLServer部署的基本步骤”关于如何使用Docker启动MySQLServer实例)。MySQLEnterprise Backup要备份MySQLServer,它必须有权访问服务器的数据目录。这可以通过例如在启动服务器时在MySQLServer的数据目录上绑定-挂载一个主机目录来实现:
docker run --name=mysqlserver \
--mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
-d mysql/enterprise-server:8.4
使用此命令,MySQL服务器以MySQL企业版的Docker镜像启动,主机目录/path-on-host-machine/datadir/已挂载到服务器容器内的服务器数据目录(/var/lib/mysql)上。我们还假设,在服务器启动后,也为MySQL企业备份设置了访问服务器所需的权限。使用以下步骤备份和恢复MySQLServer实例。
若要使用MySQLEnterprise Backup备份在Docker容器中运行的MySQLServer实例,请按照此处列出的步骤操作:
1、在运行MySQL Server容器的同一主机上,启动另一个具有MySQL Enterprise Edition镜像的容器,以使用MySQL Enterprise Backup命令备份到镜像执行备份。使用我们在最后一步中创建的绑定挂载提供对服务器数据目录的访问。此外,将主机目录(本例中为/path-on-host-machine/backup/)挂载到容器中用于备份的存储文件夹(本例中为/data/backup)上,以持久化我们正在创建的备份。以下是此步骤的示例命令,其中MySQL Enterprise Backup使用从My Oracle Support下载的Docker镜像启动:
$> docker run \
--mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
--mount type=bind,src=/path-on-host-machine/backups/,dst=/data/backups \
--rm mysql/enterprise-server:8.4 \
mysqlbackup -umysqlbackup -ppassword --backup-dir=/tmp/backup-tmp --with-timestamp \
--backup-image=/data/backups/db.mbi backup-to-image
通过mysqlbackup检查输出结束以确保备份已成功完成非常重要。
2、备份作业完成后,容器将退出,并使用--rm
选项启动它,退出后将其删除。镜像备份已创建,可以在最后一步中挂载的用于存储备份的主机目录中找到,如下所示:
$> ls /tmp/backups
db.mbi
若要使用MySQLEnterprise Backup在Docker容器中还原MySQLServer实例,请按照此处列出的步骤操作:
1、停止MySQL服务器容器,这也会停止MySQL服务器运行:
docker stop mysqlserver
2、在主机上,删除MySQLServer数据目录的绑定挂载中的所有内容:
rm -rf /path-on-host-machine/datadir/*
3、启动镜像为MySQLEnterprise Edition的容器,使用MySQLEnterprise Backup命令执行还原copy-back-and-apply-log。绑定挂载服务器的数据目录和备份的存储文件夹,就像我们备份服务器时所做的那样:
$> docker run \
--mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
--mount type=bind,src=/path-on-host-machine/backups/,dst=/data/backups \
--rm mysql/enterprise-server:8.4 \
mysqlbackup --backup-dir=/tmp/backup-tmp --with-timestamp \
--datadir=/var/lib/mysql --backup-image=/data/backups/db.mbi copy-back-and-apply-logmysqlbackup completed OK! with 3 warnings
容器退出时,会显示消息“mysqlbackup completed OK!”备份作业完成后,启动时使用--rm选项,退出后将其删除。
4、 使用以下命令重新启动服务器容器,该容器也会重新启动恢复的服务器:
docker restart mysqlserver
或者,在恢复的数据目录上启动一个新的MySQL服务器,如下所示:
docker run --name=mysqlserver2 \
--mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
-d mysql/enterprise-server:8.4
登录服务器以检查服务器是否正在使用恢复的数据运行。
使用docker执行mysqldump
除了使用MySQLEnterprise Backup备份在Docker容器中运行的MySQL服务器之外,您还可以使用在Docker容器中运行的mysqldump实用程序执行服务器的逻辑备份。
以下说明假设您已经有一个MySQL Server在Docker容器中运行,并且当容器首次启动时,主机目录/path-on-host-machine/datadir/已经挂载到服务器的数据目录 /var/lib/mysql(有关详细信息,请参阅MySQL Server数据目录上的绑定挂载主机目录),其中包含Unix套接字文件,mysqldump和mysql可以通过该文件连接到服务器。我们还假设,在服务器启动后,已经创建了一个具有适当权限的用户(本例中为admin),mysqldump可以通过该用户访问服务器。使用以下步骤备份和恢复MySQL Server数据:
在docker中使用mysqldump备份MySQL服务器数据:
1、在运行MySQL Server容器的同一主机上,启动另一个具有MySQL Server镜像的容器,以使用mysqldump实用程序执行备份(有关其功能、选项和限制,请参阅实用程序的留档)。通过绑定安装/path-on-host-machine/datadir/提供对服务器数据目录的访问。此外,将主机目录(本例中为/path-on-host-machine/backups/)挂载到容器内备份的存储文件夹中(本例中使用/data/backups),以持久化您正在创建的备份。以下是使用此设置备份服务器上所有数据库的示例命令:
$> docker run --entrypoint "/bin/sh" \
--mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
--mount type=bind,src=/path-on-host-machine/backups/,dst=/data/backups \
--rm container-registry.oracle.com/mysql/community-server:8.4 \
-c "mysqldump -uadmin --password='password' --all-databases > /data/backups/all-databases.sql"
在命令中,使用--entrypoint选项以便在容器启动后调用系统shell,使用-c选项指定在shell中运行的mysqldump命令,其输出被重定向到备份目录中的文件all-databases.sql。
2、 备份作业完成后,容器退出,使用--rm
选项启动它,退出后容器被删除。创建了一个逻辑备份,可以在为存储备份而安装的主机目录中找到,如下所示:
$> ls /path-on-host-machine/backups/
all-databases.sql
在docker中使用mysqldump恢复MySQL服务器数据:
1、确保在容器中运行MySQL服务器,希望将备份的数据还原到该容器上。
2、启动一个镜像为MySQL服务器的容器,以使用mysql客户端执行还原。绑定挂载服务器的数据目录,以及包含备份的存储文件夹:
$> docker run \
--mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
--mount type=bind,src=/path-on-host-machine/backups/,dst=/data/backups \
--rm container-registry.oracle.com/mysql/community-server:8.4 \
mysql -uadmin --password='password' -e "source /data/backups/all-databases.sql"
一旦备份作业完成,容器就会退出,并且在启动时使用--rm选项,退出后将其删除。
3、登录服务器以检查恢复的数据现在是否在服务器上。
已知问题
使用服务器系统变量audit_log_file配置审计日志文件名时,使用loose 选项修饰符;否则,Docker无法启动服务器。
Docker环境变量
创建MySQL服务器容器时,可以使用--env选项(简称-e)并指定一个或多个环境变量来配置MySQL实例。如果挂载的数据目录不为空,则不会执行服务器初始化,在这种情况下,设置这些变量中的任何一个都没有效果(请参阅持久化数据和配置更改),并且在容器启动期间不会修改目录的现有内容,包括服务器设置。
1、包括MYSQL_RANDOM_ROOT_PASSWORD、MYSQL_ONETIME_PASSWORD、MYSQL_ALLOW_EMPTY_PASSWORD和MYSQL_LOG_CONSOLE的布尔变量通过使用任何非零长度的字符串设置为true。因此,将它们设置为例如“0”、“false”或“no”不会使它们为假,但实际上会使它们为真。这是一个已知的问题。
2、MYSQL_RANDOM_ROOT_PASSWORD:当这个变量为true时(这是它的默认状态,除非MYSQL_ROOT_PASSWORD被设置或MYSQL_ALLOW_EMPTY_PASSWORD被设置为true),Docker容器启动时会生成服务器root用户的随机密码。密码被打印到容器的stdout中,可以通过查看容器的日志找到(参见启动MySQL服务器实例)。
3、MYSQL_ONETIME_PASSWORD:当变量为true时(这是它的默认状态,除非MYSQL_ROOT_PASSWORD已设置或MYSQL_ALLOW_EMPTY_PASSWORD设置为true),root用户的密码设置为过期,必须更改后才能正常使用MySQL。
4、MYSQL_DATABASE:此变量允许您指定要在镜像启动时创建的数据库的名称。如果提供了用户名和密码MYSQL_USER和MYSQL_PASSWORD,则创建用户并授予超级用户访问此数据库的权限(对应于GRANT ALL)。指定的数据库由CREATE DATABASE IF Not EXIST语句创建,因此如果数据库已经存在,则该变量无效。
5、MYSQL_USER,MYSQL_PASSWORD:这些变量结合使用来创建用户并设置该用户的密码,用户被授予MYSQL_DATABASE变量指定的数据库的超级用户权限。创建用户需要MYSQL_USER和MYSQL_PASSWORD——如果两个变量中的任何一个没有设置,另一个将被忽略。如果两个变量都设置了,但MYSQL_DATABASE没有设置,则创建用户时没有任何权限。
无需使用此机制来创建root超级用户,默认使用MYSQL_ROOT_PASSWORD和MYSQL_RANDOM_ROOT_PASSWORD描述中讨论的机制之一设置的密码创建,除非MYSQL_ALLOW_EMPTY_PASSWORD为真。
6、MYSQL_ROOT_HOST:默认情况下,MySQL创建'root'@'localhost'帐户。此帐户只能从容器内部连接到,如从容器内部连接到MySQL服务器。要允许来自其他主机的root连接,请设置此环境变量。例如,值172.17.0.1,这是默认Docker网关IP,允许来自运行容器的主机的连接。该选项只接受一个条目,但允许通配符(例如,MYSQL_ROOT_HOST=172.*.*.*或MYSQL_ROOT_HOST=%)。
7、MYSQL_LOG_CONSOLE:当变量为true时(这是MySQL8.4服务器容器的默认状态),MySQL服务器的错误日志被重定向到stderr,以便错误日志进入Docker容器的日志,并且可以使用docker logsmysqld-container命令查看。
如果已挂载主机中的服务器配置文件,则该变量无效(请参阅绑定挂载配置文件时的持久化数据和配置更改)。
8、MYSQL_ROOT_PASSWORD:此变量指定为MySQLroot帐户设置的密码。在命令行上设置MySQLroot用户密码是不安全的。作为显式指定密码的替代方法,您可以为密码文件设置带有容器文件路径的变量,然后从主机上挂载包含密码的文件到容器文件路径。这仍然不是很安全,因为密码文件的位置仍然暴露。最好使用默认设置MYSQL_RANDOM_ROOT_PASSWORD和MYSQL_ONETIME_PASSWORD都为真。
9、MYSQL_ALLOW_EMPTY_PASSWORD.将其设置为true以允许容器未开始使用root用户的空白密码。将此变量设置为true是不安全的,因为它会使您的MySQL实例完全不受保护,从而允许任何人获得完全的超级用户访问权限。最好使用MYSQL_RANDOM_ROOT_PASSWORD和MYSQL_ONETIME_PASSWORD都为true的默认设置。
使用Docker在Windows和其他非Linux平台上部署MySQL
Oracle提供的MySQLDocker映像是专门为Linux平台构建的。其他平台不受支持,运行OracleMySQLDocker映像的用户需自行承担风险。本节讨论在非Linux平台上使用映像时的一些已知问题。
在Windows上使用Oracle的MySQL服务器Docker映像的已知问题包括:
- 如果绑定挂载在容器的MySQL数据目录(有关详细信息,请参阅持久化数据和配置更改),则必须使用--socket选项将服务器套接字文件的位置设置为MySQL数据目录之外的某个位置;否则,服务器将无法启动。这是因为WindowsDocker处理文件挂载的方式不允许将主机文件绑定挂载到套接字文件上。