Como atualizar automaticamente os contêineres do Docker do seu registro de imagem

0
21


O Docker é uma ferramenta que facilita a execução de aplicativos em contêineres portáteis. Um dos principais benefícios da conteinerização é que as atualizações são facilmente gerenciadas: tudo que você precisa fazer é reiniciar com um novo container, e existem ferramentas que podem automatizar todo esse processo.

RELACIONADO: Como atualizar os contêineres do Docker para aplicar atualizações de imagem

Implantação automática de contêineres do Docker

O Docker é uma ótima opção para pipelines de integração contínua/implantação contínua (CI/CD), pois ajuda a automatizar as duas etapas do processo. Os próprios Dockerfiles fornecem uma maneira de criar sua imagem de aplicativo e é bastante fácil configurar compilações automatizadas de contêineres da origem em serviços como o Github. Uma vez criado e enviado para um “registro de imagem”, qualquer servidor que execute o Docker pode baixá-lo e executá-lo.

Isso é ótimo, mas ainda envolve a execução de comandos no servidor toda vez que você deseja atualizar. Se você deseja torná-lo verdadeiramente automático, pode estar interessado em uma ferramenta chamada Torre de Vigia.

Watchtower é um utilitário executado em seu host Docker e verifica periodicamente se há atualizações nos contêineres. Se detectar uma nova versão de uma imagem de registro de contêiner, ele removerá automaticamente o contêiner e o reiniciará imediatamente.

Esse é um recurso muito atraente, mas antes de instalá-lo, é importante analisar as desvantagens. Fazer atualizações de forma totalmente automática significa que você tem menos controle sobre o tempo de implantação e pré-teste, porque toda vez que você se compromete com seu repositório e aciona uma compilação, seus contêineres em execução serão atualizados. Se você não for o proprietário da imagem em execução, ela poderá ser atualizada inesperadamente se você não a excluir da Torre de Vigia.

Se você não fizer atualizações todos os dias, é melhor usar uma GUI do Docker como o Portainer, que permite navegar pelos contêineres em execução em seus servidores e clicar em um botão para atualizá-los automaticamente. Isso lhe dá mais controle sobre o processo e pode ajudar a evitar atualizações inesperadas.

Tela de detalhes do contêiner Portainer

Se você quiser começar a usar o Portainer, leia nosso guia para configurá-lo para obter mais informações.

RELACIONADO: Como começar a usar o Portainer, uma interface do usuário da Web para o Docker

Usando a Torre de Vigia

O Watchtower é empacotado como um contêiner do Docker, por isso é muito fácil de instalar – apenas um comando o colocará em funcionamento:

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

Isso inicia um contêiner Watchtower e também cria um link que monta o docker.sock do host para que ele possa interagir com a API do Docker. Por padrão, isso verifica todos os contêineres em execução em busca de atualizações a cada 24 horas, que podem ser alteradas com o --interval bandeira.

Você também pode criar um docker-compose.yml arquivo para iniciar a Torre de Vigia como um serviço:

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/.docker/config.json:/config.json
    command: --interval 300

“Todos os contêineres em execução” provavelmente incluem algumas coisas que você prefere não atualizar inesperadamente, incluindo imagens do Docker Hub sobre as quais você não tem controle. Você pode excluir contêineres das atualizações, mas apenas colocando uma tag no contêiner que está sendo verificado.

Você precisará definir este sinalizador na linha de comando durante docker runou especifique-o no processo de compilação do contêiner usando o LABEL diretiva.

docker run -d --label=com.centurylinklabs.watchtower.enable=false nginx

LABEL com.centurylinklabs.watchtower.enable="false"

Você também pode fazer o contrário, passando o --label-enable verifique ao iniciar a Torre de Vigia e defina os contêineres como “true”.

Execute o Watchtower como um serviço do Docker Compose

Um método melhor, especialmente quando você só precisa executar o Watchtower para um único contêiner, é empacotá-lo em um contêiner existente. docker-compose.yml arquivo e crie um escopo para a Torre de Vigia procurá-lo. Neste exemplo, a imagem NGINX tem o escopo “nginx” e a Torre de Vigia está configurada para atualizar apenas contêineres com essa tag de escopo.

version: '3'

services:
  nginx:
    image: nginx
    labels:
      - "com.centurylinklabs.watchtower.scope=nginx"

  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --interval 300 --scope nginx
    labels:
      - "com.centurylinklabs.watchtower.scope=nginx"

Se você usar o Watchtower dessa maneira, empacotado em um arquivo de composição com um escopo, ele permitirá que você execute várias instâncias. No entanto, se você executar o Watchtower sem um escopo no mesmo sistema, ele substituirá essas instâncias.

Uso de registros de terceiros

Por padrão, o Watchtower só funciona com o Docker Hub e quaisquer outros registros públicos. Isso exclui certos serviços como o Github Container Registry, que requer um nome de usuário e um Personal Access Token (PAT) para extrair imagens.

Você pode adicionar configurações para registros privados criando um config.json arquivo com o seguinte conteúdo:

{
    "auths": {
        "ghcr.io": {
            "auth": "credentials"
        }
    }
}

O valor “credentials” deve ser definido como uma string codificada em base64 do seu username:password combo ou token de acesso pessoal no caso do Github.

echo -n 'username:password' | base64

Então, quando você executar a Torre de Vigia, passe uma montagem extra para isso config.json processos.

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