Цель урока: Освоить инструмент Docker Compose. Мы научимся описывать архитектуру сложного проекта в одном файле, использовать переменные окружения для защиты паролей и настраивать автоматическую проверку здоровья сервисов.

Мы работаем от root.

Часть 1: Что такое Docker Compose?

В прошлом уроке мы запускали контейнер одной длинной командой.
Но реальный проект - это не один контейнер. Это связка: Сайт + База данных + Кэш + Бэкапы.
Запускать их вручную, следить, чтобы База запустилась раньше Сайта, прописывать сети - это мучение.

Docker Compose - это "дирижер". Вы пишете ноты (файл конфигурации), а он управляет оркестром.

Мы создадим профессиональную конфигурацию для WordPress с современной базой MariaDB.

Часть 2: Подготовка окружения

Хороший тон - хранить настройки в отдельном файле, а не "зашивать" пароли в код.

Шаг 1: Создаем папку проекта

mkdir -p /root/my_blog
cd /root/my_blog

Шаг 2: Создаем файл с секретами (.env)
Файл .env - это стандарт индустрии для хранения переменных (паролей, версий, настроек). Docker Compose автоматически прочитает его при запуске.

nano .env

Вставьте туда эти настройки:

# Пароли и пользователи
MYSQL_ROOT_PASSWORD=supersecretpass
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress_pass

# Версии образов (чтобы ничего не сломалось при обновлении)
WP_VERSION=6.5-php8.2-apache
DB_VERSION=10.11

Сохраните (Ctrl+OEnter) и выйдите (Ctrl+X).

Часть 3: Пишем конфигурацию (docker-compose.yml)

Теперь создаем главный файл. Мы будем использовать не latest версии (которые могут внезапно обновиться и всё сломать), а конкретные стабильные версии.

Также мы добавим Healthchecks (Проверку здоровья). Это решит вечную проблему новичков: "Сайт запустился, а база еще нет, и WordPress выдал ошибку подключения".

nano docker-compose.yml

Вставьте этот код (следите за отступами!):

version: '3.8'

# 1. Создаем свою сеть для проекта
networks:
  wp_net:

# 2. Объявляем тома (где будут жить данные)
volumes:
  db_data:
  wp_data:

services:
  # --- СЕРВИС БАЗЫ ДАННЫХ (MariaDB) ---
  db:
    image: mariadb:${DB_VERSION}  # Берем версию из .env
    restart: always
    # Включаем полную поддержку UTF-8 (для эмодзи и кириллицы)
    command: ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
    networks: [wp_net]
    # Проверка здоровья: Docker будет пинговать базу каждые 10 сек
    healthcheck:
      test: ["CMD-SHELL", "mysqladmin ping -h localhost -p${MYSQL_ROOT_PASSWORD} || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 10

  # --- СЕРВИС САЙТА (WordPress) ---
  wordpress:
    image: wordpress:${WP_VERSION}
    # Самое важное: ждем, пока база станет "Healthy" (полностью готова)
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "8080:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
    volumes:
      - wp_data:/var/www/html
    networks: [wp_net]
    healthcheck:
      test: ["CMD-SHELL", "curl -fsS http://localhost/ || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 10

Что здесь крутого (Разбор):

  1. Image Versions: Мы используем переменные ${DB_VERSION}. Это гарантирует, что завтра Docker не скачает новую версию базы, которая несовместима с вашим сайтом.

  2. Depends_on (condition): WordPress даже не попытается запуститься, пока MariaDB не отрапортует: "Я готова принимать подключения!". Это спасает от ошибок старта.

  3. UTF-8: Мы принудительно задали кодировку, чтобы не было проблем с русским языком и спецсимволами.

Часть 4: Запуск и проверка

Перед запуском убедитесь, что порт 8080 свободен:

ss -tulpn | grep :8080

(Если пусто - отлично. Если занят - поменяйте 8080 в файле на другой, например 8090).

Запускаем проект:

docker compose up -d

Что происходит сейчас:

  1. Docker создает сеть my_blog_wp_net.

  2. Скачивает образы.

  3. Запускает базу данных db.

  4. Ждет! Вы можете проверить статус командой docker compose ps. Вы увидите, что у базы статус starting (или healthy), а WordPress пока ждет.

  5. Как только база готова, стартует WordPress.

Проверка:

docker compose ps

Дождитесь, пока в колонке STATUS у обоих сервисов будет написано healthy.

Теперь откройте браузер: http://ВАШ_IP_АДРЕС:8080.
Вы увидите установщик WordPress. Все данные для подключения к базе он уже подхватил сам!

Часть 5: Устранение неполадок (Troubleshooting)

Даже идеальный конфиг может не сработать. Как искать проблемы?

1. Смотрим логи
Если сайт не открывается, первое действие:

docker compose logs -f

(Нажмите Ctrl+C для выхода).
Здесь вы увидите, например, "Access denied", если напутали с паролями в .env.

2. Конфликт имен
Если Docker пишет, что контейнер с таким именем уже есть, удалите старые хвосты:

docker rm -f my_blog-db-1 my_blog-wordpress-1 || true

3. Полный сброс (Осторожно!)
Если вы запутались и хотите начать с чистого листа (с удалением всей базы данных!):

docker compose down -v

Флаг -v удаляет тома (volumes). После этого up -d создаст чистую базу.

Часть 6: Вариант для разработчика (Bind Mount)

В конфиге выше файлы WordPress лежат внутри тома wp_data. Это надежно, но неудобно, если вы хотите править код (index.php, темы) прямо на сервере.

Если вы хотите видеть файлы сайта в папке /root/my_blog/html, измените секцию volumes у WordPress в docker-compose.yml на такую:

volumes:
      - ./html:/var/www/html

(Создайте папку mkdir html перед запуском. При первом старте WordPress наполнит её своими файлами).

Поздравляю! Вы закончили блок по автоматизации.
Вы прошли путь от ручного копирования файлов (cp) до написания Infrastructure as Code (Docker Compose).

Что вы теперь умеете:

  1. Git: Версионировать конфиги.

  2. Ansible: Управлять серверами удаленно.

  3. Docker: Упаковывать приложения.

  4. Docker Compose: Разворачивать сложные, отказоустойчивые системы одной командой.

Что дальше?
В Уроке 65 мы научимся разбирать нагрузку системы. Load Average и стресс-тестирование

Перейти к просмотру - УРОК №65.

подарок Промо-код: PROMO15 - скидка 15%! огонь

Введите при оформлении первого заказа на сайте: Hosting-VDS.com

авторское право цифровые решения

Помог ли вам данный ответ? 0 Пользователи считают это полезным (1 голосов)