Як розгорнути MySQL/MariaDB у Docker із постійним зберіганням даних | INTROSERV
EUR
european

EUR

usa

USD

Ukraine Ua
Ex. VAT Ex. VAT 0%

Як розгорнути 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

Tip

Якщо у вас не встановлено 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

Цей каталог зберігатиме файли бази даних поза контейнером.

Info

Без постійного зберігання всі дані бази буде втрачено після видалення контейнера.

Крок 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

Info

Важливо: Ніколи не зберігайте реальні паролі у системі контролю версій. У продакшені використовуйте змінні середовища або файл .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

Info

Важливо: Не відкривайте порт 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

Щоб видалити постійні дані:

Info

Важливо: Це назавжди видалить усі дані бази даних.

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

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA