Работали ли вы с Docker Swarm?

«Работали ли вы с Docker Swarm?» — вопрос из категории DevOps, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, я использовал Docker Swarm для оркестрации контейнеров в нескольких проектах на Node.js, где требовалась отказоустойчивость и простота управления по сравнению с более сложными системами вроде Kubernetes.

Пример развертывания Node.js микросервиса в Swarm:

  1. Инициализация Swarm и развертывание стека:

    # На manager-ноде
    docker swarm init --advertise-addr <MANAGER-IP>
    
    # Создание overlay сети для межсервисного взаимодействия
    docker network create --driver overlay my-app-network
    
    # Деплой стека из docker-compose.yml
    docker stack deploy -c docker-compose.yml myapp
  2. docker-compose.yml для Swarm (упрощенный пример):

    version: '3.8'
    services:
      api:
        image: my-registry/node-api:latest
        deploy:
          replicas: 3
          restart_policy:
            condition: on-failure
            delay: 5s
          update_config:
            parallelism: 1
            delay: 10s
            order: start-first
        networks:
          - my-app-network
        environment:
          - NODE_ENV=production
          - REDIS_HOST=redis
        ports:
          - published: 3000
            target: 3000
            protocol: tcp
            mode: ingress
    
      redis:
        image: redis:alpine
        deploy:
          replicas: 1
          placement:
            constraints: [node.role == manager]
        networks:
          - my-app-network
        volumes:
          - redis-data:/data
    
    networks:
      my-app-network:
        external: true
    volumes:
      redis-data:

Ключевые преимущества, которые я использовал:

  • Секреты (Secrets): Безопасное хранение чувствительных данных (ключей API, паролей БД) и их монтирование в контейнеры как файлы.
  • Сервисное обнаружение: Встроенный DNS для обращения к сервисам по имени (например, redis) внутри overlay-сети.
  • Отказоустойчивость: Swarm автоматически перезапускает упавшие реплики и перераспределяет их по нодам.

Я применял Swarm для деплоя кластера из Node.js API, worker-ов на Bull (обработка очередей) и вспомогательных сервисов (Redis, PostgreSQL). Для мониторинга использовал комбинацию docker service logs и внешние инструменты вроде ELK-стека.