Spec-Zone.ru › MySQL 5.7

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

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

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

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

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

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

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

  • Переменные среды Docker

Оптимизированная установка 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.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 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-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 5.7 — false). Журнал ошибок сервера MySQL перенаправляется в stderr, чтобы журнал ошибок попадал в журнал Docker и был доступен с помощью команды docker logs mysqld-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 logs mysqld-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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/docker-mysql-more-topics.html

Spec-Zone.ru

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