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
Образы 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.cnfmysql:[mysqld] user=mysql
Вы также можете добавить в файл другие параметры конфигурации сервера.
Каталог данных
должен существовать. Для инициализации сервера каталог должен быть пустым. Вы также можете смонтировать каталог, заполненный данными, и запустить сервер с ним; однако, необходимо убедиться, что вы запустите контейнер Docker с той же конфигурацией, что и сервер, который создал данные, и все необходимые файлы или каталоги хоста смонтированы при запуске контейнера.path-on-host-machine/datadir
Запуск дополнительных скриптов инициализации
Если есть какие-либо .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 logsmysqld-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, следуйте указанным ниже шагам:
-
На том же хосте, где запущен контейнер 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, чтобы убедиться в успешном завершении резервного копирования.
-
Контейнер завершает работу по завершении задачи резервного копирования и, с использованием опции
--rmпри его запуске, удаляется после завершения работы. Резервная копия образа создана и находится в каталоге хоста, смонтированном на последнем шаге для хранения резервных копий, как показано здесь:$>
ls /tmp/backupsdb.mbi
Чтобы восстановить экземпляр MySQL Server в Docker-контейнере с помощью MySQL Enterprise Backup с Docker, следуйте этим шагам:
-
Остановите контейнер MySQL Server, что также останавливает MySQL Server внутри него:
docker stop mysqlserver
-
На хосте удалите все содержимое смонтированного каталога данных MySQL Server:
rm -rf
/path-on-host-machine/datadir/* -
Запустите контейнер с образом MySQL Enterprise Edition для выполнения восстановления с помощью команды MySQL Enterprise Backup. Смонтируйте каталог данных сервера и папку хранения резервных копий, как и при резервном копировании сервера:
$>
docker run \ --mount type=bind,src=mysqlbackup completed OK! with 3 warnings/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!" по завершении задачи восстановления и, с использованием опции--rmпри его запуске, удаляется после завершения работы. -
Перезапустите контейнер сервера, что также перезапустит восстановленный сервер, используя следующую команду:
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:
-
На том же хосте, где запущен контейнер 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в каталоге резервных копий. -
Контейнер завершается по завершении задачи резервного копирования и, с использованием опции
--rmпри его запуске, удаляется после завершения работы. Логическое резервное копирование создано и находится в каталоге хоста, смонтированном для хранения резервной копии, как показано здесь:$>
lsall-databases.sql/path-on-host-machine/backups/
Восстановление данных MySQL Server с помощью mysqldump с Docker:
Убедитесь, что у вас запущен MySQL Server в контейнере, в котором вы хотите восстановить данные.
-
Запустите контейнер с образом 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при его запуске, удаляется после завершения работы. Войдите на сервер, чтобы проверить, что восстановленные данные теперь находятся на сервере.
Известные проблемы
При использовании системной переменной сервера
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 logsmysqld-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.