O que é Watchtower e por que você precisa dele
No ecossistema Docker, a gestão de atualizações de imagens é frequentemente o gargalo mais negligenciado em ambientes de produção. A prática recomendada sugere manter os containers atualizados para garantir segurança, correção de bugs e acesso às últimas funcionalidades. No entanto, fazer isso manualmente para dezenas ou centenas de serviços é inviável e propenso a erros humanos.
O Watchtower é uma solução leve, escrita em Go, que monitora os containers em execução. Ele se conecta ao registry (como o Docker Hub ou um registry privado) e verifica periodicamente se há novas versões das imagens utilizadas pelos seus containers. Se uma nova imagem for detectada, o Watchtower realiza automaticamente o processo de parada do container antigo, remoção e criação de um novo container com a imagem atualizada.
Este tutorial aborda como implementar o Watchtower em seu ambiente Docker ou Docker Compose, garantindo uma estratégia de atualização contínua robusta. Abordaremos desde a instalação básica até configurações avançadas para volumes persistentes, segurança em registry privado e técnicas de troubleshooting.
Pré-requisitos e Preparação do Ambiente
Antes de iniciar a instalação, certifique-se de que seu servidor atenda aos seguintes requisitos:
- Um servidor Linux (Ubuntu, Debian, CentOS ou similar) com privilégios de root ou usuário sudo.
- Docker Engine instalado e funcional.
- Docker Compose instalado (recomendado para gerenciamento de múltiplos serviços).
- Acesso ao Docker Hub ou configuração de credenciais para um registry privado.
Verifique a versão do seu Docker executando:
docker --version
E do Docker Compose:
docker compose version
Método 1: Instalação via Docker Compose (Recomendado)
A maneira mais limpa e isolada de rodar o Watchtower é utilizando o Docker Compose. Isso permite que você gerencie as variáveis de ambiente, volumes e políticas de atualização de forma centralizada.
Passo 1: Criar o arquivo de configuração
Crie um diretório dedicado para a infraestrutura do Watchtower:
mkdir -p ~/watchtower && cd ~/watchtower
Dentro desse diretório, crie o arquivo docker-compose.yml. Este arquivo definirá o serviço do Watchtower e suas configurações.
Passo 2: Configurar o serviço Watchtower
Edite o arquivo docker-compose.yml e insira a seguinte configuração base:
version: '3.8'
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ~/.docker/config.json:/config.json
environment:
- WATCHTOWER_POLL_INTERVAL=3600
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_INCLUDE_STOPPED=true
Analisemos os componentes críticos desta configuração:
- image: containrrr/watchtower: Utiliza a imagem oficial mantida pela comunidade, que é mais atualizada que a antiga versão do v2tec.
- volumes: /var/run/docker.sock:/var/run/docker.sock: Esta é a parte mais crítica. O Watchtower precisa de acesso ao socket da API do Docker para interagir com os outros containers. Sem esse volume, ele não poderá iniciar, parar ou criar novos containers.
- environment (WATCHTOWER_POLL_INTERVAL): Define em segundos a frequência com que o Watchtower verifica novas imagens. O padrão é 5 minutos (300s). Definimos para 3600 (1 hora) para evitar sobrecarga na CPU e na rede.
- environment (WATCHTOWER_CLEANUP): Define como
true, o que força o Docker a remover a imagem antiga após atualizar, mantendo o disco limpo.
Método 2: Instalação Direta com Docker Run
Se você prefere uma abordagem mais simples sem arquivos YAML, pode iniciar o container diretamente via linha de comando. No entanto, lembre-se de que gerenciar variáveis de ambiente e reinicialização será manual.
docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_POLL_INTERVAL=3600 \
containrrr/watchtower
Este comando inicia o container em modo detached (-d), mapeia o socket do Docker e configura o intervalo de verificação.
Configurando Volumes Persistentes e Estado
Um dos maiores medos ao automatizar atualizações é a perda de dados. É fundamental entender que o Watchtower não move dados entre containers. Ele substitui a imagem. Portanto, qualquer dado que precise sobreviver à atualização deve estar armazenado em volumes persistentes ou bind mounts declarados no container alvo, e não dentro da imagem.
Se você estiver atualizando um banco de dados, como PostgreSQL, o Watchtower só funcionará corretamente se os dados estiverem em um volume montado externamente.
volumes:
db_data:
driver: local
No container do banco de dados, o volume deve ser montado no diretório padrão de dados (ex: /var/lib/postgresql/data). O Watchtower não precisa saber sobre esse volume; ele apenas substituirá a imagem, e o novo container herdará automaticamente os volumes definidos na configuração original.
Dica de segurança: Sempre teste atualizações em um ambiente de staging antes de aplicar em produção. Se o banco de dados exigir migrações de schema durante a atualização da imagem, o Watchtower não executará scripts de migração automaticamente. Você precisará integrar isso ao processo de build da imagem ou usar ferramentas como Flyway/Liquibase dentro do container.
Integração com Registry Privado
Em ambientes corporativos, é comum utilizar registries privados (como AWS ECR, Google Container Registry ou um registry local com Harbor). O Watchtower precisa de credenciais para autenticar-se nesses serviços.
Autenticação via Docker Config
O método mais seguro é compartilhar o arquivo config.json do Docker host com o container do Watchtower. Esse arquivo contém as credenciais de login que você usa ao executar docker login.
No seu docker-compose.yml, adicione o mapeamento do volume:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ~/.docker/config.json:/config.json
Isso permite que o Watchtower baixe imagens privadas automaticamente.
Autenticação via Variáveis de Ambiente (Alternativa)
Se você não quiser compartilhar o arquivo de configuração global, pode passar as credenciais explicitamente. Note que isso expõe senhas em variáveis de ambiente, o que deve ser tratado com cuidado.
environment:
- WATCHTOWER_HTTP_API_TOKEN=seu-token-secreto
- DOCKER_REGISTRY_USER=usuario
- DOCKER_REGISTRY_PASS=sua-senha
Essas variáveis são aplicadas globalmente. Se você tiver múltiplos registries, essa abordagem pode se tornar complexa e menos recomendada.
Ajustes Finos: Exceções e Notificações
Nem todo container deve ser atualizado automaticamente. Alguns serviços podem ter dependências específicas ou exigir downtime controlado.
Excluindo Containers da Atualização
Para ignorar um container específico, defina a label com.centurylinklabs.watchtower.enable=false no seu serviço no Docker Compose:
services:
database:
image: postgres:15
labels:
com.centurylinklabs.watchtower.enable: "false"
Agora, o Watchtower ignorará este container durante suas verificações.
Notificações
Para manter a visibilidade, configure notificações via email, Slack ou webhook. O Watchtower suporta múltiplos provedores.
Exemplo de configuração para notificação por Email:
environment:
- WATCHTOWER_NOTIFICATIONS=email
- [email protected]
- [email protected]
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.seudominio.com
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=usuario-smtp
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=senha-smtp
Para Slack:
environment:
- WATCHTOWER_NOTIFICATIONS=slack
- WATCHTOWER_NOTIFICATION_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/SEU/WEBHOOK/URL
Modos de Atualização: Rolling vs Snapshot
Por padrão, o Watchtower atualiza os containers um por vez (rolling update). Isso minimiza o downtime, mas pode causar inconsistências se houver dependências entre serviços que não são gerenciadas por orquestradores como Kubernetes.
Para ambientes críticos onde você deseja parar todos os serviços e atualizá-los simultaneamente para garantir consistência de versão, use o modo snapshot:
environment:
- WATCHTOWER_ROLLING_RESTART_POLICY=snapshot
Isso fará com que o Watchtower pare todos os containers afetados antes de iniciar as atualizações.
Troubleshooting Comum
Problemas na automação de containers podem ser frustrantes. Aqui estão as causas mais frequentes e suas resoluções:
1. Watchtower não detecta novas imagens
Causa: O registry pode estar configurado para não enviar webhooks, ou o intervalo de polling está muito longo.
Solução: Verifique os logs do container com docker logs watchtower. Confirme que a tag da imagem no seu compose é dinâmica (ex: :latest ou uma tag semântica) e não um hash fixo de digest, a menos que você esteja usando o modo de monitoramento específico para digests.
2. Containers falham ao iniciar após atualização
Causa: Quebra de compatibilidade na nova versão da imagem ou variáveis de ambiente ausentes.
Solução: Sempre verifique o changelog da imagem antes de atualizar. Se um container falhar, o Watchtower não reverte automaticamente para a versão anterior por padrão (para evitar loops infinitos). Você precisará reverter manualmente o tag no docker-compose e reiniciar.
3. Erro de permissão no Docker Socket
Causa: O usuário que executa o container do Watchtower não tem permissão de leitura/escrita no /var/run/docker.sock.
Solução: Verifique se o container está sendo executado com privilégios adequados. Em sistemas Linux, isso geralmente requer que o usuário esteja no grupo docker ou que o container seja iniciado como root.
4. Consumo excessivo de CPU/Memória
Causa: Intervalo de polling muito curto (ex: 10 segundos) em um ambiente com muitos containers.
Solução: Aumente o WATCHTOWER_POLL_INTERVAL. Para a maioria dos ambientes, 3600 segundos (1 hora) é suficiente. Se você usa webhooks para notificação de novas imagens, pode reduzir ainda mais esse intervalo, pois o Watchtower não precisa poliar constantemente.
Melhores Práticas Finais
- Sempre use Tags Específicas: Evite depender exclusivamente da tag
:latest. Ela é volátil e difícil de rastrear. Prefira tags semânticas como:1.21.0ou:stable. Isso permite controle granular sobre quando atualizar. - Monitore os Logs: Configure o envio de logs para um agregador centralizado (ELK, Loki) para detectar falhas silenciosas.
- Teste em Staging: Nunca aplique automação de atualização em produção sem testar primeiro em um ambiente idêntico.
- Documente as Exceções: Mantenha um registro claro de quais containers estão excluídos do Watchtower e o porquê dessa exclusão.
A implementação do Watchtower transforma a manutenção de infraestrutura Docker de uma tarefa manual propensa a erros em um processo automatizado e confiável. Ao seguir as diretrizes deste guia, você garante que seus serviços estejam sempre seguros e atualizados, permitindo que sua equipe foque no desenvolvimento de funcionalidades ao invés de tarefas operacionais repetitivas.
Lembre-se: automação é poderosa, mas requer supervisão. Configure alertas robustos e mantenha o controle sobre as imagens em uso para garantir a estabilidade do seu ambiente.