```{index} docker; docker-compose.yml ``` # Шаблон docker-compose.yml ```yaml 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 ```