快速参考
-
由……维护
Docker 社区和 MySQL 团队 -
何处获取帮助:
Docker 社区 Slack、服务器故障、Unix & Linux 或 Stack Overflow
支持的标签及相应的 Dockerfile 链接
快速参考(续)
-
已发布的图像工件详细信息:
仓库信息 仓库的repos/mysql/目录(历史)
(图像元数据、传输大小等) -
图像更新:
官方镜像仓库的library/mysql标签
官方镜像仓库的library/mysql文件(历史记录) -
此描述的来源:
文档库的mysql/目录(历史)
什么是 MySQL?
MySQL 是世界上最受欢迎的开源数据库。凭借其经过验证的性能、可靠性和易用性,MySQL 已成为基于 Web 应用程序的首选数据库,涵盖从个人项目和网站,通过电子商务和信息服务,一直到包括 Facebook、Twitter、YouTube、雅虎等在内的知名网络资产的整个范围。
有关 MySQL 服务器及其他 MySQL 产品的更多信息和相关下载,请访问 www.mysql.com。

如何使用此图像
启动一个 mysql 服务器实例
启动一个 MySQL 实例很简单:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
……其中 some-mysql 是你想要分配给容器的名称, my-secret-pw 是要为 MySQL 根用户设置的密码, tag 是指定你想要的 MySQL 版本的标签。有关标签请参见上面的列表。
从 MySQL 命令行客户端连接到 MySQL
以下命令启动另一个 mysql 容器实例,并针对原始的 mysql 容器运行 mysql 命令行客户端,允许您针对数据库实例执行 SQL 语句:
$ docker run -it --network some-network --rm mysql mysql -hsome-mysql -uexample-user -p
……其中 some-mysql 是你原始的 mysql 容器(连接到 some-network Docker 网络)的名称。
此图像也可用作非 Docker 或远程实例的客户端:
$ docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p
关于 MySQL 命令行客户端的更多信息可在 MySQL 文档中找到
通过 docker-compose 或 docker stack deploy
示例 docker-compose.yml 用于 mysql :
# Use root/example as user/password credentials
version: '3.1'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
# (this is just an example, not intended to be a production configuration)
运行 docker stack deploy -c stack.yml mysql (或 docker-compose -f stack.yml up ),等待其完全初始化,然后访问 http://swarm-ip:8080 、 http://localhost:8080 或 http://host-ip:8080 (视情况而定)。
容器外壳访问和查看 MySQL 日志
docker exec 命令允许你在 Docker 容器内运行命令。以下命令行将在你的 mysql 容器内给你一个 bash 外壳:
$ docker exec -it some-mysql bash
该日志可通过 Docker 的容器日志获取:
$ docker logs some-mysql
使用自定义的 MySQL 配置文件
MySQL 的默认配置可在 /etc/mysql/my.cnf 中找到,它可能 !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 的组合启动设置,以后者的设置优先。
没有 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/zh/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 ,以生成根用户的随机初始密码(使用 pwgen )。生成的根密码将被打印到标准输出( GENERATED ROOT PASSWORD: ..... )。
MYSQL_ONETIME_PASSWORD
设置根用户(不是在 MYSQL_USER ! 中指定的用户)在初始化完成后过期,强制在首次登录时更改密码。任何非空值都将激活此设置。注意:此功能仅在 MySQL 5.6 及以上版本支持。在 MySQL 5.5 上使用此选项将在初始化期间抛出相应的错误。
MYSQL_INITDB_SKIP_TZINFO
默认情况下,入口点脚本会自动加载 CONVERT_TZ() 函数所需的时区数据。如果不需要,任何非空值都会禁用时区加载。
Docker 机密
作为通过环境变量传递敏感信息的替代方法,可将 _FILE 添加到前面列出的环境变量中,这会导致初始化脚本从容器中存在的文件加载这些变量的值。特别是,这可用于从存储在 /run/secrets/<secret_name> 文件中的 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 。
初始化一个新实例
当容器首次启动时,将使用指定名称创建一个新数据库,并使用提供的配置变量进行初始化。此外,它将执行在 /docker-entrypoint-initdb.d 中找到的扩展名为 .sh 、 .sql 和 .sql.gz 的文件。文件将按字母顺序执行。您可以通过将 SQL 转储挂载到该目录并提供带有贡献数据的自定义映像来轻松填充您的 mysql 服务。默认情况下,SQL 文件将导入到由 MYSQL_DATABASE 变量指定的数据库中。
注意事项
数据存储在哪里
重要说明:有几种方法可以存储在 Docker 容器中运行的应用程序所使用的数据。我们鼓励 mysql 镜像的用户熟悉可用的选项,包括:
- 让 Docker 通过使用其自身内部的卷管理将数据库文件写入主机系统的磁盘来管理数据库数据的存储。这是默认设置,对用户来说简单且相当透明。缺点是对于直接在主机系统上运行(即在容器外部)的工具和应用程序而言,这些文件可能很难定位。
- 在主机系统(容器外部)上创建一个数据目录,并将其挂载到容器内部可见的目录。这会将数据库文件放置在主机系统上的已知位置,并且使主机系统上的工具和应用程序易于访问这些文件。缺点是用户需要确保该目录存在,并且例如主机系统上的目录权限和其他安全机制已正确设置。
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 将在其中写入其数据文件。
在 MySQL 初始化完成之前没有连接
如果容器启动时没有初始化数据库,那么将创建一个默认数据库。虽然这是预期行为,但这意味着在初始化完成之前它将不接受传入连接。这可能会在使用自动化工具(例如 docker-compose )时导致问题,这些工具会同时启动多个容器。
如果您尝试连接到 MySQL 的应用程序不处理 MySQL 停机时间或优雅地等待 MySQL 启动,那么在服务启动之前放置一个连接重试循环可能是必要的。有关官方镜像中此类实现的示例,请参阅 WordPress 或 Bonita。
针对现有数据库的使用
如果您使用已包含数据库(特别是 mysql 子目录)的数据目录启动 mysql 容器实例,则应从运行命令行中省略 $MYSQL_ROOT_PASSWORD 变量;无论如何它都将被忽略,并且预先存在的数据库不会以任何方式更改。
以任意用户身份运行
如果您知道您的目录权限已正确设置(例如针对上述现有数据库运行),或者您需要使用特定的 UID/GID 运行 mysqld ,则可以使用设置为任何值(除了 root / 0 )的 --user 调用此镜像,以实现所需的访问/配置:
$ 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
从转储文件中恢复数据
对于恢复数据。你可以使用带有 -i 标志的 docker exec 命令,类似于以下内容:
$ 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/ 目录中找到。
对于任何预构建镜像的使用,镜像用户有责任确保对此镜像的任何使用都符合其中包含的所有软件的任何相关许可证。
