Подробная инструкция по написанию YAML‑файлов для Docker Compose

Оцените статью

Так как на севере делать абсолютно нечего, то я продолжаю заниматься саморазвитием 🙂 На этой неделе вспоминаю и углубляю свои знания в Docker. Лучший способ запомнить тему, это вести конспект и это я еще в институте понял. Так, что держите мою шпаргалку по YAML для Docker Compose.

Основы синтаксиса YAML

YAML (YAML Ain’t Markup Language) — формат сериализации данных, читаемый человеком. Ключевые правила:

  • Отступы определяют структуру (используйте пробелы, не табуляции).
  • Ключи и значения разделяются двоеточием (key: value).
  • Списки задаются через дефис (- item).
  • Комментарии начинаются с #.
  • Строки могут быть без кавычек; если нужны спецсимволы или пробелы — используйте кавычки («string» или ‘string’).

Пример базового синтаксиса:

version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    environment:
      - ENV_VAR=value

Структура файла docker-compose.yml

Стандартный файл Docker Compose включает:

  • version — версия схемы Compose (рекомендуется ‘3.8’).
  • services — список контейнеров (сервисов).
  • networks — сетевые конфигурации.
  • volumes — тома для хранения данных.
  • configs — конфигурации (для Swarm).
  • secrets — секреты (для Swarm).

Основные секции и их параметры

services

Каждый сервис — отдельный контейнер. Основные параметры:

  • image — образ из Docker Hub или локальный.
  • build — путь к Dockerfile для сборки образа.
  • container_name — имя контейнера.
  • ports — проброс портов («host:container»).
  • environment — переменные окружения.
  • volumes — монтирование томов.
  • depends_on — зависимость от других сервисов.
  • networks — подключение к сетям.
  • command — переопределение команды запуска.
  • restart — политика перезапуска (no, always, on-failure и т. д.).

volumes

Объявляет тома для хранения данных:

  • именованные тома (db_data:);
  • монтирование хостовых директорий (./data:/var/lib/mysql).

networks

Создаёт пользовательские сети:

  • driver — тип сети (bridge, overlay и т. д.);
  • external — использование существующей сети.

Пошаговый пример: веб‑приложение с БД

Создадим приложение с Nginx, PHP‑FPM и MySQL.

Создайте структуру проекта:

# mkdir myapp && cd myapp
# mkdir nginx php mysql

Напишите docker-compose.yml:

version: '3.8'

services:
  nginx:
    image: nginx:alpine
    container_name: myapp_nginx
    ports:
      - "8080:80"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./php/www:/var/www/html
    depends_on:
      - php
    networks:
      - app-network

  php:
    build: ./php
    container_name: myapp_php
    volumes:
      - ./php/www:/var/www/html
    environment:
      - DB_HOST=mysql
      - DB_NAME=myapp
      - DB_USER=root
      - DB_PASS=secret
    networks:
      - app-network

  mysql:
    image: mysql:8.0
    container_name: myapp_mysql
    environment:
      - MYSQL_ROOT_PASSWORD=secret
      - MYSQL_DATABASE=myapp
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - app-network
    restart: unless-stopped

volumes:
  db_data:

networks:
  app-network:
    driver: bridge

Настройте Nginx (nginx/conf.d/default.conf):

server {
    listen 80;
    root /var/www/html;
    index index.php index.html;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Создайте Dockerfile для PHP (php/Dockerfile):

FROM php:8.1-fpm
RUN docker-php-ext-install pdo_mysql

Добавьте тестовый файл (php/www/index.php):

<?php
phpinfo();
?>

Полезные приёмы и примеры

Переменные окружения

Используйте .env‑файл:

DB_PASSWORD=mysecretpassword
APP_VERSION=1.0.0

В docker-compose.yml:

services:
  app:
    environment:
      - DB_PASSWORD=${DB_PASSWORD}
    image: myapp:${APP_VERSION}

Многострочные команды

Используйте | или >:

services:
  app:
    command: |
      sh -c "
      echo 'Starting app...'
      sleep 5
      npm start
      "

Условные конфигурации

Создайте docker-compose.override.yml для разработки:

services:
  app:
    volumes:
      - ./src:/app/src
    environment:
      - NODE_ENV=development

Health Checks

Добавьте проверку работоспособности:

services:
  web:
    image: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3

Команды для работы с Docker Compose

  • docker-compose up -d — запустить в фоновом режиме.
  • docker-compose down — остановить и удалить контейнеры.
  • docker-compose ps — показать статус сервисов.
  • docker-compose logs -f <service> — просмотр логов.
  • docker-compose exec <service> bash — зайти в контейнер.
  • docker-compose build — пересобрать образы.

Рекомендации и лучшие практики

  1. Версионирование: используйте актуальную версию схемы (‘3.8’).
  2. Именованные тома: предпочтительнее хостовых монтирований для БД.
  3. Переменные окружения: храните секреты в .env‑файлах.
  4. Зависимости: используйте depends_on для порядка запуска, но учитывайте, что это не гарантирует готовность сервиса.
  5. Политика перезапуска: настройте restart для продакшена.
  6. Логирование: настройте сбор логов через logging драйвер.
  7. Сети: создавайте отдельные сети для изоляции.
  8. Документация: комментируйте сложные конфигурации.

Распространённые ошибки

  • Неправильные отступы — YAML чувствителен к пробелам.
  • Отсутствие кавычек для строк с спецсимволами.
  • Путаница с путями в volumes (относительные/абсолютные).
  • Некорректные порты — проверьте формат «host:container».
  • Отсутствие зависимостей — сервисы запускаются параллельно.
  • Забытые тома — данные БД теряются при удалении контейнера.

Похожие записи

Настройка взаимодействия RED ADM и Windows Active Directory

Сегодня проведем несколько экспериментов по настройке взаимодействия RED ADM и Windows Active Directory. Есть несколько способов настройки доверия для упрощения миграции с решений Microsoft на Российское ПО и сегодня их…

Установка основного контроллера домена на базе REDADM

Продолжаем наш проект по импортозамещеню Зарубежного ПО на Российское. Я уже рассказывал как работать с доменом FreeIPA, но для полноты картины стоит рассказать и про контроллер домена на базе REDADM.…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Читать еще статьи

Настройка взаимодействия RED ADM и Windows Active Directory

Настройка взаимодействия RED ADM и Windows Active Directory

Подробная инструкция по написанию YAML‑файлов для Docker Compose

Подробная инструкция по написанию YAML‑файлов для Docker Compose

Установка основного контроллера домена на базе REDADM

Установка основного контроллера домена на базе REDADM

zVirt работа с шаблонами виртуальных машин

zVirt работа с шаблонами виртуальных машин

Подробная инструкция по работе с томами (volumes) в Docker

Подробная инструкция по работе с томами (volumes) в Docker

Сетевые возможности Docker

Сетевые возможности Docker