Как деплоить docker-контейнер без простоя?

Что имеем:
2 docker-контейнера: app (node.js) и nginx (reverse-proxy)

Требование:
Иметь минимальный простой сервиса.
Некоторые запросы могут выполняться долгое время. Важно вернуть ответ на запрос, который пришел до деплоя.

Суть проблемы:
При обновлении проекта (docker-compose build && docker-compose up -d) имеем простой 5-10сек. (время запуска node.js в контейнере app).

Как я себе представляю решение:
1. Использование Green/Blue паттерна. Не смог найти простого решения (без костылей)
2. Стек Docker Swarm

Подскажите максимально простой подход к деплою с нулевый простоем (при отсутсвии DevOps'a).

docker-compose.yml
version: '3.3'

services:

  app:
    build:
      context: .
    restart: unless-stopped
    env_file: .env

  nginx:
    build: ./docker/nginx
    restart: unless-stopped
    depends_on:
      - app
    ports:
      - ${APP_PORT}:80
    volumes:
      - ./static:/var/www:cached
  • Вопрос задан
  • 542 просмотра
Пригласить эксперта
Ответы на вопрос 2
@vitaly_il1
DevOps Consulting
Как я себе представляю решение:

В целом правильно. Идея простая - поднять новый инстанс, перестать слать траффик на старый, подождать пока закончится обработка запросов, убить старый. Это не фантастически сложно, но надо реализовать.
Или пользоваться оркестратором - K8S, и т.п.

Еще вариант - немного дороже, но надежнее - использовать managed service - AWS Elastic Beanstalk, Google App Engine , Heroku.
Ответ написан
Комментировать
@zohan1993
devops
Инициализировать Docker Swarm с одной нодой.
Создать сервис с приложением - app.
И обновлять сервис с нужными параметрами для исключения простоя.
Простой пример:
docker service create --name nginx --replicas 1 --publish 80:80 nginx:1.18
docker service update nginx --update-order start-first --image nginx:1.19

docker service update
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы