Установка 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 для отказоустойчивости.


Регистрация на 🏰 VDSina без номера телефона (через почту)
Как не попасть на деньги при посуточной оплате (баланс и блокировки)
Обзор панели управления: где что лежит
Выбор тарифа: на что влияют vCPU, RAM и SSD
Разница между VDS и обычным хостингом (на пальцах)
Как выбрать операционную систему для новичка: Ubuntu vs Debian vs AlmaLinux
Установка сервера в один клик: кнопка «Создать»
Что такое root-пароль и где его сохранить
Первый вход по SSH через командную строку Windows
Первый вход по SSH через PuTTY (простая инструкция)
Первый вход по SSH через Termius (для телефона и ПК)
Как обновить пароль root в панеле VDSina
Базовые команды Linux: ls, cd, sudo, apt update
Как проверить, сколько ресурсов жрет ваш сервер (htop, free -h)
Установка панели управления сервером (ISPmanager) за 5 минут
Установка бесплатной панели FastPanel от 🏰 VDSina (родная)
Установка панели HestiaCP (бесплатно и просто)
Настройка файрвола (UFW) чтобы не взломали в первый же час
Как открыть порты 80 и 443 для сайта
Установка LAMP (Linux, Apache, MySQL, PHP) одной командой
Установка LEMP (Nginx вместо Apache) одной командой
Как забросить сайт на WordPress через панель 🏰 VDSina (готовый шаблон)
Ручная установка WordPress на чистый сервер
Создание базы данных MySQL для сайта через командную строку
Как привязать домен к серверу (настройка A-записи)
Выпуск бесплатного SSL-сертификата от Let's Encrypt
Настройка cron (заданий по расписанию) на VDSina
Автоматическое резервное копирование (бэкапы) в панеле VDSina
Как восстановить сервер из бэкапа за 2 минуты
Настройка VPN на 🏰 VDSina (OpenVPN) для новичка
Настройка WireGuard на 🏰 VDSina (быстрее и проще)
Как проверить, не заблокирован ли ваш IP в РФ
Смена IP-адреса сервера в панеле 🏰 VDSina (если заблокировали)
Как привязать свой ISO-образ для установки Windows Server
Установка бота для Telegram на Python на VDSina
Как запустить бота в фоне (screen и systemd для чайников)
Мониторинг сервера через встроенные графики VDSina
Как не переплатить: выключение сервера при простое (посуточная оплата)
Повышение тарифа без перезагрузки сервера (горячий апгрейд)
Как настроить уведомления о падении сервера в Telegram
Безопасность: запрет входа под root через SSH
Создание нового пользователя с правами sudo
Защита от DDoS (включение защиты в панеле VDSina)
Подключение сетевых дисков (блочные устройства) для дополнительного места
Миграция сайта с другого хостинга на 🏰 VDSina (пошагово)
Как удалить сервер и не забыть отключить оплату
Где брать помощь: техподдержка VDSina, чаты и форумы
Бонус: установка игрового сервера Minecraft (для друзей)
Бесплатный курс: "VDSina для чайников: Сервер за 5 минут: Эффективно и быстро"
Бесплатный виджет обратной связи для JavaScript
Чатрулетка: новый способ общения
Что такое видеочат рулетка и зачем
Фототехника для пейзажей
Как выбрать лучший render хостинг для 3D рендеров с Eevee
Логистика с Excel: бесплатный курс учёта остатков и подбора транспорта
Онлайн генератор паролей для Windows
Онлайн Сплетница субтитры
Оптимизация обработки форм GEO проекта
Пасхалки в сериале Dexter: раскрытие тайн
Погода в Ревде вечером
Родительский портал Воронеж
Роллы, которые не требуют рекламы
SEO-принципы для нейросетевых разработчиков
Собери 10 пакетов перцев с теплицы
Создание мемов без фотошопа: простые приемы
Сравнение Arsys хостинг сервисов для блогеров с WordPress на 2023 год
VDSina для новичков: советы для начала
Весь экран под циферблат
Видеочат с минимальной задержкой
Виртуальная девушка ИИ
Вложения в компании
Введение в нейросети бесплатно
рейтинг хостингов 2026 Быстрые VDS серверы