Spec-Zone.ru › MariaDB

Установка и использование MariaDB через Docker

Иногда нам нужно установить определённую версию MariaDB, MariaDB ColumnStore или MaxScale на определённой системе, но нет доступных пакетов. Или, возможно, мы просто хотим изолировать MariaDB от остальной системы, чтобы убедиться, что не нанесём никакого вреда.

Виртуальная машина, безусловно, подойдёт для этой цели. Однако это означает установку системы поверх другой системы. Это требует значительных ресурсов.

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

Docker требует очень небольшого количества ресурсов. Он может работать на виртуализированной системе. Он используется как в средах разработки, так и в производственных средах. Docker — это проект с открытым исходным кодом, выпущенный под лицензией Apache, версия 2.

Обратите внимание, что, хотя в ваших репозиториях пакетов может быть пакет под названием docker, это, вероятно, не тот Docker, о котором идёт речь. Пакет Docker может называться docker.io или docker-engine.

Для получения информации об установке Docker см. Получение Docker в документации Docker.

Установка Docker на вашей системе с помощью универсального скрипта установки

Приведённый ниже скрипт установит репозитории Docker, необходимые модули ядра и пакеты на наиболее распространённых дистрибутивах Linux:

curl -sSL https://get.docker.com/ | sh

Запуск dockerd

В некоторых системах может потребоваться запустить dockerd daemon самостоятельно:

sudo systemctl start docker
sudo gpasswd -a "${USER}" docker

Если dockerd не запущен, при выполнении большинства команд docker вы получите следующую ошибку: installing-and-using-mariadb-via-docker Не удаётся подключиться к демону Docker по адресу unix:/var/run/docker.sock. Демон docker запущен? <</code>>

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

Самый простой способ использовать MariaDB в Docker — выбрать образ MariaDB и создать контейнер.

Загрузка образа

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

 docker search mariadb

После того, как вы нашли нужный образ, вы можете загрузить его через Docker. Также будут загружены некоторые слои, включая необходимые зависимости. Обратите внимание, что после загрузки слоя для определённого образа, Docker не будет загружать его снова для другого образа.

Например, если вы хотите установить стандартный образ MariaDB, вы можете ввести:

docker pull mariadb:10.4

Это установит версию 10.4. Версии 10.2, 10.3, 10.5 также являются допустимыми вариантами.

Вы увидите список необходимых слоёв. Для каждого слоя Docker укажет, уже ли он присутствует, или отобразит прогресс загрузки.

Чтобы получить список установленных образов:

docker images

Создание контейнера

Образ — это не запущенный процесс; это просто программное обеспечение, необходимое для запуска. Для запуска образа необходимо сначала создать контейнер. Команда для создания контейнера обычно находится в документации к образу. Например, чтобы создать контейнер для официального образа MariaDB:

docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD=mypass -p 3306:3306 -d docker.io/library/mariadb:10.3

mariadbtest — это имя, которое мы хотим присвоить контейнеру. Если мы не укажем имя, будет автоматически сгенерирован идентификатор.

10.2 и 10.5 также являются допустимыми целевыми версиями:

docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD=mypass -p 3306:3306 -d docker.io/library/mariadb:10.2
docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD=mypass -p 3306:3306  -d docker.io/library/mariadb:10.5

По желанию, после имени образа, мы можем указать некоторые параметры для mysqld. Например:

docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD=mypass -p 3306:3306 -d mariadb:10.3 --log-bin --binlog-format=MIXED

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

docker ps

Должен быть получен вывод, подобный этому:

CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS               NAMES
819b786a8b48        mariadb                    "/docker-entrypoint.   4 minutes ago       Up 4 minutes        3306/tcp            mariadbtest        

Запуск и остановка контейнера

Docker позволяет нам перезапустить контейнер одной командой:

docker restart mariadbtest

Контейнер также можно остановить следующим образом:

docker stop mariadbtest

Этот команда не уничтожит контейнер. Данные всё ещё будут храниться внутри контейнера, даже если MariaDB не работает. Чтобы перезапустить контейнер и увидеть наши данные, мы можем выполнить:

docker start mariadbtest

С помощью docker stop, контейнер будет корректно завершён: сигнал SIGTERM будет отправлен процессу mysqld, и Docker будет ожидать завершения процесса, прежде чем вернуть управление оболочке. Однако также возможно установить тайм-аут, после которого процесс будет немедленно убит с помощью SIGKILL. Или же можно немедленно убить процесс без тайм-аута.

docker stop --time=30 mariadbtest
docker kill mariadbtest

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

docker rm mariadbtest

Обратите внимание, что указанная выше команда не уничтожает объём данных, который Docker создал для /var/lib/mysql. Если вы хотите уничтожить объём данных, используйте:

docker rm -v mariadbtest

Автоматический перезапуск

При запуске контейнера мы можем использовать параметр --restart для установки политики автоматического перезапуска. Это полезно в производственной среде.

Допустимые значения:

  • no: Автоматический перезапуск отключён.
  • on-failure: Контейнер перезапускается, если завершается с ненулевым кодом возврата.
  • unless-stopped: Всегда перезапускать контейнер, если он не был остановлен явно, как показано выше.
  • always: Аналогично unless-stopped, но при перезапуске Docker будут перезапущены даже контейнеры, которые были остановлены явно.

Можно изменить политику перезапуска существующих, возможно запущенных, контейнеров:

docker update --restart always mariadb
# or, to change the restart policy of all containers:
docker update --restart always $(docker ps -q)

Случай использования изменения политики перезапуска существующих контейнеров — выполнение технического обслуживания в производственной среде. Например, перед обновлением версии Docker мы можем изменить политику перезапуска всех контейнеров на always, чтобы они перезапускались сразу после запуска новой версии. Однако, если некоторые контейнеры остановлены и на данный момент не нужны, мы можем изменить их политику перезапуска на unless-stopped.

Приостановка контейнеров

Контейнер также можно заморозить с помощью команды pause. Docker заморозит процесс, используя группы процессов. MariaDB не узнает, что она заморожена, и, когда мы unpause, MariaDB возобновит свою работу как ожидается.

Как pause, так и unpause принимают одно или несколько имён контейнеров. Таким образом, если мы запускаем кластер, мы можем заморозить и возобновить все узлы одновременно:

docker pause node1 node2 node3
docker unpause node1 node2 node3

Приостановка контейнера очень полезна, когда нам нужно временно освободить ресурсы нашей системы. Если контейнер не является критически важным в данный момент (например, он выполняет некоторые задачи пакетной обработки), мы можем освободить его, чтобы позволить другим программам работать быстрее.

Отладка контейнера

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

docker logs mariadbtest

Эта команда отображает то, что демон отправил в stdout с последней попытки запуска — текст, который мы обычно видим при вызове mysqld из командной строки.

В некоторых системах команды, такие как docker stop mariadbtest и docker restart mariadbtest, могут завершаться ошибкой доступа. Это может быть вызвано AppArmor, и даже sudo не позволит вам выполнить команду. В этом случае вам нужно выяснить, какой профиль вызывает проблему и исправить его или отключить его. Полное отключение AppArmor не рекомендуется, особенно в производственной среде.

Чтобы проверить, какие операции были предотвращены AppArmor, см. AppArmor Failures в документации AppArmor.

Чтобы отключить профиль, создайте символическую ссылку с именем профиля (в данном примере, mysqld) на etc/apparmor.d/disable, а затем перезагрузите профили:

ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

Для получения дополнительной информации см. Policy Layout в документации AppArmor.

После отключения профиля вам может потребоваться выполнить:

sudo service docker restart
docker system prune --all --volumes

Перезагрузка системы позволит Docker работать в обычном режиме.

Доступ к контейнеру

Чтобы получить доступ к контейнеру через Bash, мы можем выполнить эту команду:

docker exec -it mariadbtest bash

Теперь мы можем использовать обычные команды Linux, такие как cd, ls и т. д. У нас будут права root. Мы даже можем установить наш любимый текстовый редактор, например:

apt-get update
apt-get install vim

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

Обратите внимание, что если мы выполним mariadb-admin shutdown или команду SHUTDOWN для остановки контейнера, контейнер будет деактивирован, и мы автоматически вернёмся к нашей системе.

Подключение к MariaDB извне контейнера

Если мы попытаемся подключиться к серверу MariaDB по localhost, клиент проигнорирует сетевые интерфейсы и попытается подключиться к серверу с помощью файла сокета в локальной файловой системе. Однако это не работает, когда MariaDB работает внутри контейнера, потому что файловая система сервера изолирована от хоста. Клиент не может получить доступ к файлу сокета, который находится внутри контейнера, поэтому подключение не выполняется.

Поэтому подключения к серверу MariaDB должны осуществляться с использованием TCP, даже когда клиент работает на той же машине, что и контейнер сервера.

Найдите IP-адрес, назначенный контейнеру:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadbtest

Теперь вы можете подключиться к серверу MariaDB, используя TCP-соединение с этим IP-адресом.

Принудительное TCP-соединение

После включения сетевых подключений в MariaDB, как описано выше, мы сможем подключиться к серверу извне контейнера.

На хосте запустите клиент и установите адрес сервера ("-h") на IP-адрес контейнера, который вы нашли на предыдущем шаге:

mysql -h 172.17.0.2 -u root -p

Этот простой способ подключения должен работать в большинстве случаев. В зависимости от вашей конфигурации, также может потребоваться указать порт для сервера или принудительно включить TCP-режим:

mysql -h 172.17.0.2 -P 3306 --protocol=TCP -u root -p

Настройка портов для кластеризованных контейнеров и репликации

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

При работе с кластером или настройкой репликации через Docker, мы захотим, чтобы контейнеры использовали разные порты. Самый быстрый способ добиться этого — сопоставить порты контейнеров с разными портами на нашей системе. Мы можем сделать это при создании контейнеров (docker run команда), используя параметр -p, несколько раз, если необходимо. Например, для узлов Galera мы будем использовать сопоставление, подобное этому:

-p 4306:3306 -p 5567:5567 -p 5444:5444 -p 5568:5568

Установка MariaDB на другом образе

Возможно загрузить образ дистрибутива Linux и установить на нем MariaDB. Это ненамного сложнее, чем установка MariaDB на обычной операционной системе (что легко), но все же это самый сложный вариант. Обычно мы сначала попробуем использовать существующие образы. Однако, возможно, нет образа для нужной нам версии, или нам нужна пользовательская установка, или, возможно, мы хотим использовать дистрибутив, для которого нет образов. В этих случаях мы установим MariaDB в образ операционной системы.

Демонизация операционной системы

Сначала нам нужен образ системы, который будет работать в режиме демона. Если мы пропустим этот шаг, MariaDB и все базы данных будут потеряны при остановке контейнера.

Чтобы демонизировать образ, нам нужно предоставить ему команду, которая никогда не завершится. В следующем примере мы создадим демона Debian Jessie, который постоянно отправляет запросы к специальному адресу 8.8.8.8:

docker run --name debian -p 3306:3306 -d debian /bin/sh -c "while true; do ping 8.8.8.8; done"

Установка MariaDB

На данном этапе мы можем войти в оболочку и выполнить команды. Сначала нам нужно обновить репозитории, иначе пакеты не будут доступны. Мы также можем обновить пакеты, если некоторые из них новее, чем в образе. Затем нам понадобится текстовый редактор; нам понадобится он для редактирования конфигурационных файлов. Например:

# start an interactive Bash session in the container
docker exec -ti debian bash
apt-get -y update
apt-get -y upgrade
apt-get -y install vim

Теперь мы готовы к установке MariaDB в желаемом нами виде.

См. также

  • Вебинар MariaDB по официальным образам Docker.
  • Официальный сайт Docker.
  • Docker Hub.
  • Документация Docker.
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержимом, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/installing-and-using-mariadb-via-docker/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API