Как развернуть MySQL/MariaDB в Docker с постоянным хранением данных
Введение
В этом руководстве вы развернете контейнер базы данных MySQL или MariaDB с использованием Docker и постоянного хранения данных. Запуск баз данных в контейнерах упрощает развертывание, управление версиями и переносимость между средами. К концу этого руководства у вас будет готовый к продакшену экземпляр MySQL или MariaDB, работающий в Docker, с данными, безопасно хранящимися вне контейнера.
Требования
Целевая аудитория: Системные администраторы среднего уровня
Примерное время выполнения: ~30–45 минут
Операционная система
- Ubuntu 24.04 LTS (протестировано)
- Также совместимо с: Ubuntu 22.04 LTS, Debian 12 / 13
Требования к программному обеспечению
- Docker 24.0.6 или новее
- Docker Compose v2 (входит в современные версии Docker)
Проверьте версию Docker:
docker --version
Ожидаемый вывод: Docker version 24.0.6, build ed223bc
Проверьте версию Docker Compose:
docker compose version
Ожидаемый вывод: Docker Compose version v5.1.0
Если у вас не установлен Docker, вы установите его на шаге 1.
Аппаратные требования
- Минимум 2 ГБ ОЗУ
- Не менее 10 ГБ свободного дискового пространства
Сетевые требования
- Порт 3306 свободен (порт по умолчанию для MySQL/MariaDB)
- Межсетевой экран настроен для разрешения доступа только при необходимости внешних подключений
Права доступа
- Пользователь без прав root с возможностью использования
sudo - Пользователь добавлен в группу
docker(рекомендуется)
Предполагаемые знания
- Базовые понятия Docker (образы, контейнеры, тома)
- Уверенная работа в командной строке
Шаг 1: Установите и проверьте Docker
Если Docker не установлен, установите его:
sudo apt update && sudo apt upgrade -y && sudo apt install curl
curl -sSL https://get.docker.com/ | CHANNEL=stable bash
sudo apt install docker-ce docker-compose-plugin -y
Запустите и добавьте в автозапуск Docker:
sudo systemctl enable docker
sudo systemctl start docker
Проверьте, что Docker запущен:
sudo systemctl status docker
Ожидаемый результат: Статус службы Docker отображается как active (running).
Добавьте пользователя в группу docker, чтобы не использовать sudo при работе с Docker:
sudo usermod -aG docker <YOUR_USERNAME>
newgrp docker
Шаг 2: Создайте каталог для постоянного хранения данных
Функция bind mount монтирует каталог из хост-системы в контейнер, делая его доступным внутри файловой системы контейнера.
Создайте каталог для данных базы и установите корректные права:
mkdir -p ~/mysql-docker/data
chmod 750 ~/mysql-docker/data
Этот каталог будет хранить файлы базы данных вне контейнера.
Без постоянного хранения все данные базы будут потеряны при удалении контейнера.
Шаг 3: Создайте конфигурацию Docker Compose
Перейдите в каталог проекта:
cd ~/mysql-docker
Создайте файл docker-compose.yml:
nano docker-compose.yml
Добавьте следующую конфигурацию (пример для MySQL):
services: mysql: image: mysql:8.0.36 container_name: mysql-server restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: <YOUR_STRONG_ROOT_PASSWORD> MYSQL_DATABASE: appdb MYSQL_USER: appuser MYSQL_PASSWORD: <YOUR_STRONG_USER_PASSWORD> ports: - "3306:3306" volumes: - ./data:/var/lib/mysql
Альтернатива с MariaDB — если вы предпочитаете MariaDB, используйте:
services: mariadb: image: mariadb:11.3 container_name: mariadb-server restart: unless-stopped environment: MARIADB_ROOT_PASSWORD: <YOUR_STRONG_ROOT_PASSWORD> MARIADB_DATABASE: appdb MARIADB_USER: appuser MARIADB_PASSWORD: <YOUR_STRONG_USER_PASSWORD> ports: - "3306:3306" volumes: - ./data:/var/lib/mysql
Важно: Никогда не храните реальные пароли в системе контроля версий. В продакшене используйте переменные окружения или файл .env. Замените <YOUR_STRONG_USER_PASSWORD> и <YOUR_STRONG_ROOT_PASSWORD> своими стойкими паролями.
Шаг 4: Запустите контейнер базы данных
Выполните:
docker compose up -d
Ожидаемый вывод:
- Docker загружает образ (если он еще не скачан)
- Контейнер запускается в фоновом режиме
Проверьте статус контейнера:
docker ps
Ожидаемый вывод:
CONTAINER ID IMAGE STATUS PORTS abc123def456 mysql:8.0.36 Up 10 seconds 0.0.0.0:3306->3306/tcp
Шаг 5: Проверьте работоспособность базы данных
Подключитесь к контейнеру
Для контейнера MySQL выполните:
docker exec -it mysql-server mysql -u root -p
Для контейнера MariaDB выполните:
docker exec -it mariadb-server mysql -u root -p
Введите пароль root.
Ожидаемый результат: Появляется приглашение MySQL: mysql>
Проверьте базы данных
SHOW DATABASES;
Вы должны увидеть:
- appdb
- information_schema
- mysql
- performance_schema
- sys
EXIT;
Проверьте сохранность данных
Создайте тестовую таблицу
docker exec -it mysql-server mysql -u root -p
Внутри оболочки MySQL выполните команды:
USE appdb;
CREATE TABLE test_table (id INT PRIMARY KEY);
EXIT;
Остановите и удалите контейнер
docker compose down
Запустите контейнер снова
docker compose up -d
Убедитесь, что таблица существует
docker exec -it mysql-server mysql -u root -p
Внутри оболочки MySQL выполните команды:
USE appdb;
SHOW TABLES;
Ожидаемый результат: Отображается test_table. Это подтверждает, что постоянное хранение данных работает корректно.
Шаг 6: Обеспечьте безопасность развертывания
Ограничьте внешний доступ
Если доступ к базе требуется только локально, измените настройку портов в docker-compose.yml:
ports: - "127.0.0.1:3306:3306"
Перезапустите контейнер:
docker compose down
docker compose up -d
Важно: Не открывайте порт 3306 публично без крайней необходимости.
Используйте файл .env
Создайте файл .env:
nano .env
Пример:
MYSQL_ROOT_PASSWORD=<YOUR_STRONG_ROOT_PASSWORD> MYSQL_PASSWORD=<YOUR_STRONG_USER_PASSWORD>
Укажите их в docker-compose.yml:
environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_PASSWORD: ${MYSQL_PASSWORD}
Проверка
Вы можете убедиться, что все работает корректно, следующим образом:
- Выполните
docker ps— контейнер находится в состоянии Up - Подключитесь через MySQL CLI — вход выполняется успешно
- Перезапустите контейнер — данные сохраняются
- Проверьте логи:
docker logs mysql-server
Ожидаемая запись в логах: "ready for connections".
Откат изменений
Чтобы остановить и удалить контейнер:
docker compose down
Чтобы удалить постоянные данные:
Важно: Это действие безвозвратно удалит все данные базы.
rm -rf ~/mysql-docker/data
Чтобы удалить Docker:
sudo apt remove docker-ce docker-compose-plugin -y
Устранение неполадок
Контейнер не запускается
Проверьте логи:
docker logs mysql-server
Возможные причины:
- Слишком слабый пароль отклонен
- Порт 3306 уже используется
Проверьте использование порта:
sudo ss -tulnp | grep 3306
Ошибки прав доступа
Если возникает ошибка permission denied:
sudo chown -R 999:999 ~/mysql-docker/data
999 — это распространенный идентификатор пользователя MySQL внутри контейнера.
Заключение и дальнейшие шаги
Вы успешно развернули MySQL или MariaDB в Docker с постоянным хранением данных. База данных работает в изолированном контейнере и безопасно сохраняет данные на хост-системе.
Дальнейшие шаги:
- Настройте автоматическое резервное копирование
- Реализуйте репликацию для высокой доступности
- Интегрируйте с контейнерами приложений
- Добавьте мониторинг с помощью Prometheus и Grafana