Docker Compose магия: Как да автоматизирате обновяването на всичките си контейнери с Watchtower и Diun

Защо автоматизацията на контейнерите е важна
Управлението на Docker контейнери може да стане истинско предизвикателство. Всеки контейнер изисква редовни обновявания за сигурност и функционалност.
Ръчното обновяване отнема време и е склонно към грешки. 🔄
В тази статия ще научите как да автоматизирате напълно процеса. Ще използваме два мощни инструмента: Watchtower и Diun.
Какво ще постигнете:
- Автоматично обновяване на контейнери без ваша намеса
- Известия за нови версии преди обновяване
- Пълен контрол над процеса на актуализация
- Спестено време и намалени грешки
Нека започнем! 🚀
Какво представляват Watchtower и Diun
Watchtower – вашият автоматичен обновител
Watchtower е контейнер, който наблюдава вашите Docker образи. Той проверява за нови версии вRegistry.
Когато открие обновление, Watchtower автоматично:
- Изтегля новия образ
- Спира стария контейнер
- Стартира нов контейнер със същата конфигурация
- Изтрива стария образ (опционално)
Diun – системата за известяване
Diun (Docker Image Update Notifier) работи различно. Този инструмент само наблюдава и уведомява.
Той не променя нищо автоматично. Вместо това изпраща известия когато има обновления.
Основни възможности на Diun:
- Проверка на множество registry източници
- Поддръжка на различни канали за известяване
- Гъвкаво планиране на проверките
- Филтриране на конкретни образи
Кога да използвате всеки инструмент
Използвайте Watchtower когато:
- Искате пълна автоматизация ✅
- Работите с development среда
- Имате нужда от бързи обновявания
- Контейнерите са без критична важност
Използвайте Diun когато:
- Искате пълен контрол над обновяванията 🎯
- Работите с production среда
- Нуждаете се от одобрение преди промени
- Искате да планирате обновяванията
Комбинирайте двата инструмента когато:
- Имате смесена среда (dev + production)
- Искате известия И селективна автоматизация
- Управлявате много контейнери с различни нужди
Подготовка на системата
Предварителни изисквания
Преди да започнете, уверете се че имате:
- Docker Engine 20.10 или по-нова версия
- Docker Compose v2 или по-нова версия
- Root или sudo достъп до системата
- Основни познания за Docker и YAML синтаксис
Проверка на версиите
Отворете терминал и изпълнете:
docker --version
docker compose version
Трябва да видите версиите на инсталираните компоненти. Ако Docker Compose не е намерен, инсталирайте го.
Създаване на работна директория
Създайте структура за вашите конфигурации:
mkdir -p ~/docker-automation/{watchtower,diun}
cd ~/docker-automation
Тази структура ще ви помогне да организирате файловете логично. 📁
Настройка на Watchtower стъпка по стъпка
Базова конфигурация
Създайте файл docker-compose.yml в директорията:
version: '3.8'
services:
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_POLL_INTERVAL=86400
- WATCHTOWER_INCLUDE_RESTARTING=true
- TZ=Europe/Sofia
Обяснение на параметрите:
WATCHTOWER_CLEANUP– изтрива старите образи автоматичноWATCHTOWER_POLL_INTERVAL– проверява на всеки 24 часа (в секунди)WATCHTOWER_INCLUDE_RESTARTING– обновява и рестартиращи контейнериTZ– часова зона за правилни логове
Добавяне на известия по имейл
Актуализирайте конфигурацията с имейл нотификации:
services:
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_POLL_INTERVAL=86400
- WATCHTOWER_NOTIFICATIONS=email
- [email protected]
- [email protected]
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
- [email protected]
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=your-app-password
- TZ=Europe/Sofia
Важно за Gmail: Използвайте App Password, не обикновената парола. 🔐
Селективно обновяване на контейнери
Можете да маркирате кои контейнери да се обновяват:
version: '3.8'
services:
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_POLL_INTERVAL=86400
- WATCHTOWER_LABEL_ENABLE=true
- TZ=Europe/Sofia
nginx:
image: nginx:latest
container_name: my-nginx
restart: unless-stopped
labels:
- "com.centurylinklabs.watchtower.enable=true"
ports:
- "80:80"
database:
image: postgres:15
container_name: my-database
restart: unless-stopped
labels:
- "com.centurylinklabs.watchtower.enable=false"
environment:
- POSTGRES_PASSWORD=secret
Само контейнерите с watchtower.enable=true ще се обновяват автоматично.
Стартиране на Watchtower
Изпълнете следната команда в директорията с файла:
docker compose up -d
Проверете дали работи правилно:
docker logs watchtower
Трябва да видите съобщения за започната проверка. ✅
Настройка на Diun стъпка по стъпка
Базова конфигурация на Diun
Създайте нова директория и файлове:
mkdir -p ~/docker-automation/diun/data
cd ~/docker-automation/diun
Създайте файл diun.yml:
watch:
workers: 10
schedule: "0 */6 * * *"
firstCheckNotif: false
defaults:
watchRepo: true
providers:
docker:
watchByDefault: true
notif:
telegram:
token: "YOUR_BOT_TOKEN"
chatIDs:
- "YOUR_CHAT_ID"
Обяснение на конфигурацията:
schedule– проверява на всеки 6 часа (cron формат)workers– брой паралелни проверкиwatchByDefault– наблюдава всички контейнери автоматичноwatchRepo– проверява целия repository за тагове
Създаване на Docker Compose файл за Diun
Създайте docker-compose.yml в същата директория:
version: '3.8'
services:
diun:
image: crazymax/diun:latest
container_name: diun
restart: unless-stopped
volumes:
- ./diun.yml:/diun.yml:ro
- ./data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Sofia
- LOG_LEVEL=info
- LOG_JSON=false
Настройка на Telegram бот за известия
Telegram е отличен начин за бързи известия. 📱
Създаване на бот:
- Отворете Telegram и намерете @BotFather
- Изпратете команда
/newbot - Следвайте инструкциите и вземете токена
- Намерете вашия Chat ID чрез @userinfobot
Актуализирайте diun.yml:
notif:
telegram:
token: "123456789:ABCdefGHIjklMNOpqrsTUVwxyz"
chatIDs:
- "987654321"
templateBody: |
🐋 Docker Image Update Available!
📦 Image: {{ .Entry.Image }}
🏷️ New Tag: {{ .Entry.Manifest.Tag }}
📅 Created: {{ .Entry.Manifest.Created }}
Настройка на Discord webhook
Discord е друга отлична опция за екипна работа:
notif:
discord:
webhookURL: "https://discord.com/api/webhooks/YOUR_WEBHOOK_URL"
mentions:
- "@everyone"
timeout: 10s
Създаване на Discord webhook:
- Отворете Server Settings → Integrations
- Създайте нов Webhook
- Копирайте URL адреса
- Поставете го в конфигурацията
Стартиране на Diun
Стартирайте контейнера:
docker compose up -d
Проверете логовете:
docker logs -f diun
Първата проверка започва незабавно след стартиране. 🎉
Комбиниране на Watchtower и Diun
Оптимална стратегия за hybrid среда
Ето как да комбинирате двата инструмента ефективно:
version: '3.8'
services:
# Diun - наблюдава всички контейнери
diun:
image: crazymax/diun:latest
container_name: diun
restart: unless-stopped
volumes:
- ./diun/diun.yml:/diun.yml:ro
- ./diun/data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Sofia
# Watchtower - обновява само маркирани контейнери
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_POLL_INTERVAL=86400
- WATCHTOWER_LABEL_ENABLE=true
- WATCHTOWER_NOTIFICATIONS=shoutrrr
- WATCHTOWER_NOTIFICATION_URL=telegram://TOKEN@telegram?channels=CHAT_ID
- TZ=Europe/Sofia
# Development контейнер - автоматично обновяване
nginx-dev:
image: nginx:latest
container_name: nginx-dev
restart: unless-stopped
labels:
- "com.centurylinklabs.watchtower.enable=true"
ports:
- "8080:80"
# Production контейнер - само известия
nginx-prod:
image: nginx:alpine
container_name: nginx-prod
restart: unless-stopped
labels:
- "com.centurylinklabs.watchtower.enable=false"
ports:
- "80:80"
# Database - никога не обновява автоматично
postgres:
image: postgres:15-alpine
container_name: postgres-db
restart: unless-stopped
labels:
- "com.centurylinklabs.watchtower.enable=false"
environment:
- POSTGRES_PASSWORD=secure_password
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Логиката на тази конфигурация:
- Diun следи всички контейнери и изпраща известия
- Watchtower обновява само development контейнери
- Production контейнери изискват ръчно обновяване
- Получавате известие преди всяко автоматично обновяване
Разширени техники и best practices
Планиране на обновявания в определени часове
Можете да зададете точно кога Watchtower да проверява:
environment:
- WATCHTOWER_SCHEDULE=0 0 4 * * *
Този cron израз означава: всеки ден в 4:00 сутринта. ⏰
Изключване на конкретни контейнери
Добавете към контейнера който НЕ искате да се обновява:
labels:
- "com.centurylinklabs.watchtower.enable=false"
Мониторинг само на конкретни тагове
В diun.yml можете да филтрирате тагове:
providers:
docker:
watchByDefault: true
watchStopped: false
defaults:
watchRepo: true
includeTags:
- "^\\d+\\.\\d+\\.\\d+$"
excludeTags:
- "latest"
- ".*-dev$"
Този пример следи само semantic версии (1.2.3) и игнорира latest и dev тагове.
Backup преди обновяване
Можете да добавите hook скриптове:
environment:
- WATCHTOWER_LIFECYCLE_HOOKS=true
- WATCHTOWER_HTTP_API_UPDATE=true
След това създайте скрипт в контейнера който се обновява:
#!/bin/sh
# Поставете в /etc/watchtower/pre-update
# Правете backup преди обновяване
docker exec postgres pg_dump -U postgres > backup_$(date +%Y%m%d).sql
Проверка на health статус след обновяване
Добавете health check към контейнерите:
nginx-prod:
image: nginx:alpine
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Watchtower ще чака health check да мине успешно. 🏥
Troubleshooting и чести проблеми
Watchtower не обновява контейнери
Проверки:
- Уверете се че имате достъп до Docker socket
- Проверете дали labels са правилно зададени
- Прегледайте логовете за грешки
docker logs watchtower --tail 100
Diun не изпраща известия
Възможни причини:
- Грешен API токен или Webhook URL
- Firewall блокира изходящи връзки
- Грешна конфигурация на cron schedule
Тестване на известията:
docker exec diun diun notif test
Контейнерите не стартират след обновяване
Решение: Добавете политика за рестартиране:
restart: unless-stopped
Проверете дали volume mount пътищата са коректни.
Високо натоварване на системата
Ако имате много контейнери:
# В diun.yml
watch:
workers: 5 # Намалете workers
schedule: "0 */12 * * *" # По-рядка проверка
# За Watchtower
environment:
- WATCHTOWER_POLL_INTERVAL=172800 # На всеки 48 часа
Заключение и следващи стъпки
Автоматизацията на Docker контейнери спестява време и намалява грешки. 🎯
Какво научихте:
- Как работят Watchtower и Diun
- Как да ги настроите стъпка по стъпка
- Как да ги комбинирате ефективно
- Best practices за production среда
Препоръки за production:
- Винаги тествайте обновяванията в staging среда първо
- Използвайте Diun за критични системи
- Правете редовни backups преди автоматични обновявания
- Документирайте вашата конфигурация
Следващи стъпки:
- Добавете мониторинг с Prometheus/Grafana
- Интегрирайте с CI/CD pipeline
- Настройте централизирано логване
- Автоматизирайте backup процесите
Сега имате всички инструменти за професионално управление на Docker контейнери! 🚀
Полезни ресурси:
- Watchtower документация: https://containrrr.dev/watchtower/
- Diun документация: https://crazymax.dev/diun/
- Docker Compose reference: https://docs.docker.com/compose/
Успех с вашата автоматизация! 💪
Намерихте материала за полезен?
Съдържанието на itpraktika.com е безплатно и ще остане такова.
Ако статията ти е помогнала — можеш да подкрепиш сайта с малка доброволна сума.
Всяко дарение помага за поддръжката и развитието на портала.
