优化的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/sbin/mysqld
所有二进制文件都被剥离;它们不包含调试信息。
配置MySQL服务器
当你启动MySQL Docker容器时,你可以通过码头工人运行命令;例如,对于MySQL服务器:
Docker运行——name mysql1 -d mysql/mysql-server——character-set-server=utf8mb4——coll- server=utf8mb4_col
该命令启动您的MySQL服务器utf8mb4
作为默认字符集和utf8mb4_col
作为数据库的默认排序规则。
另一种配置MySQL服务器的方法是准备一个配置文件并将其挂载到容器中服务器配置文件的位置。看到持久化数据和配置更改获取详细信息。
持久化数据和配置更改
Docker容器在原则上是短暂的,如果容器被删除或损坏,任何数据或配置都将丢失(请参阅讨论)在这里).码头工人卷,提供了一种机制来持久化Docker容器中创建的数据。在初始化时,MySQL服务器容器为服务器数据目录创建一个Docker卷。的JSON输出码头工人检查容器上的命令具有山
Key,其值表示数据目录卷的信息。
Shell > docker inspect mysql1…“坐骑”:[{“类型”:“卷”、“名称”:“4 f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652”、“源”:“/ var / lib /码头工人/卷/ 4 f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652 / _data”,“目标”:“/ var / lib / mysql”,“司机”:“本地”、“模式”:“”,“RW”:真的,”传播 ": "" } ], ...
输出显示了源文件夹/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652 / _data
,其中的数据持久化在主机上/var/lib/mysql
,容器中的服务器数据目录。
另一种保存数据的方法是绑定装载使用——山
选项。同样的技术也可以用于持久化服务器的配置。下面的命令创建一个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/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 /
在容器中。例如,对于MySQL服务器容器:
Docker run——name=mysql1 \——mount type=bind,src=/ / path-on-host-machine /脚本dst = / docker-entrypoint-initdb。mysql/mysql-server:标签
从另一个Docker容器中的应用程序连接到MySQL
通过建立一个Docker网络,你可以允许多个Docker容器相互通信,这样另一个Docker容器中的客户端应用程序就可以访问服务器容器中的MySQL服务器。首先,创建一个Docker网络:
码头工人网络创建my-custom-net
然后,在创建和启动服务器和客户端容器时,使用——网络
选择把他们放在你创建的网络上。例如:
Docker run——name=mysql1——network=my-custom-net- d mysql / mysql服务器
Docker run——name=myapp1——network=my-custom-net- d myapp
的myapp1
容器就可以连接到mysql1
容器的mysql1
因为Docker会自动为给定的容器名设置一个DNS。在下面的示例中,我们运行mysq
l内部的客户端myapp1
容器连接到主机mysql1
在它自己的容器中:
Docker exec -it myapp1 mysql——host=mysql1——user=myuser——password
有关容器的其他联网技术,请参阅码头工人容器网络章节。10bet官方网站
服务器错误日志
当MySQL服务器第一次用您的服务器容器启动时,a服务器错误日志如果下列条件之一为真,则不会生成:
主机上的服务器配置文件已经挂载,但该文件不包含系统变量
log_error
(见持久化数据和配置更改绑定-挂载服务器配置文件)。主机上的服务器配置文件没有被挂载,但是Docker环境变量
MYSQL_LOG_CONSOLE
是真正的
(MySQL 5.6服务器容器的默认状态是假
).MySQL服务器的错误日志被重定向到stderr
,以便将错误日志保存到Docker容器的日志中,并且可以使用码头工人日志mysqld-container
命令。
要使MySQL服务器在两个条件中任意一个为真时生成错误日志,请使用——日志错误
选项配置服务器在容器内的特定位置生成错误日志。要持久化错误日志,请在容器内错误日志的位置挂载一个主机文件,参见持久化数据和配置更改.但是,必须确保容器中的MySQL服务器对挂载的主机文件具有写访问权。
已知的问题
当使用服务器系统变量时
audit_log_file
配置审计日志文件名时,请使用宽松的
选择修改器否则Docker将无法启动服务器。
码头工人的环境变量
当您创建MySQL Server容器时,您可以使用- - - 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容器启动时生成服务器根用户的随机密码。密码打印为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
是创建用户所必需的—如果没有设置这两个变量中的任何一个,则忽略另一个。如果两个变量都被设置MYSQL_DATABASE
,则创建用户时没有任何权限。请注意不需要使用这种机制来创建根超级用户,默认情况下,根超级用户的密码是由描述中讨论的其中一种机制设置的
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 5.6服务器容器的默认状态是假
), MySQL服务器的错误日志被重定向到stderr
,以便将错误日志保存到Docker容器的日志中,并且可以使用码头工人日志mysqld-container
命令。请注意如果主机上的服务器配置文件已挂载,则该变量不起作用(参见持久化数据和配置更改绑定-挂载配置文件)。
MYSQL_ROOT_PASSWORD
:该变量指定MySQL root帐户的密码。警告在命令行中设置MySQL root用户密码是不安全的。作为显式指定密码的另一种方法,您可以使用一个密码文件的容器文件路径设置变量,然后从您的主机挂载一个包含密码的文件到容器文件路径。这仍然不是很安全,因为密码文件的位置仍然是公开的。最好使用的默认设置
MYSQL_RANDOM_ROOT_PASSWORD = true
和MYSQL_ONETIME_PASSWORD = true
是真实的。MYSQL_ALLOW_EMPTY_PASSWORD
.将其设置为true以允许以root用户的空白密码启动容器。警告将这个变量设置为true是不安全的,因为它将使您的MySQL实例完全不受保护,允许任何人获得完全的超级用户访问权限。最好使用的默认设置
MYSQL_RANDOM_ROOT_PASSWORD = true
和MYSQL_ONETIME_PASSWORD = true
是真实的。