Docker Compose — Структура docker-compose.yml
Эта страница объясняет структуру файла docker-compose.yml и основные параметры, используемые при описании сервисов Docker. Здесь разобраны ключевые разделы конфигурации, такие как services, volumes, networks, environment, ports и другие. Материал рассчитан на начинающих и помогает понять, как правильно описывать инфраструктуру приложения в Docker Compose.
Что такое docker-compose.yml
docker-compose.yml — это файл конфигурации, который описывает:
- какие контейнеры нужно запустить
- какие образы использовать
- какие порты открыть
- какие volumes подключить
- какие сети создать
Compose позволяет запускать всё приложение одной командой:
docker compose up -d
Базовая структура docker-compose.yml
Пример минимального файла:
version: "3.9"
services:
nginx:
image: nginx:1.25
ports:
- "8080:80"
Этот файл создаёт контейнер nginx и открывает порт 8080.
Основные разделы docker-compose.yml
Типичная структура файла выглядит так:
services:
volumes:
networks:
Раздел services
Раздел services описывает контейнеры проекта.
Пример:
services:
nginx:
image: nginx:1.25
php:
image: php:8.2-fpm
В этом примере создаются два сервиса:
- nginx
- php
Каждый сервис становится отдельным контейнером.
Параметр image
Определяет Docker-образ, который будет использоваться.
Пример:
services:
nginx:
image: nginx:1.25
Docker скачает образ nginx:1.25, если он отсутствует.
Параметр build
Используется, если образ нужно собрать локально из Dockerfile.
Пример:
services:
app:
build: .
Это означает:
собрать образ из Dockerfile текущей директории
Можно указать путь:
services:
app:
build: ./app
Параметр ports
Используется для проброса портов.
Пример:
ports:
- "8080:80"
Это означает:
сервер:8080 → контейнер:80
После запуска приложение будет доступно:
http://server:8080
Параметр volumes
Подключает volumes или папки сервера.
Пример:
volumes:
- ./src:/var/www/html
Это означает:
сервер ./src → контейнер /var/www/html
Использование Docker Volumes
Пример с volume:
services:
mysql:
image: mysql:8
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
Volume будет хранить данные базы.
Параметр environment
Передаёт переменные окружения контейнеру.
Пример:
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: app_db
Контейнер получит переменные:
MYSQL_ROOT_PASSWORD
MYSQL_DATABASE
Использование .env файла
Переменные можно хранить в .env.
Пример:
DB_PASSWORD=secret
APP_ENV=production
И использовать в Compose:
environment:
DB_PASSWORD: ${DB_PASSWORD}
Параметр depends_on
Определяет зависимости между сервисами.
Пример:
services:
php:
depends_on:
- mysql
Это означает:
сначала запускается mysql
затем php
Важно:
depends_onне гарантирует, что сервис полностью готов к работе.
Параметр restart
Определяет политику перезапуска контейнера.
Пример:
restart: always
Возможные значения:
| Значение | Поведение |
|---|---|
| no | не перезапускать |
| always | всегда перезапускать |
| on-failure | только при ошибке |
| unless-stopped | перезапускать, пока не остановлен вручную |
Параметр networks
Определяет сети Docker.
Пример:
services:
app:
networks:
- backend
networks:
backend:
Контейнер будет подключён к сети backend.
Пример полного docker-compose.yml
Пример простого веб-приложения:
services:
nginx:
image: nginx:1.25
ports:
- "80:80"
volumes:
- ./src:/var/www/html
php:
image: php:8.2-fpm
volumes:
- ./src:/var/www/html
depends_on:
- mysql
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
Этот файл запускает:
- nginx
- php
- mysql
Проверка docker-compose.yml
Перед запуском полезно проверить конфигурацию:
docker compose config
Команда покажет итоговую конфигурацию после обработки переменных.
Запуск проекта
Запуск всех сервисов:
docker compose up -d
Остановка проекта
docker compose down
Типичные ошибки в docker-compose.yml
Ошибка YAML
Файл YAML чувствителен к отступам.
Неправильно:
services:
nginx:
image: nginx
Правильно:
services:
nginx:
image: nginx
Неверные порты
Если порт уже используется:
Bind for 0.0.0.0:80 failed
Нужно изменить порт.
Отсутствие volumes
Если данные не вынесены в volumes, они могут потеряться при пересоздании контейнера.
Краткая памятка
services → контейнеры проекта
image → используемый образ
build → сборка образа
ports → проброс портов
volumes → подключение хранилища
environment → переменные окружения
depends_on → зависимости сервисов
restart → политика перезапуска
networks → сети контейнеров
No comments to display
No comments to display