Como automatizar as atualizações de contêiner do Docker com a Torre de Vigia

0
14


A Watchtower resolve o problema comum de como atualizar os contêineres do Docker em execução quando uma nova imagem é lançada. A Torre de Vigia “observa” automaticamente seus contêineres, verificando periodicamente novas versões de suas imagens e reiniciando-as para executar a nova versão.

Neste artigo, mostraremos como usar a Watchtower para simplificar o gerenciamento de sua frota de contêineres. Também veremos as opções avançadas que você pode usar para personalizar o comportamento da Torre de Vigia.

Implementação da Torre de Vigia

A primeira etapa é iniciar uma instância do Watchtower dentro de seu próprio contêiner do Docker. Execute o seguinte comando para baixar a imagem da Torre de Vigia e criar um contêiner:

$ docker run -d --name watchtower 
    -v /var/run/docker.sock:/var/run/docker.sock 
    containrrr/watchtower

O soquete do Docker do seu host é montado no contêiner Watchtower com o -v bandeira. Isso permite que a Watchtower interaja com a instância do daemon do Docker do seu host. É necessário que a Torre de Vigia possa listar e iniciar contêineres.

É possível usar o Watchtower com um host Docker remoto. Exponha o daemon do Docker desse host em uma porta TCP e inicie o Watchtower com um DOCKER_HOST variável de ambiente em vez de uma ligação de soquete:

$ docker run -d --name watchtower 
    -e DOCKER_HOST="tcp://192.168.0.1:2375" 
    containrrr/watchtower

Se seu host do Docker estiver protegido com TLS, use a Torre de Vigia --tlsverify marque e monte seus certificados no container /etc/ssl/docker diretório:

$ docker run -d --name watchtower 
    -e DOCKER_HOST="tcp://192.168.0.1:2375" 
    -e DOCKER_CERT_PATH=/etc/ssl/docker
    -v ./certs:/etc/ssl/docker
    containrrr/watchtower --tlsverify

A Torre de Vigia foi projetada para ser executada uma vez para o host do Docker. Quando uma nova instância da Torre de Vigia é iniciada, ela limpa todos os outros contêineres da Torre de Vigia que já existem. Você pode executar várias instâncias atribuindo cada um dos escopos exclusivos, mas isso geralmente não é necessário na maioria das implementações.

Usando a Torre de Vigia

Seu contêiner Watchtower começa imediatamente a monitorar os outros contêineres em seu host do Docker. Ele pesquisará atualizações de imagem uma vez a cada 24 horas e reiniciará seus contêineres quando ocorrerem alterações.

O novo contêiner mantém as mesmas opções do original a partir do qual foram criados. As ligações de porta, montagens de volume, variáveis ​​de ambiente e quaisquer outras configurações permanecerão intactas na substituição.

A Watchtower também está ciente das dependências: quando os contêineres são vinculados, a Watchtower irá parar e iniciá-los em uma ordem lógica. Os serviços que dependem de um contêiner específico serão interrompidos antes que esse contêiner seja atualizado e restaurados quando a substituição estiver disponível. Isso garante que seus aplicativos não encontrem bugs enquanto suas dependências estão sendo atualizadas.

A Torre de Vigia envia um SIGTERM Contêineres de sinal quando você precisar que eles parem para uma atualização. Você pode alterar esse sinal colocando uma etiqueta em seus contêineres. Veja como mudar para SIGHUP em vez de SIGTERM:

$ docker run -d --label=com.centurylinklabs.watchtower.stop-signal=SIGHUP my-image

Excluindo e incluindo contêineres

Você pode personalizar quais contêineres são monitorados usando uma combinação de argumentos de comando da Torre de Vigia e tags do Docker em seus contêineres individuais. Aqui está um exemplo de como iniciar um contêiner que é excluído das atualizações da Torre de Vigia usando uma tag:

$ docker run -d --label=com.centurylinklabs.watchtower.enable=false my-image

Também é possível incluir na lista de permissões os contêineres que devem ser atualizados, em vez de excluir aqueles que não devem. Inicie a Torre de Vigia com o --label-enable flag para ativar este comportamento:

$ docker run -d --name watchtower 
    -v /var/run/docker.sock:/var/run/docker.sock 
    containrrr/watchtower --label-enable

Agora use a tag para designar alguns contêineres como qualificados para receber atualizações:

$ docker run -d --label=com.centurylinklabs.watchtower.enable=true my-image

ganchos de ciclo de vida

A Torre de Vigia pode executar scripts opcionalmente no interior seus contêineres quando ocorrem eventos específicos. Existem quatro ganchos disponíveis:

  • pre-check – Before Watchtower verifica se uma atualização está disponível para o contêiner.
  • pre-update – Depois que uma atualização foi encontrada, mas antes que o contêiner seja reiniciado.
  • post-update – Após a conclusão de uma atualização.
  • post-check – Após a conclusão de uma verificação de atualização de contêiner.

Os ganchos são configurados usando tags de contêiner. O valor da tag deve ser o caminho para um executável na imagem do contêiner. Isso será chamado toda vez que o gancho for disparado.

Aqui está um exemplo de uso do pre-update gancho:

$ docker run -d --label=com.centurylinklabs.watchtower.lifecycle.pre-update="/backup.sh --create" my-image

Os demais ganchos são configurados de forma semelhante, substituindo seu nome na tag.

Notificações e Monitoramento

A Torre de Vigia pode enviar notificações por e-mail, Slack, Microsoft Teams, Gotify e Shoutrrr quando as atualizações do contêiner estiverem disponíveis. Cada um desses mecanismos de entrega deve ser configurado separadamente definindo variáveis ​​de ambiente em seu contêiner da Torre de Vigia.

Aqui está um exemplo básico usando o Gmail:

$ docker run -d --name watchtower 
    -e WATCHTOWER_NOTIFICATIONS=email
    -e [email protected]
    -e [email protected]
    -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com
    -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
    -e [email protected]
    -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=your_gmail_app_password
    -v /var/run/docker.sock:/var/run/docker.sock 
    containrrr/watchtower

A Torre de Vigia também oferece suporte a um modo operacional em que verifica atualizações de contêiner sem aplicá-las. Você pode usar isso para ser notificado quando as atualizações estiverem disponíveis e, em seguida, reinicie seus contêineres em um momento conveniente.

Ative este modo com o --monitor-only bandeira:

$ docker run -d --name watchtower 
    -v /var/run/docker.sock:/var/run/docker.sock 
    containrrr/watchtower --monitor-only

Há também uma tag que pode ser definida em contêineres individuais para habilitá-los no modo de monitoramento:

$ docker run -d --label=com.centurylinklabs.watchtower.monitor-only=true my-image

Alterar o intervalo de sondagem de atualização

A Torre de Vigia procura novas imagens a cada 24 horas. Este intervalo pode ser alterado com o --interval bandeira ou WATCHTOWER_POLL_INTERVAL Variável ambiental. Aceita um valor em segundos.

# Update every hour
$ docker run -d --name watchtower 
    -e WATCHTOWER_POLL_INTERVAL=3600
    -v /var/run/docker.sock:/var/run/docker.sock 
    containrrr/watchtower

Alternativamente, você pode definir um agendamento de sondagem fixo usando a sintaxe cron. Isso é aceito como --schedule bandeira ou WATCHTOWER_SCHEDULE Variável ambiental.

# Update every five minutes
$ docker run -d --name watchtower 
    -e WATCHTOWER_SCHEDULE="*/5 * * * *"
    -v /var/run/docker.sock:/var/run/docker.sock 
    containrrr/watchtower

Limpando imagens antigas

A Torre de Vigia deixa a versão antiga das imagens do contêiner em seu host depois de puxar uma nova. Configuração do --cleanup bandeira ou WATCHTOWER_CLEANUP A variável de ambiente removerá as imagens antigas após uma atualização. Isso pode liberar espaço em disco significativamente ao longo do tempo.

$ docker run -d --name watchtower 
    -e WATCHTOWER_CLEANUP=true
    -v /var/run/docker.sock:/var/run/docker.sock 
    containrrr/watchtower

Execução sob demanda

O Watchtower foi projetado para ser executado como um daemon de longa duração que monitora continuamente os contêineres em busca de atualizações. Às vezes, você pode querer verificar manualmente novas imagens sob demanda. Você pode fazer isso com --run-once sinalizador de comando:

$ docker run --rm 
    -v /var/run/docker.sock:/var/run/docker.sock 
    containrrr/watchtower --run-once

Isso fará uma única tentativa de atualização para todos os seus contêineres em execução. O contêiner Torre de Vigia será então parado e removido.

Uso de registros privados

A Torre de Vigia precisa de detalhes de autenticação para verificar atualizações de imagens em registros privados. Uma maneira de provisioná-los é montando seu Docker config.json arquivo para /config.json no seu contêiner da Torre de Vigia:

$ docker run -d --name watchtower 
    -v $HOME:/.docker/config.json:/config.json
    -v /var/run/docker.sock:/var/run/docker.sock 
    containrrr/watchtower

Há uma ressalva com essa abordagem: atualizações para config.json em seu host não será necessariamente refletido dentro do contêiner. comandos como docker login ele realmente substitui o arquivo, em vez de editá-lo diretamente. Isso cria um novo inode, quebrando a montagem de vinculação do docker.

Outra maneira de fornecer credenciais de registro da Torre de Vigia é sua REPO_USER S REPO_PASS variáveis ​​Você estará logado como o usuário definido antes de tentar extrair suas imagens.

$ docker run -d --name watchtower 
    -e REPO_USER=demo-user
    -e REPO_PASS=users-password
    -v /var/run/docker.sock:/var/run/docker.sock 
    containrrr/watchtower

conclusão

A Watchtower permite automatizar as atualizações de contêiner do Docker quando novas imagens são enviadas para um registro. É um sistema altamente personalizável que suporta listas negras e brancas de contêineres, agendamento avançado com sintaxe cron e notificações enviadas a vários provedores populares.

Os parâmetros de configuração opcionais expõem recursos adicionais, como reinicializações contínuas, atualizações de contêiner que são reiniciadas e interrompidas e suporte para expor métricas que oferecem outra maneira de visualizar a atividade de atualização. Isso torna o Watchtower uma boa escolha para gerenciar um conjunto ocupado de contêineres do Docker de produção.