用Docker运行Percona Server

tianlong 2016-10-26

Percona官方提供了一个Percona Docker镜像,可以运行Percona Server MySQL和Percona Server for MongoDB。
Docker官方也提供了Percona镜像,具体见: Percona,但是这个镜像不是Percona官方提供的。
而在Percona官方提供的镜像中,针对每种存储引擎的镜像都有,具体见:
https://hub.docker.com/r/percona/
但是,目前Percona官方提供的镜像刚刚开始,还处于实验性阶段。

1、运行Percona Server/MySQL镜像

docker run --name container-name -e MYSQL_ROOT_PASSWORD=secret -d percona/percona-server:tag

container-name是你为容器赋予的名字
secret是Percona服务器root账户的密码
tag是你想指定的Percona版本,目前有4个选择:latest、5.6、5.6.28、5.6.27。

要从另一个Docker容器的应用程序连接到Percona Server容器:
(假定Percona使用默认的3306端口)

docker run --name app-container-name --link container-name -d app-that-uses-mysql

从MySQL命令行客户端连接到Percona Server容器:
(下面的命令会从另一个Docker容器中运行MySQL命令行客户端,再连接到Percona Server容器)

docker run -it --link container-name --rm percona/percona-server:tag mysql -h container-name -P 3306 -uroot -psecret'

2、运行Percona Server/MongoDB镜像

要改变镜像的存储引擎很简单,比如换成RocksDB引擎,可以这样:

docker run --name psmdbrocks -d percona/percona-server-mongodb:latest --storageEngine=RocksDB

或者是换成PerconaFT存储引擎:

docker run --name psmdbperconaft -d percona/percona-server-mongodb:latest --storageEngine=PerconaFT

3、环境变量

在启动Percona Server容器时,可以通过docker run命令行传递一些环境变量来调整实例的运行配置。要注意,如果容器已经包含了数据库数据目录的话,那么这些环境变量会不起作用,也即任何预先存在于镜像中的数据库会使得环境变量无效。主要使用的环境变量有下面几个:

1)MYSQL_ROOT_PASSWORD
它表示Percona服务器root超级用户的密码。

2)MYSQL_RANDOM_ROOT_PASSWORD
如果这个值设置为yes,表示Percona服务器root超级用户的密码为随机产生,且密码会输出到容器的控制台,可以使用命令docker logs container-name来找到密码。

3)MYSQL_ONETIME_PASSWORD
这是可选的环境变量,如果设置为yes,表示Percona服务器root超级用户的密码是一次性的,会过期。当登陆Percona后,必须修改密码。这个特性必须在5.6及以后版本才支持。

4)MYSQL_DATABASE
这是可选的环境变量,它表示在容器启动时可以创建一个指定名字的数据库。如果后面的user/password都设置了,那么这个user将拥有对这个指定数据库的超级权限(等同于GRANT ALL命令)。
注意:这种方式不应该用于创建root账户。

5)MYSQL_ALLOW_EMPTY_PASSWORD
如果这个值设置为yes,表示Percona服务器root超级用户的密码可以为空。
不推荐使用。

4、Percona容器的安全

在很多场景下,使用MYSQL_ROOT_PASSWORD环境变量来指定root超级用户的密码是不安全的。所以安全的做法应该这样:使用MYSQL_RANDOM_ROOT_PASSWORD随机密码环境变量。如果想让实例更加安全,还可以使用MYSQL_ONETIME_PASSWORD一次性密码环境变量。

5、数据存储

运行在Docker容器的应用程序要存储数据有两种方法:

1)让Docker管理数据库数据的存储
通过把数据库文件写入主机系统磁盘(使用内部的卷管理),实现让Docker管理数据库数据的存储。这种方法,devicemapper、aufs、overlayfs等对性能有很大影响。

2)在托管主机创建数据目录(在容器外部)
在托管主机上也即容器外部创建数据目录,且通过挂载使得此目录对容器可见。这种方法使得数据库文件易于被主机系统的工具或应用访问到。这种方法用于必须确保数据目录存在,且访问权限和其它安全机制都要设置正确。通常可以这样:

  • 在主机系统适合的卷上创建数据目录,比如/local/datadir
  • 启动容器:

.

docker run --name container-name -v /local/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret -d percona/percona-server:tag

-v参数表示从主机系统挂载/local/datadir目录到容器内的/var/lib/mysql目录,它是MySQL写数据文件的位置。

还要注意主机系统的目录是否对容器有写权限,SELinux要启用这个权限,执行:

chcon -Rt svirt_sandbox_file_t /local/datadir

如果启动MySQL容器实例使用已有的数据目录(即数据库已存在),那么在执行docker run命令时,MYSQL_ROOT_PASSWORD变量应该省略。

6、端口转发

Docker允许在容器内映射端口到主机系统的端口,使用-p选项。

docker run --name container-name `-p 6603:3306` -d percona/percona-server
mysql -h docker_host_ip -P 6603

这样就可以使用主机的6603端口连接到MySQL容器了。

7、传递参数给MySQL容器

还可以在docker run命令中传递任意参数给MySQL容器。

docker run --name my-container-name -d percona/percona-server --option1=value --option2=value

option1和option2在容器启动时之间传递到Percona容器。比如想让容器使用UTF-8作为字符集和collation的默认设置,可以这样:

docker run --name container-name -d  percona/percona-server --character-set-server=utf8 --collation-server=utf8_general_ci

8、使用自定义的MySQL配置文件

MySQL容器的启动配置文件是/var/lib/mysql/my.cnf,如果想自定义这个配置文件,可以修改它。

Percona Server 使用了一些 google-mysql-tools, Proven Scaling, Open Query 对 MySQL 进行改造。

Percona Server 的详细介绍:请点这里
Percona Server 的下载地址:请点这里

相关推荐