Установка MariaDB/MySQL в изолированном контейнере
Дата публикации: 24.04.2026

Установка MariaDB/MySQL в изолированном контейнере

ccb9a536


Установка MariaDB/MySQL в изолированном контейнере: Полное руководство для веб-мастера и арбитражника

Вы когда-нибудь представляли свою базу данных как банковский сейф? Если нет — пора начать. В мире веб-разработки и арбитража трафика база данных — это самое уязвимое место: её взлом может обернуться крахом проекта, утечкой данных клиентов или банами аккаунтов. А теперь представьте, что этот сейф стоит не в отдельной комнате с охраной, а прямо посреди офиса, где каждый может до него дотронуться.

Решение? Поместить базу данных в изолированный контейнер — как будто перенести сейф в отдельное помещение с собственными правилами доступа. В этом уроке вы научитесь: ✅ Устанавливать MariaDB/MySQL в Docker-контейнере (самый безопасный и гибкий способ). ✅ Настраивать изоляцию от других сервисов (чтобы взлом одного не повлёк за собой крах всего сервера). ✅ Оптимизировать производительность и безопасность для высоконагруженных проектов (арбитраж, парсинг, веб-приложения).


Почему контейнер, а не "голый" сервер?

Подход Плюсы Минусы
Установка на хост Простота (одна команда apt install). Риск конфликтов с другими сервисами, сложно обновлять, уязвимости системы влияют на БД.
Виртуальная машина Полная изоляция. Тяжёлая (расходует много ресурсов), медленнее запускается.
Docker-контейнер Лёгкий, быстрый, изолированный, просто обновляется, портативный. Требует базовых знаний Docker (но мы это исправим!).

Аналогия:

  • Голый сервер = все программы живут в одной комнате. Если одна заболеет, заразятся все.
  • Виртуальная машина = отдельная квартира, но сдаётся вместе с домом (тяжёлая и дорогая).
  • Docker-контейнер = отдельная комната с собственными правилами, но в том же доме. Лёгкая, дешёвая, безопасная.

Шаг 1: Подготовка сервера к работе с Docker

Прежде чем ставить базу данных, нужно убедиться, что на сервере установлен Docker и Docker Compose (инструмент для управления контейнерами).

1.1 Установка Docker (если ещё не установлен)

Откройте терминал и выполните команды:

# Обновляем пакеты и устанавливаем зависимости
sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

# Добавляем официальный репозиторий Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Устанавливаем Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

# Проверяем установку
sudo docker --version

Что должно вывестись: Docker version 24.0.7, build afdd53b (или более новая версия).

1.2 Установка Docker Compose

# Скачиваем последнюю версию
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# Даём права на выполнение
sudo chmod +x /usr/local/bin/docker-compose

# Проверяем
docker-compose --version

Ожидаемый вывод: docker-compose version 2.23.0 (или новее).


Шаг 2: Создание изолированного контейнера для MariaDB/MySQL

Теперь переходим к главному — развёртыванию базы данных в контейнере.

2.1 Почему MariaDB, а не MySQL?

Критерий MySQL (Oracle) MariaDB (Community)
Лицензия Proprietary (платная для бизнеса) Open Source (полностью бесплатна)
Производительность Хорошая Лучше (оптимизирована для SSD, меньше накладных расходов)
Безопасность Обновления медленные Быстрые патчи уязвимостей
Совместимость Стандарт Полная совместимость с MySQL

Вывод: Для арбитражника и веб-мастера MariaDB — лучший выбор.

2.2 Создаём файл конфигурации docker-compose.yml

Этот файл описывает, как будет работать наш контейнер.

# Создаём папку для проекта
mkdir ~/mariadb_container && cd ~/mariadb_container

# Создаём файл конфигурации
nano docker-compose.yml

Вставляем следующий код (с пояснениями):

version: '3.8'  # Версия синтаксиса Docker Compose

services:
  mariadb:  # Название нашего сервиса (контейнера)
    image: mariadb:10.11  # Официальный образ MariaDB версии 10.11 (актуальная на 2024 год)
    container_name: mariadb_secure  # Имя контейнера (удобно для управления)
    restart: unless-stopped  # Автоматически перезапускать при сбое
    environment:  # Переменные окружения (настройки БД)
      MYSQL_ROOT_PASSWORD: "ВашСложныйПароль123!"  # Пароль root-пользователя (ЗАМЕНИТЕ!)
      MYSQL_DATABASE: "arbitrage_db"  # Создаём базу данных по умолчанию
      MYSQL_USER: "webmaster"  # Дополнительный пользователь (не root!)
      MYSQL_PASSWORD: "ДругойСложныйПароль456!"  # Пароль для пользователя
    volumes:  # Привязываем папки для хранения данных снаружи контейнера
      - ./mariadb_data:/var/lib/mysql  # Здесь будут лежать все данные БД
      - ./mariadb_config:/etc/mysql/conf.d  # Здесь можно положить кастомные конфиги
    ports:  # Пробрасываем порт наружу (только если нужно подключаться с хоста!)
      - "3306:3306"  # ВНИМАНИЕ! В продакшене лучше закрыть внешний доступ (см. шаг 3.3)
    networks:  # Создаём изолированную сеть (для безопасности)
      - mariadb_net

networks:  # Определяем сеть
  mariadb_net:
    driver: bridge  # Тип сети (мост)
    ipam:  # Настраиваем подсеть (для дополнительной изоляции)
      config:
        - subnet: 172.20.0.0/24

Сохраняем файл: Ctrl + OEnterCtrl + X.

2.3 Запускаем контейнер

docker-compose up -d  # Флаг -d означает "в фоновом режиме"

Проверяем, что контейнер работает:

docker ps

Ожидаемый вывод:

CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                    NAMES
a1b2c3d4e5f6   mariadb:10.11 "mariadbd --innodb-u…"   2 minutes ago   Up 2 minutes   0.0.0.0:3306->3306/tcp   mariadb_secure

Шаг 3: Настройка безопасности и оптимизация

3.1 Подключаемся к базе данных

docker exec -it mariadb_secure mysql -u root -p

Вводим пароль (тот, что указали в MYSQL_ROOT_PASSWORD).

Проверяем созданную базу и пользователя:

SHOW DATABASES;  -- Должна быть "arbitrage_db"
SELECT User, Host FROM mysql.user;  -- Должен быть пользователь "webmaster"

3.2 Базовые настройки безопасности

Выполните эти команды внутри MySQL (после подключения):

-- Удаляем анонимных пользователей
DELETE FROM mysql.user WHERE User='';

-- Запрещаем root-подключение извне (только из контейнера)
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1');

-- Удаляем тестовую базу
DROP DATABASE IF EXISTS test;

-- Применяем изменения
FLUSH PRIVILEGES;

3.3 Закрываем внешний доступ (критически важно!)

По умолчанию порт 3306 проброшен наружу — это опасно. Если база нужна только для локальных сервисов (например, PHP на том же сервере), отключите проброс порта:

  1. В файле docker-compose.yml закомментируйте строку с ports:
    # ports:
    #   - "3306:3306"
  2. Перезапустите контейнер:
    docker-compose down && docker-compose up -d
  3. Теперь подключаться к базе можно только из других контейнеров в той же сети (например, из контейнера с PHP).

Как подключиться из другого контейнера? Используйте имя сервиса (mariadb) как хост:

// Пример подключения из PHP (в другом контейнере)
$pdo = new PDO('mysql:host=mariadb;dbname=arbitrage_db', 'webmaster', 'ДругойСложныйПароль456!');

3.4 Оптимизация производительности

Для высоконагруженных проектов (арбитраж, парсинг) добавьте кастомный конфиг в ./mariadb_config/my.cnf:

[mysqld]
# Буферы и кэш (увеличьте значения для серверов с 4+ ГБ ОЗУ)
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2  # Уменьшает нагрузку на диск (но риск потери данных при крахе)

# Настройки для высокой нагрузки
max_connections = 200
wait_timeout = 300
interactive_timeout = 300

# Логирование медленных запросов (для отладки)
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 2

Применяем конфиг:

  1. Перезапускаем контейнер:
    docker-compose restart

Шаг 4: Резервное копирование и восстановление

4.1 Автоматическое резервирование

Добавьте в docker-compose.yml сервис для бэкапов:

services:
  # ... (предыдущие настройки mariadb)

  mariadb_backup:
    image: mariadb:10.11
    container_name: mariadb_backup
    depends_on:
      - mariadb
    volumes:
      - ./mariadb_backup:/backup  # Папка для бэкапов
    command: >
      sh -c 'while true; do
        mysqldump -h mariadb -u root -p"$$MYSQL_ROOT_PASSWORD" --all-databases | gzip > /backup/backup_$$(date +%Y-%m-%d_%H-%M-%S).sql.gz
        sleep 86400  # Бэкап раз в день
      done'
    environment:
      MYSQL_ROOT_PASSWORD: "ВашСложныйПароль123!"  # Тот же пароль, что и в mariadb
    networks:
      - mariadb_net

Запускаем:

docker-compose up -d

Теперь в папке ./mariadb_backup будут появляться архивы с дампом базы.

4.2 Восстановление из бэкапа

# Разархивируем дамп
gunzip < backup_2024-01-01_12-00-00.sql.gz | docker exec -i mariadb_secure mysql -u root -p"ВашСложныйПароль123!"

Шаг 5: Мониторинг и обновление

5.1 Просмотр логов

docker logs mariadb_secure  # Логи контейнера
docker logs mariadb_backup  # Логи бэкапа

5.2 Обновление MariaDB

  1. Останавливаем контейнер:
    docker-compose down
  2. Обновляем образ в docker-compose.yml (например, на mariadb:11.0).
  3. Запускаем заново:
    docker-compose up -d

    Docker автоматически подтянет новую версию.


Практика для закрепления

Упражнение 1: Базовая настройка

  1. Создайте контейнер с MariaDB, используя свой пароль и имя базы данных.
  2. Подключитесь к базе и создайте таблицу users с полями id, username, email.
  3. Добавьте в таблицу 3 запись.

Упражнение 2: Безопасность

  1. Закройте внешний доступ к порту 3306 (уберите проброс в docker-compose.yml).
  2. Создайте нового пользователя с доступом только к базе arbitrage_db и правами SELECT, INSERT, UPDATE.
  3. Проверьте, что этот пользователь не может удалить базу.

Упражнение 3: Оптимизация

  1. Добавьте в my.cnf настройки для увеличения innodb_buffer_pool_size до 50% от доступной ОЗУ.
  2. Включите логирование медленных запросов (slow_query_log).
  3. Сгенерируйте нагрузку (например, массовой вставкой данных) и проверьте логи на наличие медленных запросов.

Упражнение 4: Резервное копирование

  1. Настройте автоматический бэкап раз в 12 часов.
  2. Восстановите данные из бэкапа в новую базу arbitrage_db_restore.

Упражнение 5: Изоляция

  1. Создайте второй контейнер с Nginx + PHP.
  2. Настройте подключение PHP к MariaDB без проброса портов (используя внутреннюю сеть Docker).
  3. Создайте простой PHP-скрипт, который выводит данные из таблицы users.

Чек-лист перед запуском в продакшен

✅ Контейнер работает в изолированной сети. ✅ Внешний доступ к порту 3306 закрыт (или ограничен по IP). ✅ Пароли сложные (не менее 12 символов, с цифрами и спецсимволами). ✅ Настроены автомаческие бэкапы. ✅ Оптимизированы настройки my.cnf под нагрузку. ✅ Логи мониторятся (например, через docker logs -f mariadb_secure).


Поздравляю! Теперь ваша база данных надёжно изолирована, оптимизирована и готова к боевым нагрузкам. 🚀

Если остались вопросы — задавайте в комментариях. В следующем уроке разберём репликацию MariaDB для отказоустойчивости.


Генератор паролей с длинной 64 символа
Женская одежда с бахромой
Кадастровые работы в Бийске
Как Aptum хостинг помогает малым бизнесам в управлении CRM-системами
Как выбрать планировку сайта для блогов на DreamHost
Как выбрать Vdsina вечный хостинг для своего проекта
Казань окна VEKA - профессионализм и опыт
Курьерская вода
Новостройки Оренбурга: недвижимость с отличной ценой
Онлайн чат-партнерство
Пиломатериалы для возведения бани
Почему VDSina — лучший выбор хостинга
Секреты Вконтакте: тонкости и хитрости
Скидки до 50% на тур в Коста-Рике
Видеочат рулетка бесплатно
рейтинг хостингов 2026 Быстрые VDS серверы