Настройка образов Docker MariaDB

Настройка образов Docker MariaDB

21 октября 2022 г.

Часто мне приходится развертывать MariaDB для разработки на моем рабочем ноутбуке, выделенный сервер и даже на Raspberry Pi устройств. Я стараюсь использовать Docker, когда это возможно, чтобы уменьшить беспорядок на этих машинах — очень легко создавать и удалять контейнеры, не прибегая к процедурам установки и удаления.

MariaDB публикует образы Docker для всех продуктов, которые я использую, включая Сервер сообщества MariaDB, MariaDB Enterprise Server, ColumnStore, MaxScale и XPand . Хотя эти образы предлагают гибкие параметры конфигурации, которые отлично подходят для сред разработки или оценки, иногда полезно иметь пользовательские образы, адаптированные для конкретных приложений. Вот несколько советов и рекомендаций по настройке образов Docker MariaDB для сред разработки.

Использование образов Docker MariaDB

Всегда рекомендуется использовать официальные образы Docker MariaDB, поскольку они поддерживаются команда, которая лучше всех знает MariaDB. Вот некоторые из этих изображений:

* Сервер сообщества MariaDB * Сервер сообщества MariaDB с ColumnStore * MariaDB MaxScale * MariaDB Xpand (один узел)

Стоит отметить, что также существует реестр MariaDB Enterprise Docker, который предоставляет образы Docker. для MariaDB Enterprise Server (усиленная, оптимизированная версия MariaDB плюс дополнительные компоненты для высокого уровня масштабируемости, безопасности, надежности и времени безотказной работы).

Развертывание контейнера MariaDB для разработки не требует серьезной настройки. Обычно вам нужно открыть порт и установить пароль root. Это можно сделать с помощью переменных окружения. Ознакомьтесь с документацией по каждому изображению, чтобы узнать о доступных параметрах. Кроме того, вы можете настроить пользовательскую сеть Docker и том. Например, вот как запустить базу данных MariaDB в контейнере Docker для приложения, работающего на том же компьютере:

docker run --name mariadb-database 
  --detach 
  --volume mariadb-database-volume:/var/lib/mysql 
  --publish 3333:3306 
  --env MARIADB_ROOT_PASSWORD='the_root_password' 
  --env MARIADB_DATABASE=the_database 
  --env MARIADB_USER=the_app_user 
  --env MARIADB_PASSWORD='the_user_password' 
  mariadb:latest

Это настраивает отдельный (работающий в фоновом режиме) контейнер с базой данных MariaDB, используя том Docker с именем mariadb-database-volume. База данных доступна через порт 3333 (3333:3306 означает «пересылать запросы с порта 3333 на порт 3306 в контейнере»). Пользователь root имеет the_root_password. the_database создается автоматически, и the_app_user может получить доступ к этой базе данных, используя the_user_password. Если вы хотите, чтобы база данных запускалась автоматически при запуске Docker, добавьте параметр --restart, если не остановлен где-нибудь перед именем образа (mariadb:latest).

Использование пользовательских конфигураций

MariaDB можно настроить с помощью системных переменных и файлы параметров (.cnf) .

Настройка через командную строку

Вы можете передавать системные переменные в командной строке при запуске контейнера. Например, чтобы включить бинарный журнал и задать собственный идентификатор сервера и порт, вы можете запустить контейнер следующим образом:

docker run --name mariadb-database 
  --detach 
  --env MARIADB_ROOT_PASSWORD='the_root_password' 
  mariadb:latest 
  --log_bin=primary_log_bin --server_id=1 --port=3333

Проверьте результат, используя:

docker exec -it mariadb-database 
  mariadb --port 3333 --password='the_root_password' 
    --execute='select @@log_bin, @@server_id'

Настройка с помощью конфигурационных файлов

Для передачи пользовательских файлов конфигурации используйте тома Docker. Пользовательские файлы .cnf должны быть помещены в каталог /etc/mysql/conf.d/ внутри контейнера. Например, вы можете включить двоичный журнал и установить идентификатор сервера, используя следующий файл my-server.cnf:

[mariadb]
log_bin = primary_log_bin
server_id = 1

Чтобы передать этот файл в контейнер, поместите файл конфигурации в текущий каталог и запустите контейнер следующим образом:

docker run --name mariadb-database 
  --detach 
  --volume $PWD:/etc/mysql/conf.d 
  --env MARIADB_ROOT_PASSWORD='the_root_password' 
  mariadb:latest

Проверьте результат, используя:

docker exec -it mariadb-database 
  mariadb --password='the_root_password' 
    --execute='select @@log_bin, @@server_id'

Запуск сценариев оболочки и SQL после создания контейнера

Любые .sql, .sh (а также .sql.gz, .sql.xz и .sql.zst) в каталоге /docker-entrypoint-initdb.d/ внутри контейнера запускаются после создания и инициализации контейнера. Давайте объединим эту функцию с файлами параметров, чтобы настроить первичный сервер с пользователем для репликации и пользователя для MaxScale (отметьте это руководство, если вы хотите быстро узнать об автоматическом разделении чтения-записи с помощью Максимальный масштаб). Нам нужно включить двоичный журнал, установить идентификатор сервера и запустить сценарий SQL, подобный следующему:

CREATE USER 'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION REPLICA ON *.* TO 'replication_user'@'%';
RESET MASTER;

CREATE USER 'maxscale_user'@'%' IDENTIFIED BY 'password';
GRANT SELECT ON mysql.* TO 'maxscale_user'@'%';
GRANT SHOW DATABASES, SLAVE MONITOR ON *.* to 'maxscale'@'%';

Чтобы все было в порядке, мы можем создать два каталога на хост-компьютере. Один для хранения файлов .cnf и один для хранения файлов .sql:

Структура каталогов с отдельными подкаталогами для файлов конфигурации и SQL

Чтобы передать эти файлы в контейнер, запустите его следующим образом:

docker run --name mariadb-database 
  --detach 
  --volume mariadb-database-volume:/var/lib/mysql 
  --volume $PWD/sql:/docker-entrypoint-initdb.d 
  --volume $PWD/cnf:/etc/mysql/conf.d 
  --env MARIADB_ROOT_PASSWORD='the_root_password' 
  mariadb:latest

Все сценарии SQL в вашем локальном каталоге ./sql и все файлы конфигурации в ./cnf передаются в контейнер. Примеры использования файлов .sh см. в этом репозитории GitHub.

Создание пользовательского изображения для демонстрации

Образы MariaDB Docker, как и любые другие образы Docker, можно расширить с помощью файлов Docker. Давайте создадим собственный образ MariaDB для демонстрационных целей (не используйте его в рабочей среде!). Нам нужна структура каталогов и файлы, показанные в предыдущем разделе, помещенные в новый каталог (./copy) вместе с новым файлом Dockerfile:

Файл Dockerfile вместе с каталогом для копирования, который соответствует структуре файловой системы контейнера

Вместо использования томов Docker мы можем просто скопировать файлы в файловую систему образа с помощью инструкции COPY. Эта инструкция находится в пользовательском Dockerfile:

FROM mariadb
ENV MARIADB_ROOT_PASSWORD="password"
ENV MARIADB_DATABASE="demo"
ENV MARIADB_USER="user"
ENV MARIADB_PASSWORD="password"
COPY primary/copy/ /
EXPOSE 3306

Поскольку файлы .sql и .cnf размещаются в ожидаемых подкаталогах внутри каталога copy/, они будут работать, как описано в предыдущих разделах. .

Что дальше?

После запуска базы данных MariaDB в контейнере Docker вы можете подключиться к ней извне. Не забудьте опубликовать порт, который прослушивает сервер MariaDB (по умолчанию 3306), используя что-то вроде --publish 3333:3306 при запуске контейнера. В следующих примерах используется 3333, но вы также можете использовать любой свободный порт на хосте, даже 3306 (--опубликовать 3306:3306).

Подключение к базе данных из клиентов SQL

Вы можете подключиться к базе данных с помощью любого клиента SQL, который напрямую поддерживает MariaDB, ODBC или JDBC. Например, DBeaver или один из Клиентские расширения SQL для VSCode. Настройте хост как 127.0.0.1, порт как 3333, пользователя как the_app_user (или root), и пароль как the_user_password (или the_root_password).

Вы также можете использовать клиент командной строки mariadb для подключения к базе данных следующим образом:

mariadb --host 127.0.0.1 --port 3333 --user the_app_user -p

Если контейнер запущен на удаленном компьютере и предполагается, что порт в сети открыт, просто замените IP-адрес.

Подключение к базе данных из приложений Java, Python и Node.js

Вы можете подключиться к базе данных из Java, Python, Node.js и других приложений с помощью соединителей MariaDB. .

В Java вы можете использовать следующее соединение JDBC. строка (без учетных данных):

jdbc:mariadb://localhost:3333/the_database

Из приложений Python:

import mariadb

connection = mariadb.connect(
    host="127.0.0.1",
    port=3333,
    database="the_database"
    user="the_app_user",
    password="the_user_password")

И создайте приложения Node.js:

const mariadb = require('mariadb');

connection = await mariadb.createConnection({
    host: 127.0.0.1',
    port: '3333',
    database: 'the_database',
    user: 'the_app_user',
    password: 'the_user_password'
});

Дополнительные примеры можно найти на странице быстрого запуска базы данных MariaDB Центр разработчиков.


Оригинал