Як розгорнути 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 ГБ RAM
- Щонайменше 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