下面的大多数示例命令都有mysql / mysql服务器
作为Docker映像库,当必须指定时(如使用码头工人拉而且码头工人运行命令);如果您的映像来自另一个存储库,请更改此设置—例如,将其替换为container-registry.oracle.com/mysql/enterprise-server
从Oracle容器注册表(OCR)下载的MySQL企业版镜像,或者mysql /企业服务器
MySQL Enterprise Edition镜像我的Oracle支持.
优化的MySQL安装Docker
针对MySQL的Docker镜像针对代码大小进行了优化,这意味着它们只包含那些与在Docker容器中运行MySQL实例的大多数用户相关的关键组件。MySQL的Docker安装与普通的非Docker安装在以下几个方面不同:
包含的二进制文件仅限于:
/usr/bin/my_print_defaults
/usr/bin/mysql
/usr/bin/mysql_config
/usr/bin/mysql_install_db
/usr/bin/mysql_tzinfo_to_sql
/usr/bin/mysql_upgrade
/usr/bin/mysqladmin
/usr/bin/mysqlcheck
/usr/bin/mysqldump
/usr/bin/mysqlpump
/usr/bin/mysqlbackup
(仅适用于MySQL企业版8.0)/usr/sbin/mysqld
所有二进制文件都被剥离;它们不包含调试信息。
配置MySQL服务器
当你启动MySQL Docker容器时,你可以通过码头工人运行命令。例如:
mysql/mysql-server:标签——character-set-server = utf8mb4 collation-server = utf8mb4_col
该命令以utf8mb4
作为默认字符集和utf8mb4_col
作为数据库的默认排序规则。
另一种配置MySQL服务器的方法是准备一个配置文件,并将其挂载到容器内服务器配置文件的位置。看到持久化数据和配置更改获取详细信息。
持久化数据和配置更改
Docker容器原则上是临时性的,如果容器被删除或损坏,任何数据或配置都可能丢失(参见讨论)在这里).码头工人卷提供了一种机制来持久化在Docker容器中创建的数据。在初始化时,MySQL服务器容器为服务器数据目录创建一个Docker卷。的JSON输出码头工人检查命令在容器上包含一个山
键,其值提供数据目录卷的信息:
查看mysql1" mount ": [{"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
,容器内的服务器数据目录。
另一种保存数据的方法是绑定装载的主机目录——山
选项。同样的技术也可以用于持久化服务器的配置。下面的命令创建一个MySQL Server容器,并绑定挂载数据目录和服务器配置文件:
运行——name=mysql1 \——mount type=bind,src=/ path-on-host-machine my.cnf/etc/my.cnf \——mount type=bind,src=/ path-on-host-machine datadir/var/lib/mysql \ -d mysql/mysql-server:标签
命令挂载
在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)用户= mysql
还可以在文件中包含其他服务器配置选项。
数据目录
必须是已经存在的。要进行服务器初始化,目录必须为空。您还可以挂载一个预填充了数据的目录,并使用它启动服务器;但是,您必须确保使用与创建数据的服务器相同的配置启动Docker容器,并且在启动容器时挂载所需的任何主机文件或目录。path-on-host-machine / datadir
运行额外的初始化脚本
如果有的话. sh
或. sql
创建数据库后,您希望立即在数据库上运行的脚本,可以将它们放入一个主机目录,然后将该目录挂载到/ docker-entrypoint-initdb.d /
在容器中。例如:
运行——name=mysql1 \——mount type=bind,src=/ / path-on-host-machine /脚本dst = / docker-entrypoint-initdb。D / \ -d mysql/mysql-server:标签
从另一个Docker容器中的应用程序连接到MySQL
通过建立Docker网络,可以允许多个Docker容器相互通信,这样位于另一个Docker容器中的客户端应用程序就可以访问服务器容器中的MySQL服务器。首先,创建Docker网络:
码头工人网络创建my-custom-net
然后,在创建和启动服务器和客户机容器时,使用——网络
选项将它们放在您创建的网络上。例如:
运行Docker——name=mysql1——network=my-custom-net- d mysql / mysql服务器
执行Docker命令——name=myapp1——network=my-custom-net- d myapp
的myapp1
容器然后可以连接到mysql1
容器的mysql1
主机名,反之亦然,因为Docker会自动为给定的容器名设置DNS。在下面的例子中,我们运行mysql内部的客户端myapp1
连接到主机的容器mysql1
在自己的容器中:
myapp1 mysql——host=mysql1——user=myuser——password
有关容器的其他网络技术,请参见码头工人容器网络在Docker文档中。10bet官方网站
服务器错误日志
当MySQL服务器第一次用你的服务器容器启动时,a服务器错误日志如果以下任一条件为真,则不生成:
已挂载主机上的服务器配置文件,但配置文件中不包含系统变量
log_error
(见持久化数据和配置更改绑定挂载服务器配置文件)。主机上的服务器配置文件没有被挂载,而是Docker环境变量
MYSQL_LOG_CONSOLE
是真正的
(这是MySQL 8.0服务器容器中变量的默认状态)。MySQL服务器的错误日志被重定向到stderr
,以便错误日志进入Docker容器的日志中,并且可以使用码头工人日志mysqld-container
命令。
要使MySQL服务器在两个条件中的任何一个为真时生成错误日志,可以使用——日志错误
选项配置服务器在容器内的特定位置生成错误日志。要持久化错误日志,请按照中所述在容器内的错误日志位置挂载一个主机文件持久化数据和配置更改.但是,你必须确保你的MySQL服务器在它的容器中对挂载的主机文件有写访问权。
使用MySQL企业备份与Docker
MySQL企业备份是一个商业许可的MySQL服务器备份工具,可与MySQL企业版.MySQL企业备份包含在MySQL企业版的Docker安装中。
在下面的例子中,我们假设你已经有一个MySQL服务器运行在Docker容器中第2.5.6.1节,“使用Docker部署MySQL服务器的基本步骤”如何使用Docker启动MySQL服务器实例)。对于MySQL Enterprise Backup备份MySQL Server,它必须能够访问服务器的数据目录。这可以通过,例如,bind-mount一个主机目录到MySQL服务器的data目录启动服务器时:
运行——name=mysqlserver \——mount type=bind,src=/ path-on-host-machine / datadir //var/lib/mysql \ -d mysql/enterprise-server:8.0
使用此命令,MySQL服务器将以MySQL企业版的Docker映像和主机目录启动/ path-on-host-machine / datadir /
已挂载到服务器的数据目录(/var/lib/mysql
)在服务器容器中。我们还假设,在服务器启动之后,MySQL Enterprise Backup也已经设置了访问服务器所需的特权(参见为备份管理员授予MySQL权限,详情)。请按照以下步骤备份和恢复MySQL Server实例。
要使用带有Docker的MySQL Enterprise Backup来备份运行在Docker容器中的MySQL Server实例,请遵循下面列出的步骤:
在运行MySQL Server容器的同一主机上,启动另一个带有MySQL Enterprise Edition映像的容器,使用MySQL Enterprise Backup命令执行备份
backup-to-image
.使用我们在上一步创建的绑定挂载提供对服务器数据目录的访问。另外,挂载一个主机目录(/ / path-on-host-machine /备份
(在本例中)保存到容器(/数据/备份
(在本例中)以持久化正在创建的备份。下面是这个步骤的一个示例命令,其中MySQL Enterprise Backup启动时下载了一个Docker镜像我的Oracle支持):$> docker run \——mount type=bind,src=/ path-on-host-machine / datadir //var/lib/mysql \——mount type=bind,src=/ / path-on-host-machine /备份——rm mysql/enterprise-server:8.0 \ mysqlbackup -umysqlbackup- p密码——backup-image=/data/backups/dbmbi Backup -to- Image [Entrypoint] MySQL Docker Image 8.0.11-1.1.5 MySQL Enterprise Backup version 8.0.11 Linux-4.1.12-61.1.16.el7uek。版权(c) 2003,2018, Oracle和/或其附属公司。180921 17:27:25 MAIN INFO:创建的线程Id为'140594390935680' 180921 17:27:25 MAIN INFO:从以下命令行... ...开始------------------------------------------------------------- 参数的总结 ------------------------------------------------------------- 开始LSN: 29615616年底LSN: 29651854 ------------------------------------------------------------- mysqlbackup完成好的!
重要的是检查输出的结束mysqlbackup以确保备份已成功完成。
容器将在备份作业完成后退出
——rm
选项用于启动它,它退出后将被删除。镜像备份已经创建,可以在上一步挂载的用于保存备份的主机目录中找到,如下所示:$> ls /tmp/backups db.mbi
要在Docker容器中使用MySQL Enterprise Backup恢复MySQL Server实例,请遵循下面列出的步骤:
停止MySQL Server容器,它也会停止MySQL Server运行:
码头工人停止mysqlserver
在主机上,删除MySQL Server data目录的绑定挂载中的所有内容:
rm射频/ path-on-host-machine datadir/*
启动一个带有MySQL Enterprise Edition映像的容器,使用MySQL Enterprise Backup命令执行恢复
copy-back-and-apply-log
.绑定挂载服务器的数据目录和备份的存储文件夹,就像我们备份服务器时所做的那样:$> docker run \——mount type=bind,src=/ path-on-host-machine / datadir //var/lib/mysql \——mount type=bind,src=/ / path-on-host-machine /备份——rm mysql/enterprise-server:8.0 \ mysqlbackup——backup-dir=/tmp/backup-tmp——with-timestamp \——datadir=/var/lib/mysql——backup-image=/data/backups/db。mbi copy-back- apply-log [Entrypoint] MySQL Docker Image 8.0.11-1.1.5 MySQL Enterprise Backup version 8.0.11 Linux-4.1.12-61.1.16.el7uek. .版权(c) 2003,2018, Oracle和/或其附属公司。180921 22:06:52 MAIN INFO:创建的线程Id为'139768047519872' 180921 22:06:52 MAIN INFO:从以下命令行... ...开始180921 22:06:52 PCR1我们能够解析ibbackup_logfile到lsn 29680612180921 22:06:52 PCR1最后一个MySQL binlog文件位置0 155,文件名binlog。000003 180921 22:06:52 PCR1 INFO: The first data file is '/var/lib/mysql/ibdata1' and the new created log files are at '/var/lib/mysql' 180921 22:06:52 MAIN INFO: No Keyring file to process. 180921 22:06:52 MAIN INFO: Apply-log operation completed successfully. 180921 22:06:52 MAIN INFO: Full Backup has been restored successfully. mysqlbackup completed OK! with 3 warnings
容器将在备份作业完成后退出
——rm
在启动它时使用的选项,它退出后将被删除。重启服务器容器,服务器容器也会重启恢复的服务器,可以使用以下命令:
码头工人重启mysqlserver
或者,在恢复的数据目录上启动一个新的MySQL服务器,如下所示:
运行——name=mysqlserver2 \——mount type=bind,src=/ path-on-host-machine / datadir //var/lib/mysql \ -d mysql/enterprise-server:8.0
登录到服务器,检查服务器是否正在运行恢复的数据。
已知的问题
当使用服务器系统变量时
audit_log_file
若要配置审计日志文件名,请使用宽松的
选择修改器用它;否则,Docker无法启动服务器。
码头工人的环境变量
当你创建MySQL Server容器时,你可以使用- - - env
选项(简式- e
),并指定一个或多个环境变量。如果挂载的数据目录不是空的,则不执行服务器初始化,在这种情况下,设置这些变量都不起作用(参见持久化数据和配置更改),并且在容器启动过程中不会修改目录的现有内容,包括服务器设置。
下面列出了可以用来配置MySQL实例的环境变量:
布尔变量包括
MYSQL_RANDOM_ROOT_PASSWORD
,MYSQL_ONETIME_PASSWORD
,MYSQL_ALLOW_EMPTY_PASSWORD
,MYSQL_LOG_CONSOLE
通过使用任何长度为非零的字符串设置它们来实现。因此,将它们设置为,例如,”0”,”假”,或”没有”不是让它们假,而是让它们真。这是一个众所周知的问题。MYSQL_RANDOM_ROOT_PASSWORD
:当此变量为true时(这是它的默认状态,除非MYSQL_ROOT_PASSWORD
是集或MYSQL_ALLOW_EMPTY_PASSWORD
设置为true),当Docker容器启动时,会生成服务器根用户的随机密码。密码被打印为stdout
可以通过查看容器的日志(参见启动MySQL服务器实例).MYSQL_ONETIME_PASSWORD
:当变量为true时(这是它的默认状态,除非MYSQL_ROOT_PASSWORD
是集或MYSQL_ALLOW_EMPTY_PASSWORD
设置为true),则root用户的密码被设置为过期,必须修改后才能正常使用MySQL。MYSQL_DATABASE
:该变量允许您指定映像启动时要创建的数据库的名称。如果提供了用户名和密码MYSQL_USER
而且MYSQL_PASSWORD
,创建该用户并授予该用户对该数据库的超级用户访问权限(对应于授予所有
).指定的数据库由如果不存在,创建数据库语句,以便在数据库已经存在的情况下,该变量没有作用。MYSQL_USER
,MYSQL_PASSWORD
:这些变量一起用于创建用户和设置该用户的密码,用户被授予数据库的超级用户权限MYSQL_DATABASE
变量。这两个MYSQL_USER
而且MYSQL_PASSWORD
是创建用户所必需的—如果没有设置这两个变量中的任何一个,则忽略另一个。如果两个变量都设置了butMYSQL_DATABASE
如果不是,则创建的用户没有任何特权。请注意不需要使用这种机制来创建root超级用户,默认情况下,该超级用户的密码是由描述中讨论的任何一种机制设置的
MYSQL_ROOT_PASSWORD
而且MYSQL_RANDOM_ROOT_PASSWORD
,除非MYSQL_ALLOW_EMPTY_PASSWORD
是真的。MYSQL_ROOT_HOST
:默认情况下,MySQL会创建“根”@“localhost”
帐户。这个帐户只能从容器内部连接,如中所述从容器内连接到MySQL服务器.要允许从其他主机进行根连接,请设置此环境变量。例如,值172.17.0.1
,这是默认的Docker网关IP,允许从运行容器的主机进行连接。该选项只接受一个条目,但允许通配符(例如,MYSQL_ROOT_HOST = 172。*。*。*
或MYSQL_ROOT_HOST = %
).MYSQL_LOG_CONSOLE
:当变量为true时(这是MySQL 8.0服务器容器的默认状态),MySQL服务器的错误日志被重定向到stderr
,以便错误日志进入Docker容器的日志中,并且可以使用码头工人日志mysqld-container
命令。请注意如果已经挂载了来自主机的服务器配置文件,则该变量无效(参见持久化数据和配置更改绑定挂载配置文件)。
MYSQL_ROOT_PASSWORD
:该变量指定MySQL root帐户的密码。警告通过命令行设置MySQL root用户密码不安全。作为显式指定密码的替代方法,您可以为密码文件设置容器文件路径的变量,然后从您的主机挂载一个包含密码的文件到容器文件路径。这仍然不是很安全,因为密码文件的位置仍然是暴露的。建议使用默认设置
MYSQL_RANDOM_ROOT_PASSWORD
而且MYSQL_ONETIME_PASSWORD
都是真实的。MYSQL_ALLOW_EMPTY_PASSWORD
.将它设置为true,允许容器以root用户的空白密码启动。警告将这个变量设置为true是不安全的,因为它将使MySQL实例完全不受保护,允许任何人获得完全的超级用户访问权。建议使用默认设置
MYSQL_RANDOM_ROOT_PASSWORD
而且MYSQL_ONETIME_PASSWORD
都是真实的。