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).

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ