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
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.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 8.4). Журнал ошибок сервера 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: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, следуйте указанным ниже шагам:
-
На том же хосте, где запущен контейнер 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, чтобы убедиться в успешном завершении резервного копирования.
-
Контейнер завершает работу по завершении задачи резервного копирования и, с использованием опции
--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: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!" по завершении задачи восстановления и, с использованием опции--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: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:
-
На том же хосте, где запущен контейнер 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в каталоге резервных копий. -
Контейнер завершается по завершении задачи резервного копирования и, с использованием опции
--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:8.4 \ 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в значение «истина»), случайный пароль для пользователя 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 logsmysqld-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.