Привет, Хабр! Меня зовут Александр, Системный администратор в компании Барс Груп Сегодня хочу поделиться своим опытом использования новых возможностей Docker Compose, которые значительно упростили мне работу. Эти изменения касаются автоматического обновления контейнеров, работы с профилями, использования GPU, а также улучшенного управления сборкой и секретами. На практике заметил, что эти фичи мало используются, и надеюсь, что после прочтения статьи, вы будете чаще использовать эти фичи в своей повседневной работе. Давайте разбираться!

Watch: Кодиш — видиш

Если вы когда-либо работали с Docker Compose, то наверняка знаете, как неудобно каждый раз вручную перестраивать контейнеры после внесения изменений в код. В Docker Compose имеется фича watch, которая решает эту проблему.

Compose может автоматически отслеживать изменения в ваших файлах и мгновенно обновлять работающие контейнеры. Это позволяет сократить время на тестирование новых изменений.

Как настроить? Пробуем!

Пример для Nginx:

services:
  web:
    image: nginx:alpine
    volumes:
      - ./html:/usr/share/nginx/html:ro
    ports:
      - "8080:80"
    labels:
      com.docker.compose.watch: "true"

Создайте локальную директорию html с файлом index.html для тестирования.
Например, в html/index.html оставьте следующий код:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Docker Watch Test</title>
</head>
<body>
    <h1>Привет, Docker Compose Watch!</h1>
</body>
</html>

Запустите проект:

docker compose up

 И в отдельной вкладке терминала активируйте watch:

docker compose watch

Теперь, если вы внесёте изменения в файл html/index.html, обновления автоматически применятся. Например, измените текст в теге <h1> и просто обновите браузер, чтобы увидеть результат.

Это особенно полезно в процессе локальной разработки, когда вам нужно быстро тестировать изменения. Удобно? Берём на заметку.

Профили: Настраивайте окружения под свои нужды

Вторая полезная фича — поддержка профилей. Теперь в одном файле docker-compose.yml можно определить разные конфигурации для разных окружений: разработки, тестирования, продакшна.

Пример:

services:
  web:
    image: nginx:alpine
    profiles:
      - production

  debug:
    image: busybox
    command: sleep 1000
    profiles:
      - development

Чтобы запустить Compose с профилем, используйте флаг --profile:

docker compose --profile development up

docker compose --profile production up

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

GPU Access: Для тех, кто любит мощность

Поддержка GPU стала необходимостью для проектов, связанных с машинным обучением или рендерингом. Теперь Docker Compose позволяет легко указывать использование GPU в контейнерах. Для проверки этого примера потребуется настроить окружение для работы docker c nvidia-tools следуя официальной документации

Пример:

services:
  test:
    image: nvidia/cuda:12.3.1-base-ubuntu20.04
    command: nvidia-smi
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

Улучшения сборки: Быстрее, легче, лучше

Docker Compose теперь поддерживает более гибкие настройки процесса сборки. Среди новых возможностей:

  • Кэширование сборки. Теперь можно ускорить сборку, сохраняя промежуточные слои.

  • Параллельная сборка. Docker Compose теперь умеет собирать образы одновременно, что ускоряет процесс в больших проектах.

Пример:

Предположим, у вас есть проект с большим количеством Docker-образов. Один из них — приложение app, а другой — база данных db. Вы хотите оптимизировать сборку и использовать кэширование для ускорения процесса.

Помните, это только общий пример, и вам нужно будет адаптировать его к своему проекту. Файл docker-compose.yml будет выглядеть так:

services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
      target: production
      cache_from:
        - app:cache

  db:
    build:
      context: ./db
      dockerfile: Dockerfile
      cache_from:
        - db:cache
  1. Контекст и таргет: Параметр context указывает путь к директории с Dockerfile, а target позволяет собирать только определённый этап из многоэтапного Dockerfile (например, production).

  2. Кэширование: Флаг cache_from позволяет указывать образы, которые можно использовать для ускорения сборки. Например, ранее сохранённый образ app:cache может помочь избежать повторной сборки неизменённых слоёв.

Как это работает?

  1. Запускаем первую сборку:

  2. docker compose build

  3. Если никаких изменений в файлах нет, процесс сборки будет использовать кэш для каждого этапа.

  4. При изменении кода только в одном сервисе (например, app) Compose пересоберёт только его, оставив db нетронутым. Это значительно ускоряет процесс.

  5. Параллельная сборка активируется автоматически, если используется несколько сервисов. Например, app и db будут собираться одновременно.

Преимущество:

  • Вы экономите время на сборке больших проектов.

  • Меньше ресурсов тратится на перестройку неизменённых частей приложения.

Управление секретами: Надежно и безопасно

Docker Compose улучшил поддержку работы с секретами, что делает хранение конфиденциальных данных более безопасным. Теперь вы можете определять секреты в файле Compose и использовать их в контейнерах.

Пример:

secrets:
  db_password:
    file: ./secrets/db_password.txt

services:
  db:
    image: postgres
    secrets:
      - db_password

Доступ к секретам внутри контейнера можно получить через переменные окружения или специальные файлы.

Чем новая версия лучше старой?

Если вы ещё используете старую версию Docker Compose (выполненную как Python-скрипт), то пора уже обновляться!

Вот почему:

  1. Больше возможностей. Новые фичи, такие как watch, profiles и поддержка GPU, доступны только в актуальных версиях.

  2. Производительность. Docker Compose V2 написан на Go, что делает его значительно быстрее и стабильнее.

  3. Совместимость. Новая версия тесно интегрирована с Docker CLI, что упрощает использование.

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

Вывод

Эти обновления делают Docker Compose ещё более мощным инструментом для работы с контейнеризированными приложениями. Вот что особенно радует:

  1. watch — значительно ускоряет локальную разработку.

  2. profiles — упрощает управление конфигурациями для разных сред.

  3. GPU support — расширяет возможности для вычислительных задач.

  4. Улучшения в сборке — ускоряют разработку и CI/CD.

  5. Секреты — обеспечивают безопасность.

Старый Docker Compose — это как телефон с кнопками: надёжный, проверенный, но уже далёкий от современных реалий. Вы можете им пользоваться, но разве не хочется смартфон, который сам обновляет приложения, работает быстрее и предлагает больше функций? Docker Compose V2 — это тот самый смартфон, который преобразит вашу разработку или DevOps-процесс. Обновляйтесь, и пусть ваши контейнеры работают, как часы!

Комментарии (3)


  1. pingo
    03.02.2025 16:57

    Это хорошо, а как в разных секциях сервисов использовать разные файлы окружения, помимо .env? У меня так и не получилось


    1. BioHazzardt
      03.02.2025 16:57

      services:
        # ...
        myservice:
          image: ...
          env_file: /path/to/file.env
        #...

      Оно?


  1. baldr
    03.02.2025 16:57

    новых возможностей Docker Compose

    Статья про Docker Compose v2, который был релизнут в 2020 году. В принципе, всё правильно описано, но уже 5 лет прошло.

    Кэширование и таргет - скорее фичи Buildkit, который сейчас тоже по-умолчанию используется, а раньше надо было переменной окружения включать.