下面的大多数示例命令都具有mysql / mysql服务器
作为Docker映像存储库,当必须指定时(就像使用码头工人拉而且码头工人运行命令);如果映像来自另一个存储库,则更改此设置—例如,将其替换为container-registry.oracle.com/mysql/enterprise-server
用于从Oracle容器注册表(OCR)下载的MySQL企业版映像,或者mysql /企业服务器
用于下载MySQL企业版映像我的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容器时,可以将配置选项通过码头工人运行命令。例如:
运行——name mysql1 -d mysql/mysql-server标签——character-set-server = utf8mb4 collation-server = utf8mb4_col
该命令启动您的MySQL服务器utf8mb4
作为默认字符集和utf8mb4_col
作为数据库的默认排序规则。
另一种配置MySQL服务器的方法是准备一个配置文件,并将其挂载到容器中服务器配置文件的位置。看到持久化数据和配置更改获取详细信息。
持久化数据和配置更改
Docker容器原则上是短暂的,如果容器被删除或损坏,任何数据或配置都将丢失(见讨论)在这里).码头工人卷,但是,提供了一种机制来持久化Docker容器中创建的数据。在初始化时,MySQL Server容器为服务器数据目录创建了一个Docker卷。的JSON输出码头工人检查容器上的命令有山
Key,它的值提供数据目录卷的信息:
Shell > docker检查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服务器容器,并绑定挂载数据目录和服务器配置文件:
运行——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。mysql/mysql-server:标签
从另一个Docker容器中的应用程序连接到MySQL
通过建立Docker网络,你可以允许多个Docker容器相互通信,这样另一个Docker容器中的客户端应用程序就可以访问服务器容器中的MySQL服务器。首先,创建一个Docker网络:
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。在下面的示例中,我们运行mysq
l客户机从myapp1
容器连接到主机mysql1
在它自己的容器中:
Docker exec - myapp1 mysql——host=mysql1——user=myuser——password
有关容器的其他网络技术,请参见Docker容器组网章节。10bet官方网站
服务器错误日志
当MySQL服务器第一次与服务器容器一起启动时,一个服务器错误日志如果下列条件之一为真,则不生成:
已挂载主机上的服务器配置文件,但该文件不包含系统变量
log_error
(见持久化数据和配置更改在绑定挂载服务器配置文件时)。主机上的服务器配置文件没有挂载,而是挂载了Docker环境变量
MYSQL_LOG_CONSOLE
是真正的
(这是MySQL 8.0服务器容器的变量默认状态)。MySQL服务器的错误日志被重定向到stderr
,这样错误日志就会进入Docker容器的日志中,并且可以使用码头工人日志mysqld-container
命令。
要使MySQL服务器在两个条件中的任何一个为真时生成错误日志,请使用——日志错误
选项配置服务器在容器内的特定位置生成错误日志。若要持久保存错误日志,请在容器内错误日志所在的位置挂载主机文件,如中所述持久化数据和配置更改.但是,您必须确保容器中的MySQL服务器对挂载的主机文件具有写访问权。
使用MySQL企业备份与Docker
MySQL企业备份是一个商业许可的备份实用程序MySQL服务器,可用MySQL企业版.MySQL企业备份包含在MySQL企业版的Docker安装中。
在下面的例子中,我们假设你已经在Docker容器中运行了一个MySQL服务器章节2.5.6.1“使用Docker部署MySQL服务器的基本步骤”如何使用Docker启动MySQL服务器实例)。对于MySQL Enterprise Backup备份MySQL服务器,它必须能够访问服务器的数据目录。这可以通过,例如,在MySQL服务器的data目录上绑定挂载一个主机目录当你启动服务器时:
Docker运行——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服务器实例。
使用MySQL Enterprise backup with Docker备份一个运行在Docker容器中的MySQL服务器实例:
在运行MySQL Server容器的同一主机上,使用MySQL Enterprise Edition的映像启动另一个容器,使用MySQL Enterprise Backup命令执行备份
backup-to-image
.使用我们在最后一步中创建的绑定挂载提供对服务器数据目录的访问。另外,挂载一个主机目录(/ / path-on-host-machine /备份
在本例中)转移到容器(/数据/备份
在本例中)持久化我们正在创建的备份。下面是这个步骤的示例命令,其中MySQL企业备份从下载的Docker映像启动我的Oracle支持):Shell > docker运行\——mount type=bind,src=/ path-on-host-machine / datadir //var/lib/mysql \——mount type=bind,src=/ / path-on-host-machine /备份/data/backups \——rm mysql/enterprise-server:8.0 \ mysqlbackup -umysqlbackup- p密码——backup-dir=/tmp/backup-tmp——with-timestamp \——backup-image=/data/backups/db.使用实例MySQL Enterprise Backup version 8.0.11 Linux-4.1.12-61.1.16.el7uek. mbi Backup - up- Image [Entrypoint] MySQL Docker Image 8.0.11-1.1.5版权所有(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
选项用于启动它,它退出后将被删除。已经创建了映像备份,可以在上一步挂载的主机目录中找到用于存储备份的映像备份:Shell > ls /tmp/backups db.mbi
使用MySQL Enterprise Backup with Docker恢复Docker容器中的MySQL Server实例:
停止MySQL Server容器,这也会停止MySQL Server在里面的运行:
停止mysqlserver
在主机上删除MySQL Server数据目录的绑定挂载中的所有内容:
rm射频/ path-on-host-machine datadir/*
使用MySQL Enterprise Edition映像启动容器,使用MySQL Enterprise Backup命令执行恢复
copy-back-and-apply-log
.绑定挂载服务器的数据目录和备份的存储文件夹,就像我们备份服务器时所做的那样:Shell > docker运行\——mount type=bind,src=/ path-on-host-machine / datadir //var/lib/mysql \——mount type=bind,src=/ / path-on-host-machine /备份. /data/backups \——rm mysql/enterprise-server:8.0 \ mysqlbackup——backup-dir=/tmp/backup-tmp——with-timestamp \——datadir=/var/lib/mysql——backup-image=/data/backups/db。Linux-4.1.12-61.1.16.el7uek. mbi copy-back-and- application -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. log版权所有(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 29680612。180921 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将无法启动服务器。
Docker环境变量
创建MySQL服务器容器时,可以使用- - - env
选项(- e
简而言之),并指定以下一个或多个环境变量。
如果您挂载的数据目录不是空的,那么下面的变量都不会起作用,因为此时不会尝试服务器初始化(请参阅持久化数据和配置更改有关详情)。在容器启动期间,不会修改文件夹中任何预先存在的内容,包括任何旧的服务器设置。
布尔变量包括
MYSQL_RANDOM_ROOT_PASSWORD
,MYSQL_ONETIME_PASSWORD
,MYSQL_ALLOW_EMPTY_PASSWORD
,MYSQL_LOG_CONSOLE
通过将它们设置为任何非零长度的字符串来实现。因此,将它们设置为,例如,”0”,”假”,或”没有”不会让它们变成假的,反而会让它们变成真的。这是MySQL服务器容器的一个已知问题。
MYSQL_RANDOM_ROOT_PASSWORD
:当这个变量为true时(这是它的默认状态,除非MYSQL_ROOT_PASSWORD
设置或MYSQL_ALLOW_EMPTY_PASSWORD
设置为true), Docker容器启动时会为服务器的root用户生成一个随机密码。密码被打印到stdout
可以通过查看容器的日志(参见启动MySQL服务器实例).MYSQL_ONETIME_PASSWORD
:当变量为true时(这是它的默认状态,除非MYSQL_ROOT_PASSWORD
设置或MYSQL_ALLOW_EMPTY_PASSWORD
当root用户的密码被设置为过期时,必须修改密码才能正常使用MySQL。MYSQL_DATABASE
:该变量允许您指定镜像启动时要创建的数据库的名称。如果提供了用户名和密码MYSQL_USER
而且MYSQL_PASSWORD
,则创建用户并授予该用户对该数据库的超级用户访问权(对应于授予所有
).创建指定的数据库如果不存在,请创建数据库语句,这样如果数据库已经存在,该变量将不起作用。MYSQL_USER
,MYSQL_PASSWORD
类所指定的数据库将同时使用这些变量来创建用户和设置该用户的密码,并向该用户授予超级用户权限MYSQL_DATABASE
变量。这两个MYSQL_USER
而且MYSQL_PASSWORD
是创建用户所必需的—如果没有设置两个变量中的任何一个,则忽略另一个。如果两个变量都设置了,但是MYSQL_DATABASE
不是,则创建该用户时没有任何权限。请注意不需要使用这种机制来创建root超级用户,默认情况下,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以允许容器以根用户的空密码启动。警告将这个变量设置为true是不安全的,因为它将使您的MySQL实例完全不受保护,允许任何人获得完全的超级用户访问权限。的默认设置是可取的
MYSQL_RANDOM_ROOT_PASSWORD
而且MYSQL_ONETIME_PASSWORD
两者都对。