2.5.7.2 Дополнительные темы по развертыванию MySQL Server с Docker
Большинство приведенных ниже образцов команд используют mysql/mysql-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, установки в следующих аспектах:
-
Включенные двоичные файлы ограничены:
/usr/bin/my_print_defaults/usr/bin/mysql/usr/bin/mysql_config/usr/bin/mysql_install_db/usr/bin/mysql_tzinfo_to_sql/usr/bin/mysql_upgrade/usr/bin/mysqladmin/usr/bin/mysqlcheck/usr/bin/mysqldump/usr/bin/mysqlpump/usr/sbin/mysqld
Все двоичные файлы сжаты; они не содержат отладочной информации.
Настройка сервера MySQL
При запуске контейнера MySQL Docker вы можете передавать параметры конфигурации серверу через команду docker run. Например:
docker run --name mysql1 -d mysql/mysql-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 mysql/mysql-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 mysql/mysql-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 mysql/mysql-serverdocker 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 5.7 —false). Журнал ошибок сервера MySQL перенаправляется вstderr, чтобы журнал ошибок попадал в журнал Docker и был доступен с помощью команды docker logsmysqld-container.
Чтобы MySQL Server генерировал журнал ошибок, когда выполняется хотя бы одно из двух условий, используйте опцию --log-error, чтобы настроить сервер на генерацию журнала ошибок в определённом месте внутри контейнера. Для сохранения журнала ошибок смонтируйте файл хоста в местоположение журнала ошибок внутри контейнера, как описано в разделе "Сохранение данных и изменений конфигурации". Однако, убедитесь, что ваш MySQL Server внутри контейнера имеет права записи в смонтированный файл хоста.
Известные проблемы
При использовании системной переменной сервера
audit_log_fileдля настройки имени файла журнала аудита, используйте с нейlooseмодификатор опции, иначе Docker не сможет запустить сервер.
Переменные окружения Docker
При создании контейнера MySQL Server вы можете настроить экземпляр MySQL, используя опцию --env (сокращённо -e) и указание одной или нескольких следующих переменных окружения.
Ни одна из переменных ниже не имеет никакого эффекта, если каталоги данных, которые вы монтируете, не пустые, так как тогда не будет выполняться никакая инициализация сервера (подробнее см. раздел "Сохранение данных и изменений конфигурации"). Любое предварительно существующее содержимое в папке, включая старые настройки сервера, не изменяется во время запуска контейнера.
Логические переменные, включая
MYSQL_RANDOM_ROOT_PASSWORD,MYSQL_ONETIME_PASSWORD,MYSQL_ALLOW_EMPTY_PASSWORDиMYSQL_LOG_CONSOLE, становятся истинными, если они задаются строками ненулевой длины. Поэтому, установка их, например, в «“0”», «“false”» или «“no”» не делает их ложными, а на самом деле делает их истинными. Это известная проблема контейнеров MySQL Server.
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 5.7 являетсяfalse), журнал ошибок 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. Установите в истинное значение, чтобы разрешить запуск контейнера с пустым паролем для пользователя root.ПредупреждениеУстановка этой переменной в истинное значение небезопасна, так как это оставит ваш экземпляр MySQL полностью незащищённым, позволяя любому получить доступ суперпользователя. Предпочтительнее использовать значения по умолчанию
MYSQL_RANDOM_ROOT_PASSWORDиMYSQL_ONETIME_PASSWORD, оба равные истине.
© 2025 Oracle
Licensed under the GPLv2 License.