# Docker Compose — Структура docker-compose.yml

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