Spec-Zone.ru › MySQL 8.4

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

Примечание

В большинстве следующих командных примеров используется Docker образ container-registry.oracle.com/mysql/community-server (например, в командах 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, каталог данных сервера внутри контейнера.

Другой способ сохранения данных — смонтировать каталог хоста с помощью опции --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 (каталог данных внутри контейнера). Для работы монтирования необходимо соблюдать следующие условия:

  • Файл конфигурации 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 8.4). Журнал ошибок сервера 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:8.4

С помощью этой команды 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:8.4 \
    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:8.4 \
    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:8.4
    

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

Использование 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:8.4 \
    -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:8.4 \
    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 в значение «истина»), случайный пароль для пользователя root сервера генерируется при запуске контейнера Docker. Пароль выводится в stdout контейнера и может быть найден в журнале контейнера (см. Запуск экземпляра MySQL Server).

  • MYSQL_ONETIME_PASSWORD: Когда переменная истинна (что является её стандартным значением, если не установлена MYSQL_ROOT_PASSWORD или MYSQL_ALLOW_EMPTY_PASSWORD в значение «истина»), пароль пользователя root устанавливается как просроченный, и его необходимо изменить перед обычным использованием 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 Server 8.4), журнал ошибок MySQL Server перенаправляется в stderr, так что журнал ошибок попадает в журнал контейнера Docker и может быть просмотрен с помощью команды docker logs mysqld-container.

    Примечание

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

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

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

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

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

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

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

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

Spec-Zone.ru

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