Гид по технологиям

Быстрый запуск MySQL в Docker

6 min read DevOps Обновлено 01 Dec 2025
Быстрый запуск MySQL в Docker
Быстрый запуск MySQL в Docker

Графика с логотипами Docker и MySQL

Быстрые ссылки

  • Getting Started

  • Docker Compose

  • Connecting to MySQL

  • Automatically Creating A Database and User

  • First-Run Seed Files

  • Tweaking Server Settings

  • Conclusion

Введение

Docker позволяет быстро поднять экземпляр MySQL без установки «на железо». Это удобно для разработки, тестирования и CI. В этом руководстве показаны базовые шаги: запуск контейнера, подключение клиентов, автоматическая инициализация, seed-файлы и тонкая настройка сервера.

Краткие термины:

  • Контейнер — изолированный экземпляр приложения.
  • Тома (volumes) — место для постоянного хранения данных вне контейнера.

Getting Started

Официальный образ MySQL на Docker Hub содержит всё необходимое. Доступны теги для версий 5.6, 5.7 и 8.0. Укажите нужный тег при скачивании:

docker pull mysql:8.0

Важно: чтобы данные не терялись при перезапуске контейнера, нужно примонтировать том или bind mount на путь /var/lib/mysql внутри контейнера. Также обязательно задать пароль для root через переменную окружения MYSQL_ROOT_PASSWORD — образ откажется инициализироваться без неё.

Пример быстрого запуска:

docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=secret -v $HOME/mysql-data:/var/lib/mysql -d mysql:8.0

Проверка статуса инициализации:

docker logs my-mysql

Ищите строку с “ready for connections” — это означает, что сервер готов принимать подключения.

Важно: выбирайте надёжный пароль и не храните секреты в публичных сценариях CI без шифрования.

Docker Compose

Для более сложных конфигураций лучше использовать docker-compose.yml — он делает конфигурацию читабельной и версионируемой.

Пример файла docker-compose.yml:

version: "3"

services:
  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD
    volumes:
      - mysql:/var/lib/mysql

volumes:
  mysql:

Запуск с передачей переменной окружения:

MYSQL_ROOT_PASSWORD=secure docker-compose up -d

Преимущества Compose: автоматическая сеть между сервисами, удобные алиасы, повторяемость и единый файл для CI.

Подключение к MySQL

Чтобы получить интерактивную MySQL-консоль внутри контейнера, используйте:

docker exec -it my-mysql mysql -p

Команда откроет клиент mysql и запросит пароль.

Импорт SQL-файла с хоста:

docker exec -it my-mysql mysql -psecret database_name < path-to-file.sql

Если хотите подключаться с хоста или другого контейнера, нужно пробросить порт. Добавьте в docker-compose.yml внутри сервиса mysql:

ports:
  - 33060:3306

Это привяжет порт 33060 на хосте к 3306 внутри контейнера. Для docker run используйте флаг -p 33060:3306.

Подключение между контейнерами в одной сети Compose — по имени сервиса и порту 3306.

Автоматическое создание базы и пользователя

Официальный образ поддерживает переменные окружения для автоматической первоначальной настройки:

  • MYSQL_DATABASE — имя создаваемой схемы при первой инициализации.
  • MYSQL_USER и MYSQL_PASSWORD — создают дополнительного пользователя; при одновременной установке MYSQL_DATABASE ему будут даны все привилегии на эту базу.
  • MYSQL_RANDOM_ROOT_PASSWORD — если задать, будет сгенерирован случайный пароль для root и выведен в stdout при первом запуске. Осторожно применять в CI — пароль может попасть в логи.

Пример использования в docker-compose.yml:

environment:
  - MYSQL_ROOT_PASSWORD=verysecret
  - MYSQL_DATABASE=app_db
  - MYSQL_USER=app_user
  - MYSQL_PASSWORD=app_pass

Seed-файлы при первом запуске

MySQL-образ автоматически выполняет файлы с расширениями .sh, .sql и .sql.gz, если они находятся в каталоге /docker-entrypoint-initdb.d и если база данных ещё не инициализирована (т.е. том пуст). Файлы выполняются последовательно в алфавитном порядке — используйте префиксы (1-, 2-) для управления порядком.

Варианты размещения seed-файлов:

  • Добавить их в кастомный Dockerfile, основанный на mysql.
  • Смонтировать директорию с хоста в /docker-entrypoint-initdb.d.

Примечание: инициализационные скрипты выполняются только при пустом каталоге данных. Очистка тома приведёт к повторной инициализации.

Настройка параметров сервера

Файлы конфигурации MySQL можно положить в /etc/mysql/conf.d. Добавляйте свои .cnf файлы через Dockerfile или bind mount. Это удобно для версионирования конфигурации вместе с проектом.

Вместо постоянных файлов для одноразовых тестов можно передавать параметры через флаги командной строки — docker run передаёт аргументы непосредственно в бинарь mysql, так как он является entrypoint.

Пример запуска с включённым общим логом:

docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=secret -d mysql:latest --general-log=on

Список опций и их описание смотрите в MySQL Server manual.

Отладка и типичные проблемы

  • Проблема: контейнер постоянно перезапускается — проверьте docker logs на ошибки и отсутствие прав на запись в том.
  • Проблема: ошибка доступа к базе — проверьте переменные окружения и корректность паролей.
  • SELinux/AppArmor: если на хосте включён SELinux, примонтированные каталоги могут блокировать запись. Используйте метку :Z или :z в bind mount (docker-compose поддерживает).
  • CI и секреты: не выводите пароли в логах. В CI используйте секцию secrets или менеджер секретов.

Когда этот подход не подходит

  • Для высоконагруженных продакшен-кластеров с требованиями по отказоустойчивости и репликации лучше использовать управляемые сервисы БД (RDS, Cloud SQL) или кластерную установку MySQL с репликацией и бэкапами.
  • Для систем с жёсткими требованиями к производительности и латентности иногда предпочтительнее «голая» установка на отдельном сервере с оптимизациями на уровне ОС и дисков.

Мини-методология: шаги для безопасного развёртывания в проекте

  1. Запланируйте том для хранения данных и резервного копирования.
  2. Определите переменные окружения: root-пароль, имя базы, user/password.
  3. Напишите seed-файлы и поместите их в /docker-entrypoint-initdb.d.
  4. Создайте docker-compose.yml с пробросом портов и определением сети.
  5. Протестируйте локально, затем добавьте в CI с безопасным хранением секретов.
  6. Настройте мониторинг и бэкапы (snapshot/cron/инструменты бэкапа).

Сниппет-справочник (Cheat sheet)

  • Скачать образ:
docker pull mysql:8.0
  • Быстрый запуск с томом:
docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=secret -v $HOME/mysql-data:/var/lib/mysql -d mysql:8.0
  • Compose — запуск:
MYSQL_ROOT_PASSWORD=secure docker-compose up -d
  • Подключиться в консоль:
docker exec -it my-mysql mysql -p
  • Импорт SQL:
docker exec -i my-mysql mysql -psecret database_name < dump.sql
  • Резервное копирование тома (простая стратегия):
docker run --rm -v mysql_data_volume:/var/lib/mysql -v $PWD:/backup busybox tar czf /backup/mysql-backup.tgz -C /var/lib/mysql .

Миграция и обновление версий

  • Миграция между мажорными версиями MySQL (например, 5.7 → 8.0) требует тестирования: проверьте совместимость схемы, функций и кодировки.
  • Всегда делайте бэкап данных перед апгрейдом. Для контейнеров это значит создать snapshot тома или экспортировать дамп (mysqldump).
  • Тестируйте миграцию на staging-окружении: разверните старую версию, сделайте дамп, импортируйте в новую версию и прогоните тесты.

Контроль качества: чеклист для ролей

  • Разработчик:

    • Убедиться, что seed-файлы idempotent (безопасны при повторном применении).
    • Не хранить секреты в репозитории.
  • DevOps:

    • Настроить бэкапы томов.
    • Проверить права и метки SELinux.
    • Настроить мониторинг (метрики, алерты по доступности и задержкам).
  • QA:

    • Проверить восстановление из бэкапа.
    • Тестировать миграции схемы на staging.

Критерии приёмки

  • Контейнер успешно запускается и сообщает “ready for connections” в логах.
  • Данные сохраняются после перезапуска контейнера (томы работают).
  • Seed-файлы исполнены корректно и создают ожидаемую структуру данных.
  • Секреты не попадают в общедоступные логи.

Короткий глоссарий

  • Тома — постоянное хранилище данных вне жизненного цикла контейнера.
  • Seed-файлы — скрипты для начального заполнения БД.
  • Entrypoint — команда или бинарь, запускаемый при старте контейнера.

Пример потока принятия решения (Mermaid)

flowchart TD
  A[Нужно ли быстро поднять БД?] -->|Да| B{Требуется ли долговременное хранение?}
  B -->|Да| C[Создать том и запустить контейнер]
  B -->|Нет| D[Запустить контейнер без тома для теста]
  C --> E{Нужны ли начальные данные?}
  E -->|Да| F[Добавить seed в /docker-entrypoint-initdb.d]
  E -->|Нет| G[Пропустить init]
  F --> H[Тестировать и бэкапить]
  G --> H
  D --> H

Заключение

Использование официального образа MySQL в Docker значительно упрощает развертывание баз данных для разработки и тестирования. Docker Compose делает конфигурацию удобной и повторяемой, а возможности автоматической инициализации и seed-файлы ускоряют старт проекта. Для продакшена учитывайте вопросы резервного копирования, мониторинга и стратегий миграции.

Резюме:

  • Всегда используйте том для хранения данных.
  • Никогда не оставляйте root-пароль пустым и не публикуйте его в логах.
  • Тестируйте миграции и обновления на staging перед продакшеном.

Важно: для критичных продакшен-сценарииев рассмотрите управляемые сервисы БД или архитектуры с репликацией и высокой доступностью.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Настройка TCP/IP в Windows
Сеть

Настройка TCP/IP в Windows

Код-пароль Kindle: установка, изменение и сброс
Руководство

Код-пароль Kindle: установка, изменение и сброс

Установить Dolby Atmos в Windows 11
Аудио

Установить Dolby Atmos в Windows 11

Windows Media Encoder на Windows 10 — установка и альтернативы
Видео софт

Windows Media Encoder на Windows 10 — установка и альтернативы

Отключить сохранение паролей в Google Chrome
браузер

Отключить сохранение паролей в Google Chrome

Переключение веток в Git и на GitHub
GIT

Переключение веток в Git и на GitHub