1. 创建数据卷,用来持久话数据
// MySQL配置储存卷
docker volume create mysql.conf
// MySQL数据储存卷
docker volume create mysql.data
// MySQL日志储存卷
docker volume create mysql.log
2. 环境变量(引用MySQL官方对Docker容器MySQL环境变量的描述)
布尔变量包括 MYSQL_RANDOM_ROOT_PASSWORD、 MYSQL_ONETIME_PASSWORD、 MYSQL_ALLOW_EMPTY_PASSWORD、MYSQL_LOG_CONSOLE ;通过将它们设置为任何非零长度的字符串来使它们为真。因此,将它们设置为例如“ 0 ”、 “ false ”或“ no ”不会使它们为假,而是实际上使它们为真。这是一个已知的问题。
MYSQL_RANDOM_ROOT_PASSWORD:当这个变量为真时(这是它的默认状态,除非 MYSQL_ROOT_PASSWORD 被设置或 MYSQL_ALLOW_EMPTY_PASSWORD 设置为真),当Docker容器启动时,会为服务器的root用户生成一个随机密码。密码打印到stdout容器中,可以通过查看容器的日志找到(请参阅启动 MySQL 服务器实例)。
MYSQL_ONETIME_PASSWORD:当变量为true时(这是它的默认状态,除非 MYSQL_ROOT_PASSWORD 设置或 MYSQL_ALLOW_EMPTY_PASSWORD 设置为true),root用户的密码设置为过期,必须更改才能正常使用MySQL。
MYSQL_DATABASE:此变量允许您指定要在映像启动时创建的数据库的名称。MYSQL_USER 如果用和 提供了用户名和密码 MYSQL_PASSWORD,则创建用户并授予对此数据库的超级用户访问权(对应于GRANT ALL)。指定的数据库由 CREATE DATABASE IF NOT EXIST语句创建,因此如果数据库已经存在,则该变量无效。
MYSQL_USER, MYSQL_PASSWORD: 这些变量一起用于创建用户并设置该用户的密码,并且该用户被授予对 MYSQL_DATABASE 变量指定的数据库的超级用户权限。MYSQL_USER 和 MYSQL_PASSWORD 都是创建用户所必需的——如果两个变量中的任何一个未设置,则忽略另一个。如果两个变量都已设置但未设置 MYSQL_DATABASE ,则创建的用户没有任何权限。
笔记: 无需使用此机制来创建 root 超级用户,默认情况下创建超级用户时使用的密码由 和 的描述中讨论的任一机制设置 MYSQL_ROOT_PASSWORD , MYSQL_RANDOM_ROOT_PASSWORD 除非 MYSQL_ALLOW_EMPTY_PASSWORD 为真。
MYSQL_ROOT_HOST:默认情况下,MySQL 创建 'root'@'localhost'帐户。此帐户只能从容器内部连接,如从容器内 连接到 MySQL 服务器中所述。要允许来自其他主机的 root 连接,请设置此环境变量。例如172.17.0.1默认值 Docker 网关 IP 允许来自运行容器的主机的连接。该选项只接受一个条目,但允许使用通配符(例如MYSQL_ROOT_HOST=172.*.*.* 或 MYSQL_ROOT_HOST=% )。
MYSQL_LOG_CONSOLE:当变量为 true 时(这是 MySQL 8.0 服务器容器的默认状态),MySQL 服务器的错误日志被重定向到stderr,以便错误日志进入 Docker 容器的日志,并且可以使用docker logs mysqld-container 命令查看。
笔记: 如果已经挂载了来自主机的服务器配置文件,则该变量无效(请参阅 有关绑定挂载配置文件的 持久数据和配置更改)。
MYSQL_ROOT_PASSWORD:此变量指定为 MySQL root 帐户设置的密码。
警告: 在命令行上设置 MySQL root 用户密码是不安全的。作为显式指定密码的替代方法,您可以使用密码文件的容器文件路径设置变量,然后从您的主机挂载一个文件,该文件在容器文件路径中包含密码。这仍然不是很安全,因为密码文件的位置仍然暴露在外。最好使用默认设置, MYSQL_RANDOM_ROOT_PASSWORD 并且 MYSQL_ONETIME_PASSWORD 两者都为真。
MYSQL_ALLOW_EMPTY_PASSWORD. 将其设置为 true 以允许使用 root 用户的空密码启动容器。
警告: 将此变量设置为 true 是不安全的,因为它将使您的 MySQL 实例完全不受保护,从而允许任何人获得完全的超级用户访问权限。最好使用默认设置, MYSQL_RANDOM_ROOT_PASSWORD 并且 MYSQL_ONETIME_PASSWORD 两者都为真。
3. 运行容器
docker run -d \
-p 3306:3306 \
-e MYSQL_ROOT_HOST=% \
-e MYSQL_ROOT_PASSWORD=123456789 \
--mount source=mysql.conf,destination=/etc/mysql \
--mount source=mysql.data,destination=/var/lib/mysql \
--mount source=mysql.log,destination=/var/log/mysql \
--name MySQL \
mysql:8.0