EUR
european

EUR

usa

USD

Russian Ru
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 ГБ ОЗУ
  • Не менее 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