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

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 е отличен начин за бързи известия. 📱

Създаване на бот:

  1. Отворете Telegram и намерете @BotFather
  2. Изпратете команда /newbot
  3. Следвайте инструкциите и вземете токена
  4. Намерете вашия 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:

  1. Отворете Server Settings → Integrations
  2. Създайте нов Webhook
  3. Копирайте URL адреса
  4. Поставете го в конфигурацията

Стартиране на 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 не обновява контейнери

Проверки:

  1. Уверете се че имате достъп до Docker socket
  2. Проверете дали labels са правилно зададени
  3. Прегледайте логовете за грешки

docker logs watchtower --tail 100

Diun не изпраща известия

Възможни причини:

  1. Грешен API токен или Webhook URL
  2. Firewall блокира изходящи връзки
  3. Грешна конфигурация на 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 контейнери! 🚀

Полезни ресурси:

Успех с вашата автоматизация! 💪

open source spirit
🛠️
$

Намерихте материала за полезен?

Съдържанието на itpraktika.com е безплатно и ще остане такова.
Ако статията ти е помогнала — можеш да подкрепиш сайта с малка доброволна сума. Всяко дарение помага за поддръжката и развитието на портала.

PayPal Revolut

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *


Колко е 7 + 4 ? (въведете числото)