Установка и использование MariaDB через Docker
Иногда мы хотим установить определенную версию MariaDB, MariaDB Galera Cluster или MaxScale в определенной системе, но пакеты недоступны. Или, может быть, мы просто хотим изолировать MariaDB от остальной системы, чтобы быть уверенными, что мы не нанесем никакого ущерба.
Виртуальная машина определенно подойдет для этой области. Однако это означает установку системы поверх другой системы. Это требует много ресурсов.
Во многих случаях лучшим решением является Docker. Docker - это фреймворк, который запускает контейнеры. Контейнер предназначен для запуска определенного демона и программного обеспечения, необходимого для правильной работы этого демона. Docker не виртуализирует всю систему; контейнер включает только те пакеты, которые не включены в базовую систему.
Docker требует очень мало ресурсов. Он может работать в виртуализированной системе. Он используется как в среде разработки, так и в производственной среде.
Docker - это проект с открытым исходным кодом, выпущенный под лицензией Apache License, версия 2.
Обратите внимание: хотя в ваших репозиториях пакетов может быть вызванный пакет docker
, мы, вероятно, говорим не о Docker. Пакет Docker может называться docker.io
или docker-engine
.
Установка Docker в вашу систему с помощью универсального сценария установки
Приведенный ниже сценарий установит репозитории Docker, необходимые модули ядра и пакеты в наиболее распространенных дистрибутивах Linux:
curl -sSL https://get.docker.com/ | sh
Запуск dockerd
В некоторых системах вам, возможно, придется запустить dockerd daemon
самостоятельно:
sudo sudo groupadd docker
sudo gpasswd -a $USER docker
Использование образов MariaDB
Самый простой способ использовать MariaDB в Docker - выбрать образ MariaDB и создать контейнер.
Скачивание изображения
Вы можете загрузить образ MariaDB для Docker из официального репозитория MariaDB или выбрать другой образ, который лучше соответствует вашим потребностям. Вы можете найти образ в Docker Hub (официальный набор репозиториев) с помощью этой команды:
docker search mariadb
Как только вы найдете образ, который хотите использовать, вы можете загрузить его через Docker. Также будут загружены некоторые слои, включая необходимые зависимости. Обратите внимание, что после загрузки слоя для определенного образа Docker не нужно будет повторно загружать его для другого образа.
Например, если вы хотите установить образ MariaDB по умолчанию, вы можете ввести:
docker pull mariadb / server: 10.4
Это установит версию 10.4. Версии 10.1, 10.2 и 10.3 также являются допустимым выбором.
Вы увидите список необходимых слоев. Для каждого слоя Dockers сообщит, присутствует ли он уже, или о ходе его загрузки.
Чтобы получить список установленных образов:
docker images
Создание контейнера
Изображение - это не запущенный процесс; это просто программное обеспечение, которое нужно запустить. Чтобы запустить его, мы должны сначала создать контейнер. Команду, необходимую для создания контейнера, обычно можно найти в документации к изображению. Например, чтобы создать контейнер для официального образа MariaDB:
docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD = mypass -d mariadb / server: 10.3
mariadbtest
это имя, которое мы хотим присвоить контейнеру. Если мы не укажем имя, идентификатор будет автоматически сгенерирован.
10.1 и 10.2 также являются допустимыми целевыми версиями:
docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD = mypass -d mariadb / server: 10.1
docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD = mypass -d mariadb / server: 10.2
При желании после имени образа мы можем указать некоторые параметры для mysqld . Например:
docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD = mypass -d mariadb / server: 10.3 --log-bin --binlog-format = MIXED
Докер ответит идентификатором контейнера. Но чтобы убедиться, что контейнер создан и работает, мы можем получить список запущенных контейнеров следующим образом:
docker ps
У нас должен получиться результат, подобный этому:
КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНА СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ 819b786a8b48 mariadb / server "/ docker-entrypoint. 4 минуты назад Вверх на 4 минуты 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 rm mariadbtest
Обратите внимание, что приведенная выше команда не уничтожает том данных, который Docker создал для / var / lib / mysql. Если вы хотите также уничтожить том, используйте:
docker rm -v mariadbtest
Приостановка контейнеров
Контейнер также можно заморозить с помощью pause
команды. Docker заморозит процесс с помощью групп. MariaDB не будет знать, что он замораживается, и, когда мы unpause
это сделаем , MariaDB возобновит свою работу, как ожидалось.
Оба pause
и unpause
принимают одно или несколько имен контейнеров. Итак, если мы запускаем кластер, мы можем заморозить и возобновить работу всех узлов одновременно:
docker pause node1 node2 node3 docker unpause node1 node2 node3
Приостановка контейнера очень полезна, когда нам нужно временно освободить ресурсы нашей системы. Если в данный момент контейнер не имеет решающего значения (например, он выполняет некоторую пакетную работу), мы можем освободить его, чтобы другие программы работали быстрее.
Устранение проблем с контейнером
Зайти в контейнер можно с помощью одной из команд:
docker exec -ti suspicious_shockley bash
docker exec -ti suspicious_shockley sh
Эта команда показывает, что демон отправил на стандартный вывод с момента последней попытки запуска - текст, который мы обычно видим при вызове mysqld
из командной строки.
В некоторых системах, включая последние выпуски Ubuntu, такие команды, как docker stop mariadbtest
и, docker restart mariadbtest
могут завершаться с ошибкой разрешений. Это может быть вызвано пакетом AppArmor и даже sudo
не позволит вам выполнить команду. Вы можете полностью удалить AppArmor, используя следующие команды:
sudo apt-get purge --auto-remove apparmor перезапуск докера службы sudo docker system prune --all --volumes
После этого перезапуск системы позволит Docker нормально работать. Дополнительная информация доступна на форумах Docker: https://forums.docker.com/t/can-not-stop-docker-container-permission-denied-error/41142/3
Доступ к контейнеру
Чтобы получить доступ к контейнеру через Bash, мы можем запустить эту команду:
docker exec -it mariadbtest bash
Теперь мы можем использовать обычные команды Linux, такие как cd , ls и т. Д. У нас будут права root. Мы даже можем установить наш любимый файловый редактор, например:
apt-get update apt-get install vim
Для некоторых изображений репозиторий не настроен по умолчанию, поэтому нам может потребоваться их добавить.
Обратите внимание: если мы запустим mysqladmin shutdown или команду SHUTDOWN для остановки контейнера, контейнер будет деактивирован, и мы автоматически выйдем в нашу систему.
Подключение к MariaDB извне контейнера
Если мы попытаемся подключиться к серверу MariaDB localhost
, клиент будет обходить сеть и пытаться подключиться к серверу, используя файл сокета в локальной файловой системе. Однако это не работает, когда MariaDB работает внутри контейнера, потому что файловая система сервера изолирована от хоста. Клиент не может получить доступ к файлу сокета, который находится внутри контейнера, поэтому не может подключиться.
Поэтому соединения с сервером MariaDB должны выполняться с использованием TCP, даже если клиент работает на том же компьютере, что и контейнер сервера.
Для большинства образов MariaDB, включая официальный, внешние TCP-соединения отключены с помощью bind-address
параметра в файле # my.cnf #. Образ докера, используемый в этом руководстве, основан на Ubuntu, поэтому файл находится по адресу /etc/mysql/my.cnf
.
Чтобы использовать MariaDB, нам нужно будет отредактировать файл конфигурации, чтобы изменить соответствующий параметр, а затем перезапустить контейнер.
Внутри контейнера отредактируйте файл my.cnf
и проверьте, не начинается ли строка bind-address
. Поместите хеш в начале строки, чтобы закомментировать ее:
# адрес привязки = 127.0.0.1
Сохраните файл.
Еще находясь внутри контейнера, отправьте команду выключения в MariaDB. Это выключит сервер, а также выйдет обратно на хост:
mysqladmin -u root -p выключение
Снова запустите контейнер. На этот раз на сервере MariaDB будет включена сеть:
docker start mariadbtest
Найдите IP-адрес, который был назначен контейнеру:
docker inspect -f '{{диапазон .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 --prot