参考
主要内容
- Docker中的MySql安装优化
- 配置MySQL Server
- 数据持久化和配置修改
- 运行附加的初始化脚本
- 另外一个容器中的应用连接MySql
- 服务异常日志
- Docker环境变量
Docker中的MySql安装优化
mysql 的 docker 映像针对代码大小进行了优化, 这意味着它们只包括预期与在 docker 容器中运行 mysql 实例的大多数用户相关的关键组件。mysql docker 安装在以下方面不同于常见的,非 docker 安装:
打包的二进制文件仅限以下文件:
/usr/bin/my_print_defaults
/usr/bin/mysql
/usr/bin/mysql_config
/usr/bin/mysql_install_db
/usr/bin/mysql_tzinfo_to_sql
/usr/bin/mysql_upgrade
/usr/bin/mysqladmin
/usr/bin/mysqlcheck
/usr/bin/mysqldump
/usr/sbin/mysqld
所有的二进制文件都是精简过的,不包含调试信息。
配置MySQL Server
当你开启MySQL 的Docker容器时,你可以在 docker run
命令中增加配置选项,例如:
docker run --name mysql1 -d mysql/mysql-server --character-set-server=utf8mb4 --collation-server=utf8mb4_col
该命令启动您的 mysql server,以 utf8mb4 作为默认字符集, 以 utf8mb4_col 作为您的数据库的默认排序规则。
配置 mysql server 的另一种方法是准备一个配置文件, 并将其装载在容器内服务器配置文件的位置。
docker 容器原则上是短暂的, 如果容器被删除或损坏, 任何数据或配置都可能丢失 。但是, docker 数据卷提供了一种机制来持久化在 docker 容器内创建的数据(参考Docker Volume)。在初始化mysql server 容器时, 可通过挂接宿主目录的形式创建数据卷。可以通过运行docker inspect
命令输出JSON数据,查看到数据卷的相关信息。
shell> docker inspect mysql1
...
"Mounts": [
{
"Type": "volume",
"Name": "4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652",
"Source": "/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
输出结果显示了 宿主目录 /var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data
对应容器中的挂接目录/var/lib/mysql
。
保留数据的另一种方法是在创建容器时使用--mount 选项对宿主目录进行绑定装载(bind-mount)。同样的技术也可用于保留服务器的配置。下面的命令创建一个 mysql server 容器, 并对数据目录和服务器配置文件进行绑定:
docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql \
-d mysql/mysql-server:tag
mount
命令中的/path-on-host-machine/my.cnf
文件 绑定 /etc/my.cnf (容器中的配置文件),mount
命令中的 /path-on-host-machine/datadir
绑定 /var/lib/mysql
(容器中的数据目录)
绑定成功还需要达到以下条件
- 配置文件
path-on-host-machine/my.cnf
已经存在,并且符合规范
[mysqld]
user=mysql
当然文件中还可以增加其他配置选项。
- 数据目录
path-on-host-machine/datadir
已经存在。如果是初始安装的话,务必保证文件夹为空。当然你也可以在启动容器的时候挂接一个有数据的目录。
运行附加的初始化脚本
如果你考虑在创建容器的时候,运行特定的.sh 或.sql 脚本,可以把脚本保存到宿主机的一个目录下,然后 mount命令绑定到容器中的/docker-entrypoint-initdb.d/
,例如:
docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/scripts/,dst=/docker-entrypoint-initdb.d/ \
-d mysql/mysql-server:tag
另外一个容器中的应用连接MySql
通过设置 docker 网络, 可以允许多个 docker 容器相互通信, 以便另一个 docker 容器中的客户端应用程序可以访问服务器容器中的 mysql server。首先, 创建一个 docker 网络:
docker network create my-custom-net
然后, 在创建和启动服务器和客户端容器时, 使用--network选项将它们放在您创建的网络上。例如:
##mysql
docker run --name=mysql1 --network=my-custom-net -d mysql/mysql-server
##myapp
docker run --name=myapp1 --network=my-custom-net -d myapp
然后, myapp1 容器可以使用 mysql1 主机名连接到 mysql1 容器, 反之亦然, 因为 docker 会自动为给定的容器名称设置 dns。在下面的示例中, 我们从 myapp1 容器内运行 mysql 客户端, 以连接到其自己的容器中的 mysql1:
docker exec -it myapp1 mysql --host=mysql1 --user=myuser --password
服务异常日志
当容器中的MySql Server首次启动以后,如果存在以下任何一种情况,都会造成系统异常日志不记录
- 虽然挂接了配置文件,但是文件中不包含 系统参数
log_error
- 配置文件并没有挂接,Docker的环境变量
MYSQL_LOG_CONSOLE
设置为true(MySQL 5.5镜像的默认为false)。MySql的异常信息被转到了stderr
, 所以MySql的异常日志进入到了Docker容器的日志中,可以通过命令docker logs mysqld-container
进行查看。
若要使 mysql server 在这两个条件中的任何一个为真时生成错误日志, 请使用 --log-error选项将服务器配置为在容器内的特定位置生成错误日志。若要保留错误日志, 请在容器内的错误日志位置挂接主机文件。但是, 您必须确保您的 mysql server 在其容器内具有对已装入的主机文件的写访问权限。
Docker环境变量
创建 mysql server 容器时, 可以通过使用--env 选项 (-e) 并指定以下一个或多个环境变量来配置 mysql 实例。
-
MYSQL_RANDOM_ROOT_PASSWORD
当此变量为 true (这是其默认状态时, 除非 MYSQL_ROOT_PASSWORD 或 MYSQL_ALLOW_EMPTY_PASSWORD 设置为 true), 否则在启动 docker 容器时, 将为服务器的根用户生成随机密码。密码打印到容器的标准输出中, 可以通过查看容器的日志找到。 -
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
, 则创建用户时没有任何权限。 -
MYSQL_ROOT_HOST
默认情况下, mysql 创建 'root'@'localhost' 帐户。此帐户只能从容器内部连接到容器中。若要允许来自其他主机的管理员连接, 请设置此环境变量。例如, 值 172.17.0.1, 即默认的 docker 网关 ip, 允许从运行容器的主机进行连接。该选项只接受一个条目, 但允许通配符 (例如, MYSQL_ROOT_HOST=172. *. *. * 或 MYSQL_ROOT_HOST=%)。 -
MYSQL_LOG_CONSOLE
当变量为true(对于MySql5.5容器默认false), MySql的异常日志转到 标准异常输出stderr,所以异常日志进入到了Docker容器日志中, 可通过docker logs mysqld-container
查看。 -
MYSQL_ROOT_PASSWORD
该变量用于给MySql root 帐号设置一个密码 -
MYSQL_ALLOW_EMPTY_PASSWORD
将其设置为 true, 以允许使用root用户的空白密码启动容器。
网友评论