Docker官方镜像-mysql

Docker官方镜像-mysql

  • 什么是MySQL?
  • 如何使用这个镜像
    • 启动mysql服务器实例
    • 从MySQL命令行客户端连接到MySQL
    • 通过docker stack deploy或docker-compose
    • 容器shell访问和查看MySQL日志
    • 使用自定义MySQL配置文件
      • 没有cnf文件的配置
    • 环境变量
    • Docker的秘密
  • 初始化一个新实例
  • 注意事项
    • 存储数据的位置
    • 在MySQL init完成之前没有连接
    • 针对现有数据库的用法
    • 作为任意用户运行
    • 创建数据库转储
    • 从转储文件恢复数据
  • License

MySQL是一种广泛使用的开源关系数据库管理系统(RDBMS)

什么是MySQL?

MySQL是世界上最流行的开源数据库。凭借其久经考验的性能,可靠性和易用性,MySQL已成为基于Web的应用程序的首选数据库选择,涵盖从个人项目和网站,电子商务和信息服务,一直到高调的整个范围。网站属性包括Facebook,Twitter,YouTube,Yahoo!还有很多。

有关MySQL Server和其他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 root用户设置的密码,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-networkDockerDocker网络)。

此镜像还可以用作非Docker或远程实例的客户端:

$ docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p

有关MySQL命令行客户端的更多信息可以在MySQL文档中找到

通过docker stack deploy或docker-compose

实施例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:8080http://localhost:8080http://host-ip:8080(如适用)。

容器shell访问和查看MySQL日志

docker exec命令允许您在Docker容器内运行命令。以下命令行将为您提供mysql容器内的bash shell :

$ docker exec -it some-mysql bash

该日志可通过Docker的容器日志获得:

$ docker logs some-mysql

使用自定义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的组合启动设置,后者的设置优先。

没有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上使用此选项将在初始化期间抛出适当的错误。

Docker的秘密

作为通过环境变量传递敏感信息的替代方法,_FILE可以将其附加到先前列出的环境变量,从而使初始化脚本从容器中存在的文件加载这些变量的值。特别是,这可以用于从存储在/run/secrets/文件中的Docker机密加载密码。例如:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag

目前,这仅支持MYSQL_ROOT_PASSWORDMYSQL_ROOT_HOSTMYSQL_DATABASEMYSQL_USER,和MYSQL_PASSWORD

初始化一个新实例

首次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行具有扩展名的文件.sh.sql并且.sql.gz可以在其中找到/docker-entrypoint-initdb.d。文件将按字母顺序执行。您可以通过将SQL转储装入该目录并使用提供的数据提供自定义映像来轻松填充mysql服务。默认情况下,SQL文件将导入到MYSQL_DATABASE变量指定的数据库中。

注意事项

存储数据的位置

重要说明:有几种方法可以存储在Docker容器中运行的应用程序使用的数据。我们鼓励mysql镜像用户熟悉可用选项,包括:

  • 让Docker 通过使用自己的内部卷管理将数据库文件写入主机系统上的磁盘来管理数据库数据的存储。这是默认设置,对用户来说简单且相当透明。缺点是文件可能很难找到直接在主机系统上运行的工具和应用程序,即外部容器。
  • 在主机系统(容器外部)上创建一个数据目录,并将其挂载到容器内可见的目录中。这将数据库文件放置在主机系统上的已知位置,并使主机系统上的工具和应用程序可以轻松访问这些文件。缺点是用户需要确保目录存在,并且例如正确设置了主机系统上的目录权限和其他安全机制。

Docker文档是了解不同存储选项和变体的一个很好的起点,并且有多个博客和论坛帖子在这个领域进行讨论和提供建议。我们将简单地显示上面后一个选项的基本过程:

  1. 在主机系统上的适当卷上创建数据目录,例如/my/own/datadir。

  2. 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 init完成之前没有连接

如果在容器启动时没有初始化数据库,则将创建默认数据库。虽然这是预期的行为,但这意味着在初始化完成之前它不会接受传入的连接。使用自动化工具时可能会出现问题,例如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带有-iflag的命令,类似于以下内容:

$ docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql

License

查看此映像中包含的软件的许可证信息。

与所有Docker映像一样,这些映像可能还包含其他许可证(例如来自基本分发版的Bash等,以及所包含的主要软件的任何直接或间接依赖关系)。

这是能够自动检测一些额外的许可信息可能中找到的repo-info版本库的mysql/目录。

对于任何预先构建的图像使用,图像用户有责任确保对此图像的任何使用都符合其中包含的所有软件的任何相关许可。

你可能感兴趣的:(Docker)