Установка MariaDB/MySQL в изолированном контейнере
Установка 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 + O → Enter → Ctrl + 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 на том же сервере), отключите проброс порта:
- В файле
docker-compose.ymlзакомментируйте строку сports:# ports: # - "3306:3306" - Перезапустите контейнер:
docker-compose down && docker-compose up -d - Теперь подключаться к базе можно только из других контейнеров в той же сети (например, из контейнера с 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
Применяем конфиг:
- Перезапускаем контейнер:
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
- Останавливаем контейнер:
docker-compose down - Обновляем образ в
docker-compose.yml(например, наmariadb:11.0). - Запускаем заново:
docker-compose up -dDocker автоматически подтянет новую версию.
Практика для закрепления
Упражнение 1: Базовая настройка
- Создайте контейнер с MariaDB, используя свой пароль и имя базы данных.
- Подключитесь к базе и создайте таблицу
usersс полямиid,username,email. - Добавьте в таблицу 3 запись.
Упражнение 2: Безопасность
- Закройте внешний доступ к порту
3306(уберите проброс вdocker-compose.yml). - Создайте нового пользователя с доступом только к базе
arbitrage_dbи правамиSELECT, INSERT, UPDATE. - Проверьте, что этот пользователь не может удалить базу.
Упражнение 3: Оптимизация
- Добавьте в
my.cnfнастройки для увеличенияinnodb_buffer_pool_sizeдо 50% от доступной ОЗУ. - Включите логирование медленных запросов (
slow_query_log). - Сгенерируйте нагрузку (например, массовой вставкой данных) и проверьте логи на наличие медленных запросов.
Упражнение 4: Резервное копирование
- Настройте автоматический бэкап раз в 12 часов.
- Восстановите данные из бэкапа в новую базу
arbitrage_db_restore.
Упражнение 5: Изоляция
- Создайте второй контейнер с Nginx + PHP.
- Настройте подключение PHP к MariaDB без проброса портов (используя внутреннюю сеть Docker).
- Создайте простой PHP-скрипт, который выводит данные из таблицы
users.
Чек-лист перед запуском в продакшен
✅ Контейнер работает в изолированной сети.
✅ Внешний доступ к порту 3306 закрыт (или ограничен по IP).
✅ Пароли сложные (не менее 12 символов, с цифрами и спецсимволами).
✅ Настроены автомаческие бэкапы.
✅ Оптимизированы настройки my.cnf под нагрузку.
✅ Логи мониторятся (например, через docker logs -f mariadb_secure).
Поздравляю! Теперь ваша база данных надёжно изолирована, оптимизирована и готова к боевым нагрузкам. 🚀
Если остались вопросы — задавайте в комментариях. В следующем уроке разберём репликацию MariaDB для отказоустойчивости.
Генератор паролей с длинной 64 символа
Женская одежда с бахромой
Кадастровые работы в Бийске
Как Aptum хостинг помогает малым бизнесам в управлении CRM-системами
Как выбрать планировку сайта для блогов на DreamHost
Как выбрать Vdsina вечный хостинг для своего проекта
Казань окна VEKA - профессионализм и опыт
Курьерская вода
Новостройки Оренбурга: недвижимость с отличной ценой
Онлайн чат-партнерство
Пиломатериалы для возведения бани
Почему VDSina — лучший выбор хостинга
Секреты Вконтакте: тонкости и хитрости
Скидки до 50% на тур в Коста-Рике
Видеочат рулетка бесплатно