Так как на севере делать абсолютно нечего, то я продолжаю заниматься саморазвитием 🙂 На этой неделе вспоминаю и углубляю свои знания в 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 — пересобрать образы.
Рекомендации и лучшие практики
- Версионирование: используйте актуальную версию схемы (‘3.8’).
- Именованные тома: предпочтительнее хостовых монтирований для БД.
- Переменные окружения: храните секреты в .env‑файлах.
- Зависимости: используйте depends_on для порядка запуска, но учитывайте, что это не гарантирует готовность сервиса.
- Политика перезапуска: настройте restart для продакшена.
- Логирование: настройте сбор логов через logging драйвер.
- Сети: создавайте отдельные сети для изоляции.
- Документация: комментируйте сложные конфигурации.
Распространённые ошибки
- Неправильные отступы — YAML чувствителен к пробелам.
- Отсутствие кавычек для строк с спецсимволами.
- Путаница с путями в volumes (относительные/абсолютные).
- Некорректные порты — проверьте формат «host:container».
- Отсутствие зависимостей — сервисы запускаются параллельно.
- Забытые тома — данные БД теряются при удалении контейнера.




