JavaRush /Курсы /Модуль 2: Fullstack /Создание docker-compose.yml

Создание docker-compose.yml

Модуль 2: Fullstack
14 уровень , 2 лекция
Открыта

3.1 Файл compose.yaml

Файл compose.yaml (или один из следующих вариантов: docker-compose.yaml, docker-compose.yml, compose.yml) — это основной конфигурационный файл, используемый Docker Compose для определения и управления многоконтейнерными приложениями. Он описывает, какие контейнеры (сервисы) должны быть запущены, как они взаимодействуют друг с другом и какие ресурсы им нужны.

Для единообразия в этой лекции мы будем использовать вариант compose.yaml, так как он рекомендуется для современных версий Docker Compose.

Структура файла compose.yaml

Файл compose.yaml состоит из нескольких разделов, каждый из которых описывает различные аспекты конфигурации приложения. Основные разделы включают:

  1. version: указывает версию файла Compose (например, '3.9').
  2. services: описывает контейнеры (сервисы), их настройки и зависимости.
  3. volumes: определяет тома для хранения данных между контейнерами и хостом.
  4. networks: настраивает сети, через которые сервисы общаются друг с другом.

3.2 Основные директивы

1. version

Директива version определяет версию синтаксиса Docker Compose, используемого в файле compose.yaml. На момент написания статьи наиболее актуальной является версия 3, в частности её обновления, такие как 3.8 и 3.9.

Yaml

version: '3.9'

2. services

Раздел services определяет контейнеры, которые Compose должен создать и запустить. Каждый сервис представляет собой отдельный контейнер с определенной конфигурацией.

Пример:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

В этом примере определены два сервиса: web и db. Сервис web использует образ nginx:latest и открывает порт 80. Сервис db использует образ mongo:latest и подключает том для хранения данных.

3. volumes

Раздел volumes используется для определения томов, которые могут быть подключены к контейнерам для хранения данных. Это полезно для сохранения данных при перезапуске контейнеров.

Пример:

Yaml

volumes:
  mongo-data:

4. networks

Раздел networks позволяет определить пользовательские сети, в которых будут работать контейнеры. Это обеспечивает изоляцию и настройку сетевых подключений. Если сети не указаны, Docker Compose создаст дефолтную сеть, и все сервисы будут подключены к ней.

Пример:

Yaml

networks:
  front-end:
  back-end:

3.3 Директивы для настройки сервисов

Основные директивы для настройки сервисов:

1. image

Директива image указывает образ, который будет использоваться для создания контейнера.

Пример:

Yaml

services:
  web:
    image: nginx:latest

2. build

Директива build используется для указания пути к Dockerfile, который должен быть использован для сборки образа.

Пример:

Yaml

services:
  app:
    build: ./app

3. ports

Директива ports определяет порты, которые должны быть открыты и перенаправлены с хост-машины на контейнер.

Пример:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

4. volumes

Директива volumes монтирует тома в контейнеры, что позволяет сохранять данные между перезапусками контейнеров.

Пример:

Yaml

services:
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

5. environment

Директива environment задаёт переменные окружения для контейнера.

Пример:

Yaml

services:
  app:
    image: myapp:latest
    environment:
      - NODE_ENV=production
      - API_KEY=1234567890

6. depends_on

Директива depends_on указывает, что данный сервис зависит от других сервисов и должен быть запущен после них.

Важно! При запуске вашего сервиса у вас нет 100% гарантии, что все необходимые для его работы сервисы полностью готовы. Они будут запущены — да, но дальнейшая работоспособность не гарантируется. Эта проблема решается с помощью health-check, но об этом позднее.

Пример:

Yaml

services:
  web:
    image: nginx:latest
    depends_on:
      - db
  db:
    image: mongo:latest

7. command

Директива command позволяет переопределить команду, которая будет выполнена при запуске контейнера.

Пример:

Yaml

services:
  app:
    image: myapp:latest
    command: python app.py

8. networks

Директива networks подключает сервис к одной или нескольким сетям.

Пример:

Yaml

services:
  web:
    image: nginx:latest
    networks:
      - front-end
  db:
    image: mongo:latest
    networks:
      - back-end

3.4 Полный пример

Пример полного файла compose.yaml

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    networks:
      - front-end
        
  app:
    build: ./app
    volumes:
      - ./app:/usr/src/app
    environment:
      - NODE_ENV=production
    networks:
      - front-end
      - back-end
        
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db
    networks:
      - back-end
        
volumes:
  mongo-data:
        
networks:
  front-end:
  back-end:

В этом примере:

  • Определены три сервиса: web, app и db.
  • web использует образ Nginx, монтирует конфигурационный файл и зависит от сервиса app.
  • app собирается из локального Dockerfile, монтирует исходный код приложения и использует переменные окружения.
  • db использует образ MongoDB и монтирует том для хранения данных.
  • Созданы два тома и две сети для изоляции и управления взаимодействием сервисов.

Примечание: один том – это mongo-data, а второй – это замаунченная директория с хост-машины (например, ./app).

3
Задача
Модуль 2: Fullstack, 14 уровень, 2 лекция
Недоступна
Создание простого файла docker-compose.yml
Создание простого файла docker-compose.yml
3
Задача
Модуль 2: Fullstack, 14 уровень, 2 лекция
Недоступна
Добавление переменных окружения
Добавление переменных окружения
3
Задача
Модуль 2: Fullstack, 14 уровень, 2 лекция
Недоступна
Монтирование директорий
Монтирование директорий
3
Задача
Модуль 2: Fullstack, 14 уровень, 2 лекция
Недоступна
Создание сети между сервисами
Создание сети между сервисами
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Евгений Уровень 70
22 мая 2025
Документация Docker говорит, что version уже в прошлом.
Артём Васенин Уровень 69
21 апреля 2025
"это замаунченная директория" - шта?
Askhad1994 Уровень 19
5 августа 2025
Директория в хост машине, которая соединяется с докер при помощи механизма bind mounts