MySQL docker官方镜像介绍

最近在学习docker,在使用mysql镜像时看到dockerhub上的mysql镜像介绍很详细,解决了我大部分疑惑,为了加深印象,决定翻译一下,初次尝试翻译英文文档,有误之处还请多多指教。
原文:mysql官方镜像介绍

简介

mysql是一个应用广泛的,开源的,关系型数据库管理系统(RDBMS)

详细介绍

支持的标签和docker file链接以及快速帮助链接请看原文

什么是mysql

mysql是世界上最流行的开源数据库。凭借它已被证明的高性能,可靠性和易用性,mysql已经成为互联网应用的首选数据库。它的应用范围覆盖从个人项目和网站,如电商项目和信息服务,到大型网站包括Facebook,Twitter,YouTube,Yahoo!和很多其他网站。
要了解更多信息或下载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的root用户的密码,tag是你想用的特定的mysql的版本号,相关的版本号请看上面的列表。

从其他docker容器的应用中连接mysql

本镜像暴露了mysql的标准端口(3306),所以容器连接机制使得其他应用程序容器可以访问本mysql实例。通过以下方式启动你的应用程序容器来连接到mysql容器:
$ docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql

从mysql命令行客户端连接mysql

下面的命令启动了另一个mysql容器实例并运行“mysql”命令连接到你之前的那个mysql容器,让你能向之前的mysql实例发送sql语句并执行:
$ docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
some-mysql是你之前那个mysql容器的名字。
这个镜像也可以作为非docker或远程mysql实例的客户端:
$ docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p
更多关于mysql命令行客户端的信息可以从mysql官方文档中找到。

通过docker stack deploy 或 docker-compose使用mysql

使用mysql的stack.yml示例:
用 root/example 作为 用户名/密码
version: ‘3.1’

services:

db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: example

adminer:
image: adminer
restart: always
ports:
- 8080:8080

执行:docker stack deploy –c stack.tml mysql (或docker-compose –f stack.yml up ),等待集群初始化完成,然后访问http://swarm-ip:8080, http://localhost:8080, 或 http://host-ip:8080 (替换合适的host-ip).

命令行接入容器和查看mysql日志

docker exec命令让你可以在docker容器内执行命令。下面的命令会给你提供一个mysql容器内部的bash命令行接口:
$ docker exec -it some-mysql bash
mysql服务器的日志可以通过docker的容器日志查看:
$ docker logs some-mysql

使用自定义的mysql配置文件

mysql的启动配置在文件/etc/mysql/my.cnf中声明,这个文件又引入了/etc/mysql/conf.d文件夹下的所有以.cnf结尾的文件。这个文件夹下的配置文件中的配置会补充或覆盖/etc/mysql/my.cnf中的配置。如果你想使用自定义的mysql配置,你可以在宿主机中创建一个文件夹,并在里面创建配置文件,然后把这个文件夹挂载到mysql容器的/etc/mysql/conf.d目录。

假设你自定义的配置文件是/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
这个命令会启动一个新的mysql容器,叫做“some-mysql”,这个容器会组合使用/etc/mysql/my.cnf 和 /etc/mysql/conf.d/config-file.cnf中的配置
,并且后一个文件的配置优先生效(译者注:后者覆盖前者)。
注意:宿主机上启用SELinux的用户进行本操作时可能出现问题,目前的解决方案是修改你自定义的配置文件的SELinux策略,使容器能够挂载它:
$ chcon -Rt svirt_sandbox_file_t /my/custom

不使用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实例的配置。注意,如果你使用已经存在的数据库文件夹来启动容器,下面的环境变量都不会生效,所有已存在的数据库会一直原封不动的存在。
关于Mysql自己的环境变量文档可以通过 https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html来查看(尤其是像MYSQL_HOST这样的已被证实在本镜像中使用时会出问题的环境变量)
MYSQL_ROOT_PASSWORD
这个变量是必须的,它会指定mysql的超级用户root的登陆密码,在上面的例子中,密码被设置为my-secret-pw。
MYSQL_DATABASE
这个变量是可选的,它允许你指定一个在容器启动时就创建的数据库的名字。如果user/password这两个变量也指定了,那么这个用户在这个数据库上将被赋予超级用户的权限。(像grant all一样)
MYSQL_USER, MYSQL_PASSWORD
这两个变量是可选的,两者一起使用来创建一个新用户并指定密码。这个用户将被赋予超级用户的权限在用MYSQL_DATABASE变量指定的数据库上。当要创建用户时这两个变量都是必须的。
注意:没必要用这种方式创建root用户,root用户是默认创建的,密码是MYSQL_ROOT_PASSWORD变量指定的值。
MYSQL_ALLOW_EMPTY_PASSWORD
这个变量是可选的,设置成yes来允许用空密码登陆mysql。注意:我们不推荐把这个变量设置成yes,除非你真的清楚你在做什么,因为这样做会让你的mysql实例处于完全无保护的状态下,允许任何人获得完全的超级用户权限。
MYSQL_RANDOM_ROOT_PASSWORD
这是个可选变量。设置成yes来给root用户生成一个随机的初始密码(使用pwgen)。生成的root密码会打印到标准输出中(GENERATED ROOT PASSWORD: …..)。
MYSQL_ONETIME_PASSWORD
设置root用户(不是MYSQL_USER中指定的用户!)在初始化完成后立即过期,强制在第一次登陆时修改密码。注意:这个特性只在mysql5.6+的版本上支持,在mysql5.5版本上使用这个选项会在初始化时抛出一个合适的异常。

Docker安全

作为通过环境变量传递敏感数据的代替方案,可以在上面列出的环境变量名后加上_FILE,因为给变量赋值的脚本来自容器内的文件。特别的,这个方法可以被用来从docker安全存储/run/secrets/中加载密码,比如:
$ 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, and MYSQL_PASSWORD

初始化一个全新的实例

当容器第一次启动时,将会根据提供的配置变量创建并初始化一个新的,指定名字的数据库。另外,还会执行/docker-entrypoint-initdb.d文件夹下的以.sh, .sql 和 .sql.gz结尾的文件。文件以字典序依次执行。你可以通过把一个sql备份挂载到这个文件夹来很方便地复原你的mysql服务并用你自己的数据制作新的镜像。Sql文件会自动导入到通过MYSQL_DATABASE指定的数据库中。

数据存放到哪里

重要提示:有很多种存放docker容器中的应用使用的数据的方式,我们推荐mysql镜像的用户结合自己的实际情况在以下可选方式中作出选择,包括:

  • 让docker管理你的数据库数据,通过使用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默认存放数据文件的地方。
注意:宿主机上启动SELinux的用户可能会出现问题。目前到解决方案是修改数据目录的SELinux策略,使容器能够挂载它:
$ chcon -Rt svirt_sandbox_file_t /my/own/datadir

mysql初始化完成前不要连接

如果容器启动后没有数据库初始化,将会创建一个默认的数据库。由于这是个意料之中的行为,这意味着这个初始化完成之前它都不会接受连接。这可能导致使用自动化工具时出现问题。比如使用docker-compose,同时启动多个容器。
如果你的尝试连接mysql的应用没有处理mysql宕机或等待mysql平滑启动的过程,那么在服务启动前加一个连接重试的循环可能很有必要。在官方镜像中这么做的例子可以参考 WordPress 或 Bonita.

结合已存在的数据库文件

如果你用已经包含数据库的文件夹(特别的,包含一个mysql子文件夹)来启动mysql容器,那么MYSQL_ROOT_PASSWORD环境变量就不应该包含在启动命令中,它绝对会被忽略掉,而且已存在的数据库绝不会改变。

生成数据库副本

大多数的传统场景下的工具都可以工作,虽然在某些场景下为了让他们能连上mysqld服务需要很复杂的使用方式。确保他们能连上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

许可证(License)请参考原文

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值