MySQL的默认配置文件在/etc/mysql/my.cnf
,也可以包含其他目录,例如/etc/mysql/conf.d/
或者/etc/mysql/mysql.conf.d/
,可以查看mysql镜像本身相关的文件和目录来确定。
如果/my/custom/config-file.cnf
是自定义配置文件的路径和名称,则可以像这样启动mysql容器(请注意,此命令中仅使用自定义配置文件的目录路径):
docker run -d --name some-mysql \
-v /my/custom:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
mysql:tag
这将启动一个新容器some-mysql,其中MySQL实例使用/etc/mysql/my.cnf
和/etc/mysql/conf.d/config-file.cnf
中的组合启动设置,后者的设置优先。
许多配置选项可以作为标志传递给mysqld。这将使您可以灵活地自定义容器,而无需cnf文件。例如,如果要更改所有表的默认编码和排序规则以使用UTF-8(utf8mb4),只需运行以下命令:
docker run -d --name some-mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
mysql:tag
如果您想查看可用选项的完整列表,请运行:
docker run -it --rm mysql:tag --verbose --help
启动mysql镜像时,可以通过在docker run命令行上传递一个或多个环境变量来调整MySQL实例的配置。
请注意,如果使用已包含数据库的数据目录启动容器,则以下任何变量都不会产生任何影响:任何预先存在的数据库在容器启动时始终保持不变。
具体可以查看这个网站:https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html
此变量是必需的,并指定将为MySQL超级用户帐户设置的密码。在上面的例子中,它被设置为my-secret-pw
。
此变量是可选的,允许指定要在镜像启动时创建的数据库的名称。如果提供了用户/密码(见下一个变量),则该用户将被授予对该数据库的超级用户访问权限(对应于GRANT ALL)。
这些变量是可选的,可以结合使用来创建新用户并设置该用户的密码。此用户将被授予MYSQL_DATABASE
变量指定的数据库的超级用户权限(见上一个变量)。这两个变量都是创建用户所必需的。
请注意,不需要使用此机制来创建超级用户(root),默认情况下会使用
MYSQL_ROOT_PASSWORD
变量指定的密码创建该用户。
这个变量是可选的,设置为yes
以允许使用root用户的空密码启动容器。
注意:建议不要将此变量设置为
yes
,除非确实知道自己在做什么,因为这会使MySQL实例完全不受保护,从而允许任何人获得完整的超级用户访问权限。
这是变量是可选的。设置为yes
以为root用户生成随机初始密码(使用pwgen)。生成的root密码将打印到stdout(GENERATED ROOT PASSWORD:.....)。
初始化完成后,将root(不是MYSQL_USER中指定的用户!)用户设置为过期,在首次登录时强制更改密码。
注意:仅在MySQL 5.6+上支持此功能。在MySQL 5.5上使用此选项将在初始化期间抛出适当的错误。
作为通过环境变量传递敏感信息的替代方法,_FILE
可以附加到先前列出的环境变量,从而使初始化脚本从容器中存在的文件加载这些变量的值。特别是,这可以用于从存储在/run/secrets/
$ docker run --name some-mysql \
-e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root \
-d mysql:tag
目前,仅支持:
在Kubernetes平台中,使用Secret对象来实现这个机制。
首次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行扩展名为.sh
,.sql
和.sql.gz
的文件,这些文件位于/docker-entrypoint-initdb.d
中。 文件将按字母顺序执行。
通过挂载一个SQL dump 到该目录并提供相应的数据来轻松完成自定义的mysql服务。
默认情况下,SQL文件将导入到MYSQL_DATABASE变量指定的数据库中。
有多种方法存储Docker容器中运行的应用程序使用的数据。包括:
/my/own/datadir
$ docker run -d --name some-mysql \
-v /my/own/datadir:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
mysql:tag
该命令的-v /my/own/datadir:/var/lib/mysql
部分将/my/own/datadir
目录从底层主机系统挂载到容器内的/var/lib/mysql
,默认情况下MySQL将数据文件写在这里。
如果在容器启动时没有初始化数据库,则将创建默认数据库。 虽然这是预期的行为,但这意味着在初始化完成之前它不会接受传入的连接。 当使用自动化工具(例如docker-compose)同时启动多个容器时,这可能会导致问题。
如果尝试连接到MySQL的应用程序无法处理MySQL停机或等待MySQL正常启动,则可能需要在服务启动之前进行连接重试循环。 有关官方镜像中此类实现的示例,请参阅WordPress或Bonita。
如果使用已包含数据库的数据目录(特别是mysql子目录)启动mysql容器实例,应该从运行命令行中省略MYSQL_ROOT_PASSWORD
变量;这个变量在任何情况下都会被忽略,并且不会以任何方式更改预先存在的数据库。
如果目录的权限已经设置正确(例如针对已有数据库运行,如上一小节所写)需要使用特定的UID/GID
运行mysqld,可以使用--user
设置为任何值(root/0除外)来调用此镜像,以实现所需的访问/配置:
$ mkdir data
$ ls -lnd data
drwxr-xr-x 2 1000 1000 4096 Aug 27 15:54 data
$ docker run -d --name some-mysql \
-v "$PWD/data":/var/lib/mysql \
--user 1000:1000 \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
mysql:tag
大多数常规工具都可以使用,尽管在某些情况下它们的使用可能有点复杂,以确保它们可以访问mysqld服务器。确保这一点的一种简单方法是使用docker exec并从同一容器运行该工具,类似于以下内容:
docker exec some-mysql \
sh -c 'exec mysqldump \
--all-databases -uroot \
-p"$MYSQL_ROOT_PASSWORD"' \
> /some/path/on/your/host/all-databases.sql