在 MariaDB Docker 库容器中安装插件
MariaDB 插件是无需重新构建 MariaDB 服务器即可添加到核心软件的软件组件。插件可以是存储引擎、附加安全要求、有关服务器的特殊日志信息等。MariaDB 有大量内置插件,这些插件是永久安装的(在 SHOW PLUGINS
查询中列出)。插件可以在启动时、初始化期间加载,或者在服务器运行时动态加载。
在本博客中,我们将介绍如何在 MariaDB 容器中列出可用的插件,以及在容器中安装插件的方法。最后,我们将创建一个 Dockerfile,以便使用容器镜像中未安装的插件构建自定义镜像。
MariaDB 基金会在 dockerhub 上维护 MariaDB 服务器的官方 Docker 库镜像。您将看到大多数命令都引用了这些镜像。
MariaDB 容器的初始启动
首次启动 MariaDB 容器时,需要为服务器配置一个可以连接到它的数据库用户。默认情况下,此用户名为 root
,如果未设置 MARIADB_ROOT_PASSWORD
、MARIADB_ALLOW_EMPTY_ROOT_PASSWORD
或 MARIADB_RANDOM_ROOT_PASSWORD
中的任何一个环境变量,服务器将无法启动。
还有其他环境变量,允许创建第二个用户,并仅在该用户上授予单个数据库的权限。这些变量是
MARIADB_USER
指定用户名称MARIADB_PASSWORD
MARIADB_USER
要使用的密码MARIADB_DATABASE
MARIADB_USER
将具有访问权限的数据库。该数据库也将被创建。
我们建议您利用这些变量,不要仅仅依靠使用 root
用户进行所有访问。在本博客文章中,每当我们需要启动服务器时,我们都会使用这些环境变量。您可以在官方 dockerhub 文档中阅读有关其他可用变量的更多信息,搜索“environment variables”。
更多信息请参阅MariaDB 容器备忘单。
MariaDB 容器中的可用插件
MariaDB Server 包自带一些可用插件,这些插件默认存在于 mariadb 容器中。在容器中,插件文件(以 .so 结尾)位于目录 /usr/lib/mysql/plugin
中。服务器系统变量 plugin_dir 默认设置为同一文件夹,它控制服务器在哪里查找插件。
我们可以通过列出容器内的目录来列出可用插件
$ docker run --rm mariadb:latest ls -C /usr/lib/mysql/plugin
auth_ed25519.so ha_blackhole.so query_cache_info.so
auth_pam.so ha_federated.so query_response_time.so
auth_pam_tool_dir ha_federatedx.so server_audit.so
auth_pam_v1.so ha_sphinx.so simple_password_check.so
disks.so handlersocket.so sql_errlog.so
file_key_management.so locales.so type_mysql_json.so
ha_archive.so metadata_lock_info.so wsrep_info.so
请注意 `--rm` 标志,它确保在执行 `ls` 命令后不会在系统上留下任何容器。
在 MariaDB 容器中启用插件
为了使用 MariaDB 插件,服务器必须安装(更具体地说是在服务器内加载)然后启用它们。有一些内置插件默认启用且无法卸载。其他插件需要在服务器内安装。仅将 `.so` 文件放在插件目录中是不够的。有多种可能的方法可以安装和启用插件。我们将探讨实现此目的的四种不同方法。
- 使用命令行选项启用插件
- 使用配置文件选项启用插件
- 在 `/docker-entrypoint-initdb.d` 中启用插件
- 使用 Dockerfile 构建包含插件的新镜像(适用于容器中默认未安装的插件)
1. 使用命令行选项启用插件
您可以将命令行选项传递给 docker 入口点脚本,该脚本最终会启动 `mariadbd` 二进制文件(服务器)。要加载插件,我们可以使用选项 plugin-load-add。我们使用此方法来加载默认未安装的可用插件之一
$ docker run -d \
--env MARIADB_USER=anel \
--env MARIADB_PASSWORD='$coMp"|lex99password' \
--env MARIADB_DATABASE=web_users \
--env MARIADB_RANDOM_ROOT_PASSWORD=1 \
--name mariadb-server \
mariadb:latest --plugin-load-add=simple_password_check
我们可以通过使用 `mariadb` 客户端连接到容器并运行 `SHOW PLUGINS SONAME LIKE 'simple_password%'` 来检查 `simple_password_check` 的存在。
$ docker exec mariadb-server mariadb -u anel -p'$coMp"|lex99password' -e "SHOW PLUGINS SONAME LIKE 'simple_password%'\G"
*************************** 1. row ***************************
Name: simple_password_check
Status: ACTIVE
Type: PASSWORD VALIDATION
Library: simple_password_check.so
License: GPL
在这里我们看到插件存在并且处于**ACTIVE**状态。
在我们进入下一个选项之前,让我们停止容器并移除对其名称的引用。
$ docker stop mariadb-server && docker rm mariadb-server
2. 使用额外的配置文件启用插件
与其将命令行参数传递给 `mariadbd`(这很快就会变得难以管理),更好的方法是在配置文件中指定插件。例如,让我们安装 FederatedX 插件。首先,让我们创建一个配置目录和一个配置文件来指示服务器安装插件。
$ mkdir my_container_config/
$ printf "[mariadb]\nplugin-load-add=ha_federatedx\n" > my_container_config/my_container.conf
我们可以将此文件作为卷传递到容器中,放在特殊的 `/etc/mysql/conf.d` 目录中。服务器启动时,会读取此目录中的文件并将其附加到默认服务器配置中。
$ docker run -d \
--env MARIADB_USER=anel \
--env MARIADB_PASSWORD='$coMp"|lex99password' \
--env MARIADB_DATABASE=web_users \
--env MARIADB_RANDOM_ROOT_PASSWORD=1 \
--volume $PWD/my_container_config:/etc/mysql/conf.d:z \
--name mariadb-server \
mariadb:latest
我们可以像检查 `simple_password_check` 那样检查 `ha_federatedx` 的存在。
$ docker exec mariadb-server mariadb -u anel -p'$coMp"|lex99password' -e "SHOW PLUGINS SONAME LIKE 'ha_federatedx%'\G"
*************************** 1. row ***************************
Name: FEDERATED
Status: NOT INSTALLED
Type: STORAGE ENGINE
Library: ha_federatedx.so
License: GPL
再次提醒,记得清理。
$ docker stop mariadb-server && docker rm mariadb-server
3. 在首次数据库初始化期间启用插件
我们可以使用的另一个容器启动钩子是 `/docker-entrypoint-initdb.d` 文件夹。此文件夹包含在容器初次创建时运行的 SQL 脚本。它们可用于设置自定义数据库模式。我们将使用它通过运行 `INSTALL SONAME` 来安装 `disks` 插件。首先,让我们创建数据库初始化文件夹和 SQL 脚本。
$ mkdir my_initdb/
$ printf 'INSTALL SONAME "disks";\n' > my_initdb/disks.sql
启动时将此目录作为 /docker-entrypoint-init.d 卷传递。
$ docker run -d \
--env MARIADB_USER=anel \
--env MARIADB_PASSWORD='$coMp"|lex99password' \
--env MARIADB_DATABASE=web_users \
--env MARIADB_RANDOM_ROOT_PASSWORD=1 \
--volume $PWD/my_initdb:/docker-entrypoint-initdb.d:z \
--name mariadb-server \
mariadb:latest
注意:通常也会传递一个 */var/lib/mysql* 卷。这仅在尚未初始化数据库时才有效。
$ docker exec -it mariadb-server mariadb -u anel -p'$coMp"|lex99password' -e "SHOW PLUGINS SONAME LIKE 'disks%'\G"
*************************** 1. row ***************************
Name: DISKS
Status: ACTIVE
Type: INFORMATION SCHEMA
Library: disks.so
License: GPL
4. 使用 Dockerfile 构建包含附加插件的新镜像
某些插件默认未安装在容器中,因为它们包含附加依赖项。一个例子是 CONNECT 存储引擎。相反,我们需要从 `mariadb-plugin-connect` 包中安装它。
我们使用容器镜像的分层方法来创建基于 *mariadb* 的新容器镜像,在这种情况下,使用 Dockerfile。
Dockerfile 示例 `my_connect_plugin.dockerfile`
FROM mariadb:latest
LABEL maintainer="anel@mariadb.org"
RUN apt-get -y update && \
apt-get install mariadb-plugin-connect -y && \
rm -rf /var/lib/apt/lists/*
为了从 Dockerfile 构建镜像,运行
$ docker build -t mariadb_connect . -f my_connect_plugin.dockerfile
我们可以从生成的镜像 `mariadb_connect` 中看到,CONNECT 存储引擎配置为通过配置文件加载。这是从 `mariadb-plugin-connect` 包安装的
$ docker run --rm mariadb_connect cat /etc/mysql/mariadb.conf.d/connect.cnf
[mariadb]
plugin-load-add=ha_connect.so
构建完成后,我们可以像使用原始 `mariadb` 容器镜像一样使用 `mariadb_connect` 镜像。
更多信息请参阅创建自定义 Docker 镜像。
结论与未来工作
在本博客中,我们学习了如何在容器中启动 MariaDB 以及在 Docker Library MariaDB 容器中安装插件的各种方法。我们展示了如何在容器实例中使用配置文件和卷。
在下一篇博客中,我们将使用从 Dockerfile 构建的镜像来使用 CONNECT 存储引擎做一些工作。我整理了一份备忘单,其中包含了在这些教程过程中最常用的命令。
一如既往,欢迎提供反馈!如果在运行任何这些命令时遇到任何问题,请在评论中告知我们。也欢迎您在 Zulip 上讨论!您发现的任何错误都应报告到 JIRA 的 MDEV 项目中。