Docker中创建MySql服务的更多话题

2019-02-21  本文已影响19人  elef

参考

主要内容

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 (容器中的数据目录)

绑定成功还需要达到以下条件

[mysqld]
user=mysql

当然文件中还可以增加其他配置选项。

运行附加的初始化脚本

如果你考虑在创建容器的时候,运行特定的.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首次启动以后,如果存在以下任何一种情况,都会造成系统异常日志不记录

Docker环境变量

创建 mysql server 容器时, 可以通过使用--env 选项 (-e) 并指定以下一个或多个环境变量来配置 mysql 实例。

上一篇 下一篇

猜你喜欢

热点阅读