Spec-Zone.ru › MySQL 9.2

2.5.6.2 Дополнительные темы по развертыванию сервера MySQL с Docker

Примечание

Большинство следующих примеров команд используют container-registry.oracle.com/mysql/community-server в качестве образа Docker (как в командах docker pull и docker run); измените это, если ваш образ из другого репозитория — например, замените его на container-registry.oracle.com/mysql/enterprise-server для образов MySQL Enterprise Edition, загруженных из Oracle Container Registry (OCR), или mysql/enterprise-server для образов MySQL Enterprise Edition, загруженных с сайта My Oracle Support.

  • Оптимизированная установка MySQL для Docker

  • Настройка сервера MySQL

  • Сохранение данных и изменений конфигурации

  • Запуск дополнительных скриптов инициализации

  • Подключение к MySQL из приложения в другом контейнере Docker

  • Журнал ошибок сервера

  • Использование MySQL Enterprise Backup с Docker

  • Использование mysqldump с Docker

  • Известные проблемы

  • Переменные окружения Docker

Оптимизированная установка MySQL для Docker

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

  • Включено только ограниченное количество библиотек.

  • Все библиотеки сжаты; они не содержат отладочной информации.

Предупреждение

Любые обновления или установки программного обеспечения, которые пользователи выполняют в контейнере Docker (включая те, что для компонентов MySQL), могут конфликтовать с оптимизированной установкой MySQL, созданной образом Docker. Oracle не предоставляет поддержку продуктов MySQL, работающих в таком изменённом контейнере или контейнере, созданном из изменённого образа Docker.

Настройка сервера MySQL

При запуске контейнера MySQL Docker вы можете передать параметры конфигурации серверу через команду docker run. Например:

docker run --name mysql1 -d container-registry.oracle.com/mysql/community-server:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_col

Команда запускает сервер MySQL с utf8mb4 в качестве набора символов по умолчанию и utf8mb4_col в качестве набора сопоставлений по умолчанию для баз данных.

Другой способ настройки сервера MySQL — подготовить файл конфигурации и смонтировать его в расположение файла конфигурации сервера внутри контейнера. Подробнее см. Сохранение данных и изменений конфигурации.

Сохранение данных и изменений конфигурации

Контейнеры Docker, по своей сути, являются временными, и любые данные или конфигурация, как ожидается, будут потеряны, если контейнер будет удалён или повреждён (см. обсуждение здесь). Объёмы Docker предоставляют механизм сохранения данных, созданных внутри контейнера Docker. При инициализации контейнер сервера MySQL создаёт объём Docker для каталога данных сервера. Вывод JSON команды docker inspect для контейнера включает ключ Mount, значение которого предоставляет информацию о том, где хранится объём данных:

$> docker inspect mysql1
...
 "Mounts": [
            {
                "Type": "volume",
                "Name": "4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652",
                "Source": "/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
...

Вывод показывает, что исходный каталог /var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data, в котором сохраняются данные на хосте, смонтирован в /var/lib/mysql, каталог данных сервера внутри контейнера.

Ещё один способ сохранения данных — использовать bind-mount каталог хоста, используя опцию --mount при создании контейнера. Этот же метод можно использовать для сохранения конфигурации сервера. Следующая команда создаёт контейнер сервера MySQL и смонтирует каталог данных и файл конфигурации сервера:

docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql \
-d container-registry.oracle.com/mysql/community-server:tag 

Команда монтирует path-on-host-machine/my.cnf в /etc/my.cnf (файл конфигурации сервера внутри контейнера), и path-on-host-machine/datadir в /var/lib/mysql (каталог данных внутри контейнера). Для работы bind-mounting необходимо выполнить следующие условия:

  • Файл конфигурации path-on-host-machine/my.cnf должен существовать и содержать спецификацию запуска сервера пользователем mysql:

    [mysqld]
    user=mysql

    Вы также можете добавить в файл другие параметры конфигурации сервера.

  • Каталог данных path-on-host-machine/datadir должен существовать. Для инициализации сервера каталог должен быть пустым. Вы также можете смонтировать каталог, заполненный данными, и запустить сервер с ним; однако, необходимо убедиться, что вы запустите контейнер Docker с той же конфигурацией, что и сервер, который создал данные, и все необходимые файлы или каталоги хоста смонтированы при запуске контейнера.

Запуск дополнительных скриптов инициализации

Если есть какие-либо .sh или .sql скрипты, которые вы хотите запустить в базе данных сразу после её создания, вы можете поместить их в каталог хоста и затем смонтировать каталог в /docker-entrypoint-initdb.d/ внутри контейнера. Например:

docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/scripts/,dst=/docker-entrypoint-initdb.d/ \
-d container-registry.oracle.com/mysql/community-server:tag
Подключение к MySQL из приложения в другом контейнере Docker

Настроив сеть Docker, вы можете разрешить нескольким контейнерам Docker взаимодействовать друг с другом, так что клиентское приложение в другом контейнере Docker может получить доступ к серверу MySQL в контейнере сервера. Сначала создайте сеть Docker:

docker network create my-custom-net

Затем, когда вы создаёте и запускаете контейнеры сервера и клиента, используйте опцию --network, чтобы поместить их в созданную вами сеть. Например:

docker run --name=mysql1 --network=my-custom-net -d container-registry.oracle.com/mysql/community-server
docker run --name=myapp1 --network=my-custom-net -d myapp

Контейнер myapp1 может подключиться к контейнеру mysql1 с именем хоста mysql1 и наоборот, так как Docker автоматически настраивает DNS для заданных имён контейнеров. В следующем примере мы запускаем клиент mysql внутри контейнера myapp1 для подключения к хосту mysql1 в собственном контейнере:

docker exec -it myapp1 mysql --host=mysql1 --user=myuser --password

Для других сетевых методов для контейнеров см. раздел сетевого взаимодействия контейнеров Docker в документации Docker.

Журнал ошибок сервера

Когда сервер MySQL впервые запускается с вашим контейнером сервера, журнал ошибок сервера сервера НЕ генерируется, если выполняется хотя бы одно из следующих условий:

  • Файл конфигурации сервера с хоста смонтирован, но файл не содержит системную переменную log_error (см. Сохранение данных и изменений конфигурации о монтировании файла конфигурации сервера).

  • Файл конфигурации сервера с хоста не смонтирован, но переменная окружения Docker MYSQL_LOG_CONSOLE равна true (это значение по умолчанию для контейнеров сервера MySQL 9.2). Тогда журнал ошибок сервера MySQL перенаправляется в stderr, таким образом, журнал ошибок отправляется в журнал контейнера Docker и его можно просмотреть, используя команду docker logs mysqld-container.

Чтобы заставить MySQL Server генерировать журнал ошибок, когда выполняется хотя бы одно из двух условий, используйте опцию --log-error, чтобы настроить сервер на генерацию журнала ошибок в определенном месте внутри контейнера. Чтобы сохранить журнал ошибок, смонтируйте файл хоста в местоположение журнала ошибок внутри контейнера, как описано в Разделе о сохранении данных и конфигурации. Однако необходимо убедиться, что ваш MySQL Server внутри контейнера имеет права записи в смонтированный файл хоста.

Использование MySQL Enterprise Backup с Docker

MySQL Enterprise Backup — это коммерческий инструмент резервного копирования для MySQL Server, доступный с MySQL Enterprise Edition. MySQL Enterprise Backup включён в Docker-установку MySQL Enterprise Edition.

В следующем примере предполагается, что у вас уже запущен MySQL Server в Docker-контейнере (см. раздел 2.5.6.1, «Основные шаги развертывания MySQL Server с Docker» о том, как запустить экземпляр MySQL Server с Docker). Для того чтобы MySQL Enterprise Backup смог выполнить резервное копирование MySQL Server, он должен иметь доступ к каталогу данных сервера. Это можно сделать, например, связывая каталог хоста с каталогом данных MySQL Server при запуске сервера:

docker run --name=mysqlserver \
--mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
-d mysql/enterprise-server:9.2

С помощью этой команды MySQL Server запускается с Docker-изображением MySQL Enterprise Edition, а каталог хоста /path-on-host-machine/datadir/ был смонтирован на каталог данных сервера (/var/lib/mysql) внутри контейнера сервера. Мы также предполагаем, что после запуска сервера необходимые привилегии также были настроены для MySQL Enterprise Backup для доступа к серверу (см. , для получения подробностей). Используйте следующие шаги для резервного копирования и восстановления экземпляра MySQL Server.

Чтобы выполнить резервное копирование экземпляра MySQL Server, запущенного в Docker-контейнере, с помощью MySQL Enterprise Backup с Docker, следуйте указанным ниже шагам:

  1. На том же хосте, где запущен контейнер MySQL Server, запустите другой контейнер с образом MySQL Enterprise Edition для выполнения резервного копирования с помощью команды MySQL Enterprise Backup. Предоставьте доступ к каталогу данных сервера с помощью смонтированного нами ранее связывания. Также смонтируйте каталог хоста (/path-on-host-machine/backups/ в этом примере) в папку хранения резервных копий внутри контейнера (/data/backups в примере), чтобы сохранить создаваемые резервные копии. Вот пример команды для этого шага, где MySQL Enterprise Backup запускается с Docker-изображением, загруженным с My Oracle Support:

    $> docker run \
    --mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
    --mount type=bind,src=/path-on-host-machine/backups/,dst=/data/backups \
    --rm mysql/enterprise-server:9.2 \
    mysqlbackup -umysqlbackup -ppassword --backup-dir=/tmp/backup-tmp --with-timestamp \
    --backup-image=/data/backups/db.mbi backup-to-image

    Важно проверить конец вывода командой mysqlbackup, чтобы убедиться в успешном завершении резервного копирования.

  2. Контейнер завершает работу по завершении задачи резервного копирования и, с использованием опции --rm при его запуске, удаляется после завершения работы. Резервная копия образа создана и находится в каталоге хоста, смонтированном на последнем шаге для хранения резервных копий, как показано здесь:

    $> ls /tmp/backups
    db.mbi
    

Чтобы восстановить экземпляр MySQL Server в Docker-контейнере с помощью MySQL Enterprise Backup с Docker, следуйте этим шагам:

  1. Остановите контейнер MySQL Server, что также останавливает MySQL Server внутри него:

    docker stop mysqlserver
  2. На хосте удалите все содержимое смонтированного каталога данных MySQL Server:

    rm -rf /path-on-host-machine/datadir/*
    
  3. Запустите контейнер с образом MySQL Enterprise Edition для выполнения восстановления с помощью команды MySQL Enterprise Backup. Смонтируйте каталог данных сервера и папку хранения резервных копий, как и при резервном копировании сервера:

    $> docker run \
    --mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
    --mount type=bind,src=/path-on-host-machine/backups/,dst=/data/backups \
    --rm mysql/enterprise-server:9.2 \
    mysqlbackup --backup-dir=/tmp/backup-tmp --with-timestamp \
    --datadir=/var/lib/mysql --backup-image=/data/backups/db.mbi copy-back-and-apply-log
    
    mysqlbackup completed OK! with 3 warnings
    

    Контейнер завершает работу с сообщением " mysqlbackup completed OK!" по завершении задачи восстановления и, с использованием опции --rm при его запуске, удаляется после завершения работы.

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

    docker restart mysqlserver
    

    Или, запустите новый MySQL Server на восстановленном каталоге данных, как показано ниже:

    docker run --name=mysqlserver2 \
    --mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
    -d mysql/enterprise-server:9.2
    

    Войдите на сервер, чтобы проверить, что сервер работает с восстановленными данными.

Использование mysqldump с Docker

Помимо использования MySQL Enterprise Backup для резервного копирования MySQL Server, запущенного в Docker-контейнере, вы можете выполнить логическое резервное копирование сервера, используя утилиту mysqldump, запущенную внутри Docker-контейнера.

Следующие инструкции предполагают, что у вас уже запущен MySQL Server в Docker-контейнере и при первом запуске контейнера каталог хоста /path-on-host-machine/datadir/ был смонтирован на каталог данных сервера /var/lib/mysql (см. раздел о связывании каталога хоста с каталогом данных MySQL Server для подробностей), который содержит файл сокета Unix, с помощью которого mysqldump и mysql могут подключиться к серверу. Мы также предполагаем, что после запуска сервера был создан пользователь с соответствующими привилегиями (admin в этом примере), с помощью которого mysqldump может получить доступ к серверу. Используйте следующие шаги для резервного копирования и восстановления данных MySQL Server.

Резервное копирование данных MySQL Server с помощью mysqldump с Docker:

  1. На том же хосте, где запущен контейнер MySQL Server, запустите другой контейнер с образом MySQL Server для выполнения резервного копирования с помощью утилиты mysqldump (см. документацию утилиты для ее функциональности, опций и ограничений). Предоставьте доступ к каталогу данных сервера, смонтировав /path-on-host-machine/datadir/. Также смонтируйте каталог хоста (/path-on-host-machine/backups/ в этом примере) в папку хранения резервных копий внутри контейнера (/data/backups используется в этом примере), чтобы сохранить создаваемые резервные копии. Вот пример команды для резервного копирования всех баз данных на сервере с использованием данной настройки:

    $> docker run --entrypoint "/bin/sh" \
    --mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
    --mount type=bind,src=/path-on-host-machine/backups/,dst=/data/backups \
    --rm container-registry.oracle.com/mysql/community-server:9.2 \
    -c "mysqldump -uadmin --password='password' --all-databases > /data/backups/all-databases.sql"
    

    В команде используется опция --entrypoint, чтобы вызвать оболочку системы после запуска контейнера, и опция -c для указания команды mysqldump для выполнения в оболочке, вывод которой перенаправляется в файл all-databases.sql в каталоге резервных копий.

  2. Контейнер завершается по завершении задачи резервного копирования и, с использованием опции --rm при его запуске, удаляется после завершения работы. Логическое резервное копирование создано и находится в каталоге хоста, смонтированном для хранения резервной копии, как показано здесь:

    $> ls /path-on-host-machine/backups/
    all-databases.sql

Восстановление данных MySQL Server с помощью mysqldump с Docker:

  1. Убедитесь, что у вас запущен MySQL Server в контейнере, в котором вы хотите восстановить данные.

  2. Запустите контейнер с образом MySQL Server для выполнения восстановления с помощью клиента mysql. Смонтируйте каталог данных сервера, а также папку хранения резервной копии:

    $> docker run  \
    --mount type=bind,src=/path-on-host-machine/datadir/,dst=/var/lib/mysql \
    --mount type=bind,src=/path-on-host-machine/backups/,dst=/data/backups \
    --rm container-registry.oracle.com/mysql/community-server:9.2 \
    mysql -uadmin --password='password' -e "source /data/backups/all-databases.sql"
    
    

    Контейнер завершается по завершении задачи восстановления и, с использованием опции --rm при его запуске, удаляется после завершения работы.

  3. Войдите на сервер, чтобы проверить, что восстановленные данные теперь находятся на сервере.

Известные проблемы
  • При использовании системной переменной сервера audit_log_file для настройки имени файла журнала аудита используйте loose модификатор опции, иначе Docker не сможет запустить сервер.

Переменные окружения Docker

При создании контейнера MySQL Server вы можете настроить экземпляр MySQL, используя опцию --env (краткая форма -e) и указание одной или нескольких переменных окружения. Инициализация сервера не выполняется, если смонтированный каталог данных не пустой; в этом случае установка любой из этих переменных не оказывает влияния (см. Сохранение данных и конфигураций), и при запуске контейнера не изменяется содержимое каталога, включая настройки сервера.

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

  • Булевы переменные, включая MYSQL_RANDOM_ROOT_PASSWORD, MYSQL_ONETIME_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD и MYSQL_LOG_CONSOLE, принимают значение «истина», если они заданы любыми строками ненулевой длины. Поэтому, установив их, например, в значения “0”, “false” или “no”, вы не устанавливаете их в значение «ложь», а фактически устанавливаете их в значение «истина». Это известная проблема.

  • MYSQL_RANDOM_ROOT_PASSWORD: Когда эта переменная имеет значение «истина» (что является её стандартным состоянием, если не установлена MYSQL_ROOT_PASSWORD или MYSQL_ALLOW_EMPTY_PASSWORD в значении «истина»), случайный пароль для системного пользователя сервера генерируется при запуске контейнера Docker. Пароль выводится в stdout контейнера и может быть найден в журнале контейнера (см. Запуск экземпляра MySQL Server).

  • MYSQL_ONETIME_PASSWORD: Когда переменная имеет значение «истина» (что является её стандартным состоянием, если не установлена MYSQL_ROOT_PASSWORD или MYSQL_ALLOW_EMPTY_PASSWORD в значении «истина»), пароль системного пользователя устанавливается как просроченный, и его необходимо изменить, прежде чем MySQL можно будет использовать в нормальном режиме.

  • MYSQL_DATABASE: Эта переменная позволяет указать имя базы данных, которая будет создана при запуске образа. Если имя пользователя и пароль указаны с помощью MYSQL_USER и MYSQL_PASSWORD, пользователь создаётся и получает права суперпользователя для этой базы данных (соответствующее GRANT ALL). Указанная база данных создаётся инструкцией CREATE DATABASE IF NOT EXIST, поэтому переменная не действует, если база данных уже существует.

  • MYSQL_USER, MYSQL_PASSWORD: Эти переменные используются совместно для создания пользователя и установки пароля этого пользователя, и пользователю предоставляются права суперпользователя для базы данных, указанной переменной MYSQL_DATABASE. Для создания пользователя необходимы и MYSQL_USER, и MYSQL_PASSWORD; если какая-либо из этих двух переменных не установлена, другая игнорируется. Если обе переменные установлены, но MYSQL_DATABASE нет, пользователь создаётся без каких-либо привилегий.

    Примечание

    Нет необходимости использовать этот механизм для создания системного пользователя root, который создаётся по умолчанию с паролем, заданным одним из механизмов, описанных в описаниях для MYSQL_ROOT_PASSWORD и MYSQL_RANDOM_ROOT_PASSWORD, если MYSQL_ALLOW_EMPTY_PASSWORD не равно «истина».

  • MYSQL_ROOT_HOST: По умолчанию MySQL создаёт учётную запись 'root'@'localhost'. К этой учётной записи можно подключиться только изнутри контейнера, как описано в Подключение к MySQL Server изнутри контейнера. Чтобы разрешить подключения root из других хостов, установите эту переменную окружения. Например, значение 172.17.0.1, которое является IP-адресом шлюза Docker по умолчанию, разрешает подключения с хост-машины, на которой запущен контейнер. Опция принимает только одно значение, но допускаются подстановки (например, MYSQL_ROOT_HOST=172.*.*.* или MYSQL_ROOT_HOST=%).

  • MYSQL_LOG_CONSOLE: Когда переменная имеет значение «истина» (что является стандартным значением для контейнеров сервера MySQL 9.2), журнал ошибок MySQL Server перенаправляется в stderr, чтобы журнал ошибок попадал в журнал контейнера Docker и мог быть просмотрен с помощью команды docker logs mysqld-container.

    Примечание

    Переменная не имеет эффекта, если файл конфигурации сервера со стороны хоста был смонтирован (см. Сохранение данных и конфигураций по поводу привязки файла конфигурации).

  • MYSQL_ROOT_PASSWORD: Эта переменная указывает пароль, который устанавливается для учётной записи MySQL root.

    Предупреждение

    Установка пароля пользователя MySQL root в командной строке небезопасна. В качестве альтернативы явной установке пароля вы можете установить переменную с путем к файлу пароля в контейнере и затем смонтировать файл с вашим хоста в указанный путь в контейнере. Это всё равно не очень безопасно, так как расположение файла пароля всё равно открыто. Предпочтительно использовать значения по умолчанию, где MYSQL_RANDOM_ROOT_PASSWORD и MYSQL_ONETIME_PASSWORD оба равны «истина».

  • MYSQL_ALLOW_EMPTY_PASSWORD. Установите его в значение «истина», чтобы разрешить запуск контейнера с пустым паролем для системного пользователя.

    Предупреждение

    Установка этой переменной в значение «истина» небезопасна, так как это оставит ваш экземпляр MySQL полностью незащищённым, позволив любому получить полный доступ суперпользователя. Предпочтительно использовать значения по умолчанию, где MYSQL_RANDOM_ROOT_PASSWORD и MYSQL_ONETIME_PASSWORD оба равны «истина».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/docker-mysql-more-topics.html

Spec-Zone.ru

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