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

Быстрые ссылки
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_passSeed-файлы при первом запуске
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 с репликацией и бэкапами.
- Для систем с жёсткими требованиями к производительности и латентности иногда предпочтительнее «голая» установка на отдельном сервере с оптимизациями на уровне ОС и дисков.
Мини-методология: шаги для безопасного развёртывания в проекте
- Запланируйте том для хранения данных и резервного копирования.
- Определите переменные окружения: root-пароль, имя базы, user/password.
- Напишите seed-файлы и поместите их в
/docker-entrypoint-initdb.d. - Создайте docker-compose.yml с пробросом портов и определением сети.
- Протестируйте локально, затем добавьте в CI с безопасным хранением секретов.
- Настройте мониторинг и бэкапы (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 перед продакшеном.
Важно: для критичных продакшен-сценарииев рассмотрите управляемые сервисы БД или архитектуры с репликацией и высокой доступностью.
Похожие материалы
Настройка TCP/IP в Windows
Код-пароль Kindle: установка, изменение и сброс
Установить Dolby Atmos в Windows 11
Windows Media Encoder на Windows 10 — установка и альтернативы
Отключить сохранение паролей в Google Chrome