Расширенный справочник по docker-compose.yml
Этот документ описывает ключевые элементы и опции, доступные в YAML-файле docker-compose.yml
, начиная с версии 3.8
и выше. Используется в многоконтейнерных приложениях для управления инфраструктурой.
🧩 Основная структура docker-compose.yml
version: "3.9" # или 3.8, 3.7 и т.д.
services:
сервис:
image: имя_образа:тег
build: путь_к_папке_или_объект_с_настройками
ports: ["хост:контейнер"]
volumes: ["источник:назначение"]
environment:
- ПЕРЕМЕННАЯ=значение
command: "команда_заменяющая_CMD"
depends_on:
- другой_сервис
networks:
- имя_сети
volumes:
имя_тома:
external: true # опционально
networks:
имя_сети:
external: true # опционально
🧱 services (Сервисы)
Описывает контейнеры, которые нужно запустить.
image
Указывает, какой Docker-образ использовать:
build
Если образ нужно собрать из Dockerfile:
ports
Проброс портов между хостом и контейнером:
volumes
Подключение директорий или томов:
environment
Передача переменных окружения:
command
Переопределяет CMD
из Dockerfile:
depends_on
Определяет порядок запуска:
⚠️ Не ждёт готовности сервиса, только запуска.
networks
Подключение сервиса к сети:
📦 volumes (Тома)
Определение именованных томов:
Или использование внешнего уже созданного тома:
🌐 networks (Сети)
Определение пользовательской сети:
Использование внешней сети:
Если ничего не указать — будет создана сеть project_default
автоматически.
🔁 restart (Политика перезапуска)
restart: always # всегда перезапускать
restart: on-failure # только при ошибке
restart: unless-stopped # пока не остановлен вручную
🌍 Работа с переменными окружения (environment)
Docker Compose поддерживает несколько способов задания переменных окружения:
1. Встроенный блок environment
внутри сервиса
Или в виде объекта:
2. Использование .env
файла (автоматически подгружается)
Создай рядом с docker-compose.yml
файл .env
:
В docker-compose.yml
можно писать переменные вот так:
Также можно указать .env
файл явно:
3. Передача переменных из текущего shell
💡 Распространённые переменные окружения
NODE_ENV=production
— для Node.jsDJANGO_SETTINGS_MODULE=config.production
— для DjangoSPRING_PROFILES_ACTIVE=prod
— для Spring BootRAILS_ENV=production
— для RailsPOSTGRES_USER
,MYSQL_ROOT_PASSWORD
— для БД
🧪 Типичные сценарии
🔐 Передача секретов:
🌐 Подключение к БД:
🧪 Установка режима окружения:
📦 Смена конфигурации без пересборки образа:
- Меняешь .env
, перезапускаешь docker compose up -d
.
🧪 Пример полноценного docker-compose.yml
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
networks:
- webnet
app:
build:
context: ./app
ports:
- "5000:5000"
environment:
- ENV=production
- API_KEY=${API_KEY}
depends_on:
- db
networks:
- webnet
restart: unless-stopped
volumes:
db-data:
networks:
webnet:
📌 Рекомендуется использовать version: "3.9"
(или выше) для актуального синтаксиса.
🧠 Помни, что Docker Compose создаёт тома и сети автоматически, если они не external
.