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

4/5 - (1 голос)

Так как на севере делать абсолютно нечего, то я продолжаю заниматься саморазвитием 🙂 На этой неделе вспоминаю и углубляю свои знания в 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».
  • Отсутствие зависимостей — сервисы запускаются параллельно.
  • Забытые тома — данные БД теряются при удалении контейнера.

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

Хранилище артефактов (Docker) Cloud.ru

Продолжаем разбираться с облачной платформой cloud.ru и сегодня займемся хранилищем артефактов. Достоинства хранилища артефактов Docker в Cloud.ru 1. Интеграция с экосистемой Cloud.ru 2. Безопасность 3. Надёжность и доступность 4. Производительность…

Хранение медиа-файлов WordPress в S3-хранилище

В продолжении перевода своих ресурсов в облака следующим этапом необходимо настроить хранение медиа-файлов WordPress в хранилище S3 в облаке Cloud.ru. Задачка довольно типовая, но есть нюансы. Прежде всего зарегистрируем сервисный…

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

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

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

Хранилище артефактов (Docker) Cloud.ru

Хранилище артефактов (Docker) Cloud.ru

Хранение медиа-файлов WordPress в S3-хранилище

Хранение медиа-файлов WordPress в S3-хранилище

Настройка кэширования WordPress при помоши Redis

Настройка кэширования WordPress при помоши Redis

Создание кластера Managed Kubernetes в облаке Cloud.ru

Создание кластера Managed Kubernetes в облаке Cloud.ru

Интеграция FreeIPA DNS и BIND DNS

Интеграция FreeIPA DNS и BIND DNS

Настройка централизованной авторизации в домене IPA на RedOS 8

Настройка централизованной авторизации в домене IPA на RedOS 8