Watchtower: как я обновляю прототипы через Docker-реестр и не ломаю себе прод
Watchtower: как я обновляю прототипы через Docker-реестр и не ломаю себе прод
TL;DR — Watchtower идеально заходит в режиме прототипирования, когда ты не хочешь городить полноценный CI/CD, а обновлять контейнеры нужно часто, дешево и без боли.
За последние годы я разогнал десятки своих микросервисов — от Ananas до Adatari — и в них есть одна общая проблема: прототипы живут дольше, чем ожидаешь, а поддерживать их руками — боль.
Писать CI/CD для прототипа? Да, можно, но чаще всего не окупается.
Вот тут и начинается магия Watchtower.
Что такое Watchtower и почему он вообще существует?
Если коротко — это маленький демон, который:
- Поднимается как обычный контейнер рядом с остальными.
- Следит за Docker-реестром.
- Как только видит новую версию образа — пересоздаёт контейнер, подтягивает свежий билд, поднимает его с теми же параметрами, томами, переменными.
То есть ты пушнул образ → через минуту-две прототип встал на новую версию.
Автоматический docker pull + docker stop + docker rm + docker run в одной коробке.
Прямо для моей философии «запустил — забыл — перешёл к следующему компоненту» подходит идеально.
Когда Watchtower — топ, а когда лучше «не трогать»
✔ Идеально, если:
- Это прототип, MVP или черновая сборка.
- Изменения летят каждый день.
- У тебя уже есть реестр (локальный, GitHub, Yandex, AWS — без разницы).
- Хочешь «пушнул → всё встало».
❌ Плохо, если:
- Прод, где любое движение — риски.
- Нужны нулевые простои.
- Есть сложные миграции БД, очереди, шины, stateful-логика.
- Контейнер должен стартовать строго по расписанию/условиям.
В проде нормально делать канареечные релизы, а не класть прод на то, что Watchtower решит «а давай обновим».
Канареечные релизы: коротко и по делу
Канарейка — это когда новая версия раскатывается на маленькую часть трафика, а остальная система сидит на старой.
Если всё ок → масштабируем новую.
Если ошибка → «задушили канарейку», откатили.
В Docker-мире это обычно выглядит так:
- старый контейнер:
myimage:stable - новый контейнер:
myimage:canary
Ты поднимаешь оба, направляешь часть трафика через ингресс/прокси на canary.
Если он жив → меняешь теги, обновляешь stable.
Watchtower тут ни при чём, это уже история про продакшн-инфру и грамотную маршрутизацию (NGINX, Traefik, Envoy).
Как я использую Watchtower в реальности
Для прототипов — это просто масло на колёса.
Сценарий рабочий:
- Пишу сервис.
- Билжу
docker build -t registry/project/service:latest . docker push.- Жду минуту.
- Прототип обновился.
С точки зрения R&D — это буквально «Dev → Push → Magic».
Я не заморачиваюсь с deploy-скриптами, ansible и прочим — до тех пор, пока проект не превращается в продукт.
Минимальный docker-compose с Watchtower
version: "3.8"
services:
myservice:
image: registry.example.com/myproj/service:latest
restart: unless-stopped
watchtower:
image: containrrr/watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command:
- --interval=30 # проверять каждые 30 секунд
- --cleanup # удалять старые образы
- --enable-lifecycle-hooks # корректные сигналы на перезапуск
Секунда в секунду не надо — в прототипах эти 30–60 секунд роли не играют.
Про теги: не ломай себе всё одним latest
Это важная часть.
Если пушить только latest, ты не сможешь нормально откатиться. Поэтому я делаю так:
service:latest — то, что едет на прототипы через Watchtower.
service:dev-{gitSHA} — конкретные версии для отката.
service:stable — ручная сборка, которую я признаю «нормальной».
Watchtower следит только за latest. Если что-то пошло не так — просто ставлю тег назад на старую версию и пушу:
docker tag service:dev-a1b2c3 service:latest docker push service:latest
И Watchtower сам откатит прототипы.
Политика откатов: мой упрощённый взгляд
Я придерживаюсь правила:
«Не пишем миграции в прототипах, не делаем сложный стейт, не держим очереди — и всё будет нормально».
Если сервис stateless → Watchtower идеален. Если нет → это уже не прототип, а мини-прод, и нужен CI/CD + миграции + канарейки.
Прод vs прототип: чёткая грань
Я строг в своей дисциплине:
Прототипы — обновляются Watchtower, могут упасть, могут перезапуститься, это нормально.
Предпрод / прод — только ручное управление версиями + canary deployment.
Эта граница спасает нервы, деньги и помогает держать проект под контролем.
sЗаключение
Watchtower — это инструмент, который:
экономит тонну времени,
делает прототипирование приятным,
снимает рутину «а как бы мне обновить этот контейнер на сервере»,
но не должен быть частью продакшн-практик.
Как только сервис начинает давать деньги → он уходит на нормальный CI/CD. Но до этого момента Watchtower — это тот самый костыль-самурай, который работает, заходит и делает жизнь проще.