MySQL是世界上最流行的开源数据库。凭借其久经考验的性能,可靠性和易用性,MySQL已成为基于Web的应用程序的首选数据库选择,涵盖从个人项目和网站,电子商务和信息服务,一直到高调的整个范围。网站属性包括Facebook,Twitter,YouTube,Yahoo!还有很多。
有关MySQL Server和其他MySQL产品的更多信息和相关下载,请访问www.mysql.com。
启动MySQL实例很简单:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
some-mysql
是要分配给容器的名称,my-secret-pw
是为MySQL root用户设置的密码,tag
是指定所需MySQL版本的标记。请参阅上面的列表以获取相关标签。
以下命令启动另一个mysql
容器实例并针对原始mysql
容器运行mysql
命令行客户端,允许您对数据库实例执行SQL语句:
$ docker run -it --network some-network --rm mysql mysql -hsome-mysql -uexample-user -p
some-mysql
是原始mysql
容器的名称(连接到some-networkDocker
Docker网络)。
此镜像还可以用作非Docker或远程实例的客户端:
$ docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p
有关MySQL命令行客户端的更多信息可以在MySQL文档中找到
实施例stack.yml为mysql:
# Use root/example as user/password credentials
version: '3.1'
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
adminer:
image: adminer
restart: always
ports:
- 8080:8080
运行docker stack deploy -c stack.yml mysql
(或docker-compose -f stack.yml up
),等待它完全初始化,并参观http://swarm-ip:8080
,http://localhost:8080
或http://host-ip:8080
(如适用)。
该docker exec
命令允许您在Docker容器内运行命令。以下命令行将为您提供mysql
容器内的bash shell :
$ docker exec -it some-mysql bash
该日志可通过Docker的容器日志获得:
$ docker logs some-mysql
可以在/etc/mysql/my.cnf
中找到MySQL的默认配置,这可能是!includedir
其他目录,如/etc/mysql/conf.d
或/etc/mysql/mysql.conf.d
。请检查mysql镜像本身内的相关文件和目录以获取更多详细信息。
如果/my/custom/config-file.cnf
是自定义配置文件的路径和名称,则可以像这样启动mysql
容器(请注意,此命令中仅使用自定义配置文件的目录路径):
$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
这将启动一个新容器some-mysql
,其中MySQL实例使用来自/etc/mysql/my.cnf
和/etc/mysql/conf.d/config-file.cnf
的组合启动设置,后者的设置优先。
许多配置选项可以作为标志传递给mysqld。这将使您可以灵活地自定义容器而无需cnf文件。例如,如果要更改所有表的默认编码和排序规则以使用UTF-8(utf8mb4),只需运行以下命令:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
如果您想查看可用选项的完整列表,请运行:
$ 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本身所遵循的环境变量的文档(尤其是变量,例如MYSQL_HOST,与此图像一起使用时会出现问题)。
MYSQL_ROOT_PASSWORD
此变量是必需的,并指定将为MySQL root超级用户帐户设置的密码。在上面的例子中,它被设置为my-secret-pw
。
MYSQL_DATABASE
此变量是可选的,允许您指定要在映像启动时创建的数据库的名称。如果提供了用户/密码(见下文),则该用户将被授予对该数据库的超级用户访问权限(对应于GRANT ALL)。
MYSQL_USER, MYSQL_PASSWORD
这些变量是可选的,可以结合使用来创建新用户并设置该用户的密码。此用户将被授予MYSQL_DATABASE变量指定的数据库的超级用户权限(参见上文)。这两个变量都是创建用户所必需的。
请注意,不需要使用此机制来创建根超级用户,默认情况下会使用MYSQL_ROOT_PASSWORD
变量指定的密码创建该用户。
MYSQL_ALLOW_EMPTY_PASSWORD
这是一个可选变量。设置为yes允许以root用户的空密码启动容器。注意:建议不要将此变量设置为yes
,除非您确实知道自己在做什么,因为这会使您的MySQL实例完全不受保护,从而允许任何人获得完整的超级用户访问权限。
MYSQL_RANDOM_ROOT_PASSWORD
这是一个可选变量。设置为yes为root用户生成随机初始密码(使用pwgen)。生成的root密码将打印到stdout(GENERATED ROOT PASSWORD: …)。
MYSQL_ONETIME_PASSWORD
初始化完成后,将root(不是MYSQL_USER!中指定的用户)设置为已过期,在首次登录时强制更改密码。注意:仅在MySQL 5.6+上支持此功能。在MySQL 5.5上使用此选项将在初始化期间抛出适当的错误。
作为通过环境变量传递敏感信息的替代方法,_FILE
可以将其附加到先前列出的环境变量,从而使初始化脚本从容器中存在的文件加载这些变量的值。特别是,这可以用于从存储在/run/secrets/
文件中的Docker机密加载密码。例如:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag
目前,这仅支持MYSQL_ROOT_PASSWORD
,MYSQL_ROOT_HOST
,MYSQL_DATABASE
,MYSQL_USER
,和MYSQL_PASSWORD
。
首次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行具有扩展名的文件.sh
,.sql
并且.sql.gz
可以在其中找到/docker-entrypoint-initdb.d
。文件将按字母顺序执行。您可以通过将SQL转储装入该目录并使用提供的数据提供自定义映像来轻松填充mysql服务。默认情况下,SQL文件将导入到MYSQL_DATABASE变量指定的数据库中。
重要说明:有几种方法可以存储在Docker容器中运行的应用程序使用的数据。我们鼓励mysql
镜像用户熟悉可用选项,包括:
Docker文档是了解不同存储选项和变体的一个很好的起点,并且有多个博客和论坛帖子在这个领域进行讨论和提供建议。我们将简单地显示上面后一个选项的基本过程:
在主机系统上的适当卷上创建数据目录,例如/my/own/datadir。
mysql像这样启动你的容器:
$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d 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则应从运行命令行中省略该变量; 在任何情况下都会被忽略,并且不会以任何方式更改预先存在的数据库。
如果您知道目录的权限已经正确设置(例如针对现有数据库运行,如上所述),或者您需要mysqld使用特定的UID / GID 运行,则可以通过--user
设置为任何值来调用此图像(除了root/ 0)以实现所需的访问/配置:
$ mkdir data
$ ls -lnd data
drwxr-xr-x 2 1000 1000 4096 Aug 27 15:54 data
$ docker run -v "$PWD/data":/var/lib/mysql --user 1000:1000 --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d 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
用于恢复数据。您可以使用docker exec
带有-i
flag的命令,类似于以下内容:
$ docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql
查看此映像中包含的软件的许可证信息。
与所有Docker映像一样,这些映像可能还包含其他许可证(例如来自基本分发版的Bash等,以及所包含的主要软件的任何直接或间接依赖关系)。
这是能够自动检测一些额外的许可信息可能中找到的repo-info版本库的mysql/目录。
对于任何预先构建的图像使用,图像用户有责任确保对此图像的任何使用都符合其中包含的所有软件的任何相关许可。