Найпростіший деплой - docker compose pull && docker compose up -d - зупиняє старий контейнер і лише потім запускає новий. Між цими моментами сайт недоступний, а якщо новий контейнер не стартує - недоступний довго.
Принципи деплою без простою:
1. Спершу запустити нове, потім зупинити старе (start-first). Обидві версії якийсь час працюють паралельно.
2. Трафік на новий контейнер - лише коли він готовий. Перевірка стану (healthcheck) підтверджує, що застосунок справді відповідає, а не просто процес запущено:
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost/up"]
interval: 10s
timeout: 3s
retries: 3
start_period: 20s
У Laravel 11+ маршрут /up налаштовано за замовчуванням.
3. Старий контейнер завершує поточні запити перед зупинкою (graceful shutdown): отримує SIGTERM, перестає приймати нові запити, дообробляє поточні, і лише потім зупиняється. Балансувальник має встигнути прибрати його з пулу.
4. Автоматичний відкат, якщо нова версія не пройшла перевірку стану.
Як це реалізують:
- Docker Swarm:
deploy:
replicas: 2
update_config:
parallelism: 1
order: start-first
failure_action: rollback
Розділ update_config діє саме в режимі Swarm (docker stack deploy); звичайний docker compose up його не використовує і просто перестворює контейнери.
- Kubernetes - стратегія
RollingUpdateу Deployment з readiness-перевірками; - Kamal - запускає новий контейнер, перевіряє його й перемикає трафік через свій проксі (
kamal-proxy); - власний скрипт з Compose - запустити новий контейнер під іншою назвою, дочекатися здорового стану, перемкнути зворотний проксі (Caddy, Traefik, Nginx), зупинити старий.
Пастки, через які «без простою» не виходить:
- міграції бази, несумісні зі старою версією коду: під час переходу працюють обидві версії. Видалення чи перейменування колонки ламає стару. Потрібні сумісні в обидва боки міграції (спершу додати, потім - окремим релізом - прибрати);
- черги: воркери зі старим кодом обробляють задачі нового формату -
queue:restartі сумісний формат задач; - сесії й кеш у пам'яті контейнера - губляться при заміні.