6.23 Docker Compose в действии: пример настройки MySQL
Docker Compose – это инструмент для определения и запуска многоконтейнерных Docker-приложений. С его помощью вы описываете конфигурацию сервисов (контейнеров) в одном YAML-файле, а затем одной командой можете запустить сразу несколько контейнеров, настроенных для совместной работы. Проще говоря, Docker Compose позволяет с одного действия поднять весь стек сервисов вашего приложения (например, веб-сервер + база данных) вместо ручного запуска каждого контейнера по отдельности. Это особенно полезно, когда приложение состоит из нескольких взаимосвязанных частей – например, веб-сайта и требующейся ему базы данных.
В данном руководстве мы рассмотрим использование Docker Compose на примере развёртывания MySQL. Мы покажем, как создать файл настройки docker-compose.yml
с MySQL, организовать постоянное хранение данных через тома (volumes) и настроить сеть (network) для связи между контейнерами. Также вы узнаете, как запустить и проверить работу контейнера MySQL, как подключиться к базе данных как с хоста, так и из другого контейнера (например, с phpMyAdmin), а в конце – основные рекомендации по безопасности и управлению паролями (с использованием файла .env).
Требования:
- Заказаная услуга виртуального или выделенного сервера.
- На сервере должен быть установлен Docker. Если он не установлен, можете установитьсогласно нашей инструкцииDocker;
- Убедитесь что у Вас есть sudo-доступ или Ваш пользователь имеет права запускать Docker (например, входит в группу docker на Linux).
Настройка docker-compose.yml
для MySQL
Начнём с подготовки файла docker-compose.yml
, в котором опишем сервис базы данных MySQL (и дополнительно – phpMyAdmin для удобства управления). Ниже представлен пример содержимого файла с комментариями по основным настройкам:
version: '3.8' # Версия формата Compose-файла
services:
db:
image: mysql:8.0 # Официальный образ MySQL 8.0
container_name: mysql-db # Имя контейнера (необязательно, для удобства)
ports:
- "3306:3306" # Проброс порта MySQL на хост (для подключения снаружи). Обратите внимание, что если у Вас уже есть установленый MYSQL, то воизбежание конфликта необходимо выбрать иной порт, например 3307:3307
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # Пароль root (берётся из .env)
MYSQL_DATABASE: ${MYSQL_DATABASE} # Имя БД для создания (из .env)
MYSQL_USER: ${MYSQL_USER} # Дополнительный пользователь БД (из .env)
MYSQL_PASSWORD: ${MYSQL_PASSWORD} # Пароль доп. пользователя (из .env)
volumes:
- db_data:/var/lib/mysql # Именованный том для хранения данных БД
networks:
- app-network # Подключение к пользовательской сети
phpmyadmin:
image: phpmyadmin:latest # Образ phpMyAdmin
container_name: myadmin # Имя контейнера phpMyAdmin
depends_on:
- db # Сначала должен стартовать контейнер db
ports:
- "8080:80" # phpMyAdmin будет доступен на порту 8080
environment:
PMA_HOST: db # Хост БД для подключения (имя сервиса MySQL)
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # Пароль root для доступа
networks:
- app-network
# Определяем именованный том и сеть
volumes:
db_data: # Том для данных MySQL (Docker сам хранит его данные)
networks:
app-network: # Пользовательская сеть для наших сервисов
driver: bridge
В этом Compose-файле определены два сервиса:
db
– контейнер с MySQL. Ему заданы переменные окружения MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD (пароли и имена будут заданы через внешний файл.env
, о котором ниже). Также для него смонтирован том db_data в директорию /var/lib/mysql внутри контейнера – это путь, где MySQL хранит данные. Благодаря тому, что мы указали именованный том, данные базы будут сохраняться между перезапусками контейнера (даже если контейнер удалить, том останется, пока вы его явно не удалите). Порт 3306 проброшен на хост, чтобы при необходимости можно было подключаться к MySQL извне (например, с локального хоста или удалённо).phpmyinfo
– контейнер с phpMyAdmin, веб-интерфейсом для управления MySQL. Мы добавили его для примера, чтобы продемонстрировать подключение к базе из другого контейнера. Этот контейнер зависит отdb
(через depends_on, что обеспечивает запуск MySQL первым), и в переменных среды указано, куда ему подключаться:PMA_HOST: dbозначает, что phpMyAdmin будет искать сервис MySQL по хостнеймуdb
. В Docker Compose по умолчанию создаётся общая сеть для всех сервисов приложения, и они могут обращаться друг к другу по именам сервисов. Мы явно указали сеть app-network для наглядности – оба контейнера в ней состоят, поэтому phpMyAdmin может подключиться к MySQL по имени db. Порт phpMyAdmin 80 мы пробросили на 8080 на хосте – открыв браузер по адресу http://<ваш сервер>:8080/ вы попадёте в интерфейс phpMyAdmin.
Настройка переменных окружения в файле .env
Файл .env: Обратите внимание, в docker-compose.yml
используются конструкции ${…} – это ссылки на переменные окружения. Значения этих переменных мы зададим в отдельном файле .env (в той же директории, где и docker-compose.yml
). Docker Compose автоматически подхватывает переменные из файла .env, расположенного в каталоге проекта. Использование отдельного .env-файла упрощает управление настройками и позволяет не дублировать пароли и другие секреты в разных местах конфигурации.
Создайте рядом с docker-compose.yml
файл .env
и добавьте туда следующие строки (подставьте свои значения вместо примеров):
MYSQL_ROOT_PASSWORD=StrongRootPass123 # обязательный пароль для пользователя root MySQL
MYSQL_DATABASE=myappdb # имя базы данных, которую нужно создать при старте
MYSQL_USER=myuser # имя дополнительного пользователя
MYSQL_PASSWORD=UserPass456 # пароль для дополнительного пользователя
- MYSQL_ROOT_PASSWORD обязательная переменная, без неё контейнер MySQL не запустится. Согласно документации, она задаёт пароль суперпользователя “root” для MySQL. Используйте достаточно сложный пароль.
- MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD – эти переменные необязательные. Если указать, то при первом запуске контейнера будет автоматически создана новая база данных с заданным именем, а также пользователь с именем MYSQL_USER и с паролем MYSQL_PASSWORDкоторому предоставлены права на эту базу. Это удобно, например, чтобы сразу подготовить отдельного администратора для приложения. (Если вам не нужны дополнительный пользователь и база, можете опустить эти переменные).
После подготовки docker-compose.yml
и .env
мы готовы запускать наши сервисы. Далее рассмотрены шаги запуска и проверки работы – они практически одинаковы для разных дистрибутивов Linux, однако мы приведём отдельные примечания для Debian/Ubuntu и для CentOS/AlmaLinux/RockyLinux.
Запуск и проверка
- Запустите Docker Compose находясь в директории с файлом
docker-compose.yml
, выполните команду запуска compose:
docker compose up -d
- -d запустит контейнеры в фоновом режиме (демонизировано). После выполнения команды Compose соберёт и запустит указанные в файле сервисы. Вы увидите вывод, что контейнеры созданы и запущены. Например:
Docker Compose автоматически создал сеть app-network и том db_data для нашего проекта (если они не были созданы ранее). По умолчанию, если не указано иное, Compose формирует имя сети по имени проекта (обычно совпадает с именем папки) с суффиксом . В нашем случае мы явно задали имя сети, поэтому она так и называется. Все контейнеры проекта подключены к этой сети и могут общаться друг с другом по сервисным именам.
- Проверьте, что контейнеры запущены выполните команду списка контейнеров:
docker compose ps
или аналогично
docker ps
, Она покажет вообще все запущенные контейнеры Docker
docker ps
В выводе должны отображаться как минимум два контейнера – MySQL и phpMyAdmin – со статусом “Up”.
Например:
- Просмотрите логи MySQL при первом запуске полезно убедиться, что база данных инициализирована.
docker compose logs -f db
Она покажет журналы контейнера db (наш MySQL). Вы должны увидеть сообщения о том, что сервер MySQL запущен и слушает порт 3306, а также, возможно, что создана база данных myappdb и пользователь myuser (если вы их задавали). После строки “[Server] /usr/sbin/mysqld: ready for connections.” можно считать, что БД готова к работе.
- Подключение к базе данных с хост-системы
Теперь попробуем подключиться к MySQL, работающей внутри контейнера, например из командной строки сервера. Для этого на хосте должен быть установлен MySQL-клиент. В Debian/Ubuntu можно установить пакет:
sudo apt install mysql-client
. После этого подключаемся командой к локальному порту сервера:
mysql -h 127.0.0.1 -P 3306 -u root -p
При выполнении вас попросят ввести пароль – введите тот, что вы указали в переменной MYSQL_ROOT_PASSWORD в файле .env
. Если всё сделано правильно, вы попадёте в консоль MySQL на контейнере. Можно выполнить запрос SHOW DATABASES; чтобы увидеть список баз (там должна быть myappdb и системные базы).
5. Подключение к базе из другого контейнера
В нашем примере уже запущен контейнер phpMyAdmin, который подключён к тому же проекту compose. Откройте веб-браузер и перейдите по адресу http://<адрес_сервера>:8080/. Вы должны увидеть интерфейс phpMyAdmin. В поле Server уже подставлено db (т.к. мы указали PMA_HOST: db), осталось ввести Username = root и Password = ваш MYSQL_ROOT_PASSWORD (как вариант, можно зайти под пользователем myuser с паролем UserPass456 – тогда в поле сервер можно тоже оставить db, это будет подключение к той же БД). Если авторизация прошла, вы получите веб-доступ к вашей базе данных. Таким образом, phpMyAdmin, находясь в одной сети с MySQL, обратился к нему по внутреннему имени хоста и успешно подключился.
- Остановка контейнеров После работы вы можете остановить и удалить запущенные контейнеры командой:
docker compose down
Эта команда остановит сервисы и отсоединит тома, но не удалит именованный том с данными db_data(для удаления томов нужно добавить флаг -v). Это означает, что при следующем запуске up данные в базе сохранятся. Если же вы хотите полностью сбросить среду (удалить контейнеры, сеть и том с данными), используйте:
docker compose down -v