在 MariaDB Docker 库容器中安装插件

MariaDB 插件是无需重新构建 MariaDB 服务器即可添加到核心软件的软件组件。插件可以是存储引擎、附加安全要求、有关服务器的特殊日志信息等。MariaDB 有大量内置插件,这些插件是永久安装的(在 SHOW PLUGINS 查询中列出)。插件可以在启动时、初始化期间加载,或者在服务器运行时动态加载。

在本博客中,我们将介绍如何在 MariaDB 容器中列出可用的插件,以及在容器中安装插件的方法。最后,我们将创建一个 Dockerfile,以便使用容器镜像中未安装的插件构建自定义镜像。

MariaDB 基金会在 dockerhub 上维护 MariaDB 服务器的官方 Docker 库镜像。您将看到大多数命令都引用了这些镜像。

MariaDB 容器的初始启动

首次启动 MariaDB 容器时,需要为服务器配置一个可以连接到它的数据库用户。默认情况下,此用户名为 root,如果未设置 MARIADB_ROOT_PASSWORDMARIADB_ALLOW_EMPTY_ROOT_PASSWORDMARIADB_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` 文件放在插件目录中是不够的。有多种可能的方法可以安装和启用插件。我们将探讨实现此目的的四种不同方法。

  1. 使用命令行选项启用插件
  2. 使用配置文件选项启用插件
  3. 在 `/docker-entrypoint-initdb.d` 中启用插件
  4. 使用 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 项目中。