Шаблон docker-compose.yml#

version: '3.8'

networks:
  app-net:
    driver: overlay
  # Не должно быть привязки к подсети, она может быть любой

services:

  nginx-front:

    image: my_best_image:latest
    # Нужно указать корректный контейнер и путь к registry

    networks:
      - app-net
        # Названия сетей

    ports:
      - "80:80"
        # Порты должны быть указаны

    volumes:
      - /etc/localtime:/etc/localtime:ro
        # Используется только для того, чтобы синхронизировать
        # часовой пояс внутри контейнера и хостовой машины
 
      - /mnt/shared_vol:/www/public/upload
        # Следует учесть, что предоставляется монтированный каталог 
        # на хостовой машине, репликация проходит между всеми хостами 
        # по тем же путям

    # Рекомендуется использовать docker config для публикации конфигов
    # для всех контейнеров, где они должны быть
    configs:
      - source: nginx-conf
        target: /etc/nginx/nginx.conf
      - source: virtual-host-conf
        target: /etc/nginx/conf.d/default.conf
      - source: public-key-pem-v0.02
        target: /etc/nginx/ssl/nginx.public.pem

    # Хранение чувствительных данных -- в docker secret
    secrets:
      - source: private-key
        target: nginx.private.key

    deploy:
      replicas: 3 
      # Нужно указывать расчётное количество в соответствии с нагрузкой,
      # DevOps может управлять количеством реплик

      placement:
        max_replicas_per_node: 1 
        # Стандартная политика, которая рекомендуется, но не обязательна

      update_config:
        parallelism: 1
        delay: 2s

      restart_policy:
        condition: any
        delay: 5s
        window: 20s

configs:

  # Есть несколько подходов к управлению версиями конфигов 
  # Начну с того, который считаю самым удобным

  nginx-conf:
    name: nginx-conf-${NGINX_CONF_VER}
    file: /path/to/nginx.conf

  # В таком варианте версия конфига задаётся переменной окружения
  # либо перед деплоем:
  # export NGINX_CONF_VER=01
  # либо прямо в момент деплоя
  # NGINX_CONF_VER=01 docker stack deploy ...
  # 
  # name: позволяет задать версию конфига в одном месте, а в разделе configs
  # разных служб использовать идентификатор nginx-conf
  #
  # Для смены версии конфига не нужно редактировать файл compose 
  # или переименовывать файл-источник конфига


  virtual-host-conf:
    name: virtual-host-conf_v0.01
    file: /path/to/virtual-host.conf

  # Вариант без переменной окружения.
  # Минус в том, что для смены версии конфига требуется изменить compose файл
  # (но изменения вносить только в name: )

  
  public-key-pem-v0.02:
    external: true

  # В таком варианте (а) конфиг создаётся с помощью команды 
  # docker config create ... *до* деплоя стека
  # (б) для создания новой версии конфига снова требуется изменять compose
  # файл, но на этот раз как в глобальном сonfigs, так и для каждой службы,
  # где он используется


secrets:
  private-key:
    external: true