Skip to main content

Отличия между docker compose up и docker stack deploy

Отличия между docker compose up и docker stack deploy:
1. Инструменты и контексты использования

    docker compose up:
        Используется для локальной разработки и запуска приложений с помощью Compose.
        Прямо работает с файлами docker-compose.yml.
        Управляется командой docker compose (или старой командой docker-compose).
        Работает с Docker на одном хосте.

    docker stack deploy:
        Используется для развертывания приложений в режиме Docker Swarm.
        Требует активного Swarm-кластера.
        Управляется командой docker stack.
        Поддерживает кластеризацию и оркестрацию на нескольких хостах.

2. Масштабируемость

    docker compose up:
        Все контейнеры запускаются на одном хосте.
        Не поддерживает масштабирование через кластер.

    docker stack deploy:
        Развертывает сервисы на всех узлах Swarm-кластера.
        Поддерживает автоматическое масштабирование.

3. Команда и файлы

    docker compose up:
        Использует файл docker-compose.yml или compose.yaml без необходимости в дополнительных изменениях.

    docker stack deploy:
        Тоже может использовать файл docker-compose.yml, но не все директивы поддерживаются (например, build необходимо заменить на предварительно построенные образы).
        Требует опцию --compose-file для указания файла или его корректного местоположения.

4. Оркестрация и обновления

    docker compose up:
        Просто запускает контейнеры и поддерживает их в рабочем состоянии.
        Не предоставляет встроенные механизмы для управления обновлениями и отказоустойчивостью.

    docker stack deploy:
        Поддерживает обновления, откаты и стратегии развертывания для сервисов.
        Использует оркестрацию Docker Swarm, что позволяет управлять нагрузкой, перезапусками и восстановлением.

5. Примеры использования

    docker compose up:

docker compose up -d

Запускает все сервисы, описанные в docker-compose.yml, в режиме демона на текущем хосте.

docker stack deploy:

    docker swarm init
    docker stack deploy --compose-file docker-compose.yml my_stack

    Создаёт стек my_stack и распределяет сервисы по узлам Swarm-кластера.

Когда использовать?

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

Вы сказали:
Распределение контейнеров по узлам Swarm-кластера - можно ли вручную регулировать что куда распределяется, или всётолько автоматически происходит?
ChatGPT сказал:
ChatGPT

В Docker Swarm распределение контейнеров (задач) между узлами кластера в основном происходит автоматически, на основе доступных ресурсов и политики планирования. Однако, можно настроить ручное управление распределением контейнеров с помощью определённых механизмов.
Способы управления распределением контейнеров
1. Constraints (Ограничения)

Позволяют указать, на каких узлах можно запускать задачи конкретного сервиса, основываясь на метаданных узла (например, его имени, роли или метке).

Пример:

version: '3.8'
services:
  app:
    image: my-app
    deploy:
      placement:
        constraints:
          - "node.role == manager"        # Только на менеджерах
          - "node.labels.env == production"  # Узлы с меткой "env=production"

Чтобы задать метку узлу:

docker node update --label-add env=production <node_name>

2. Placement Preferences (Предпочтения размещения)

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

Пример:

version: '3.8'
services:
  app:
    image: my-app
    deploy:
      placement:
        preferences:
          - spread: node.labels.datacenter  # Распределение по метке "datacenter"

3. Ручное управление узлами через replicas

Вы можете явно указать, сколько задач (контейнеров) должно быть запущено, и совместить это с Constraints для контроля их размещения.

Пример:

version: '3.8'
services:
  app:
    image: my-app
    deploy:
      replicas: 3
      placement:
        constraints:
          - "node.hostname == node1"  # Все реплики только на узле node1

4. Global Mode (Глобальный режим)

Вместо задания количества реплик, можно настроить, чтобы одна задача сервиса запускалась на каждом доступном узле.

Пример:

version: '3.8'
services:
  app:
    image: my-app
    deploy:
      mode: global  # По одной задаче на каждый узел

5. Использование ресурсов узлов

Swarm учитывает доступные ресурсы (CPU, память и т. д.) для автоматического распределения. Вы можете явно указать требования к ресурсам контейнера.

Пример:

version: '3.8'
services:
  app:
    image: my-app
    deploy:
      resources:
        reservations:
          memory: 512M
          cpus: "0.5"

Пример комбинированной настройки

В этом примере распределение сервиса осуществляется только на узлы с определённой меткой и равномерно распределяется между датацентрами:

version: '3.8'
services:
  app:
    image: my-app
    deploy:
      replicas: 6
      placement:
        constraints:
          - "node.labels.env == production"
        preferences:
          - spread: node.labels.datacenter

Итог

Контейнеры можно направлять вручную с помощью Constraints, Preferences, или даже глобального режима. Это позволяет точечно управлять размещением, сохраняя автоматизацию там, где это возможно.