Деплой сервиса на docker без downtime

Всем привет. У меня есть сервис на php, в качестве окружения используются два docker-контейнера (c php-fpm и nginx). Мне необходимо организовать деплой на единственный хост, и при этом не должно быть downtime. Здесь https://medium.com/better-programming/zero-downtime-deployment-with-docker-swarm-d84d8d9d9a14 например описано как сделать такой деплой через docker swarm, но в примерах указано несколько хостов как я понимаю, мне же нужно это сделать только на одном хосте. Как это сделать проще всего?


Ответы (2 шт):

Автор решения: ASTyurin

К сожалению при использовании голого Docker практически невозможно обновлять контейнеры без downtime. Вы можете использовать, например, kubernetes single node. При настройке deployment в k8s необходимо указать:

...
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
...

Главное в репликах указать не больше 1. В этом случае контейнеры не будут удалены, пока новые контейнеры не поднимутся.

Обновление контейнеров можно выполнять этой командой (если, например, таг контейнера не меняется, но меняется сам контейнер):

kubectl rollout restart deploy my_deploy

Так же подробнее можете прочитать в документации kubernetes.

→ Ссылка
Автор решения: Sergei Kirjanov

К сожалению сделать сервис доступный всегда невозможно.

Хотя бы потому, что сеть до сервиса не доступна всегда.

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

kubernetes -- хороший конструктор, но сложный, и его применение влечет за собой как дополнительные затраты ресурсов, так и усложнение операций (обслуживания) системы.

Как вариант, можно разделить систему на части, которые деплоятся часто и редко. Например nginx можно деплоить редко, и он всегда сможет отдать статику, а сервис с логикой часто, но это будет не сильно заметно, т. к. клиент сделает перепосылку.

Еще можно сделать простой сервис, который кладет запрос в очередь (message broker), a основной сервис берет сообщения из очереди, когда будет готов.

Вообще сервис на php обычно не должен иметь существенный downtime.

→ Ссылка