Header Ads

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

Os contêineres Docker devem ser descartáveis ​​e facilmente substituídos. Quando uma nova versão da imagem base de um contêiner é lançada, você deve extrair a nova imagem e iniciar uma nova instância do contêiner. Veja como gerenciar atualizações de imagens em sua frota de contêineres.

Obtendo novas imagens

A maneira básica de aplicar uma atualização de imagem é extrair a nova imagem, destruir os contêineres em execução com base na versão antiga e, em seguida, iniciar novos contêineres em seus lugares.

Este é um exemplo de contêiner usando o nginx: imagem mais recente:

 # Extrair nova imagem docker pull nginx: mais recente # Excluir o contêiner antigo pelo nome docker rm example-nginx # Iniciar um novo contêiner docker run -d -p 80:80 --name example-nginx nginx: mais recente 

O Docker carece de uma maneira integrada para detectar atualizações de imagem e substituir seus contêineres em execução. O resultado é um processo complicado de substituição manual. Ele pode ser simplificado usando o Docker Compose para iniciar seus contêineres em vez do comando simples docker run.

Substituição de contêineres pelo Docker Compose

O Docker Compose permite criar representações declarativas de pilhas de contêineres usando um arquivo docker-compose. yml. A pilha é iniciada com docker-compose up, usando a configuração contida no arquivo. Isso substitui a longa lista de sinalizadores normalmente fornecida para a execução do docker.

Publicidade

O Docker Compose tem um comando de pull embutido que irá puxar versões atualizadas de todas as imagens em sua pilha. Ainda é um procedimento de dois estágios, já que você deve executar manualmente docker-compose novamente depois.

 # Extrair todas as imagens da pilha docker-compose pull # Reiniciar a pilha # Se uma nova versão da imagem tiver sido extraída, os contêineres # que usam a tag antiga serão substituídos com novas instâncias. docker-compose up -d 

O Docker Compose oferece uma experiência mais simples e memorável em que você não precisa digitar os nomes das imagens ou lembrar os sinalizadores que você passou para o docker run. Os dois comandos podem ser rapidamente encurtados para um único alias de shell:

 alias composePullUp = "docker-compose pull & & docker-compose up -d" 

Gerenciando tags de imagem

Você precisa fazer referência à tag correta ao extrair imagens manualmente. O Docker Compose cuidará disso para você e selecionará as tags especificadas em seu docker-compose. yml.

Extrair a nova versão de uma tag não é necessariamente o mesmo que usar o lançamento mais recente de uma imagem. Se você quiser usar a versão mais recente do software dentro do contêiner, preste atenção às práticas de marcação do autor da imagem.

Como exemplo, puxando uma nova versão do node: 14 obterá a versão de patch mais recente do Node. js 14. Pulling node: latest fornecerá o Node. js mais recente versão, atualmente 16. Se um contêiner antigo estava usando esta imagem, um processo de puxar e substituir acionaria um aumento de versão principal para o binário do Node dentro do contêiner.

Reconstruindo imagens

Até agora, vimos como lidar com contêineres a partir de imagens que você está obtendo diretamente do Docker Hub ou de outro registro. As imagens que você mesmo está construindo precisam ser reconstruídas quando sua imagem de base muda.

Primeiro, reconstrua a imagem:

 compilação docker --pull -t minha-imagem: mais recente. 

Em seguida, substitua seus contêineres:

 # Exclua o contêiner antigo por nome docker rm my-container # Inicie um novo contêiner docker run -d --name my-container minha-imagem: mais recente [/ PRE ]

Publicidade

O sinalizador --pull fornecido ao docker build instrui o Docker a extrair a imagem de base referenciada em seu Dockerfile. Sem esse sinalizador, o Docker reutilizaria a referência de tag existente se a imagem já estivesse presente no sistema.

Os usuários do Docker Compose podem obter os mesmos resultados com os comandos docker-compose correspondentes:

 docker-compose build --pull docker-compose up -d 

O Compose novamente oferece um processo mais simples, embora ainda com duas fases. Você pode esquecer nomes e tags de imagem específicos, em vez de confiar no Compose para extrair imagens de base alteradas, reconstruir suas camadas sobre elas e, em seguida, recriar seus contêineres.

Software Inside Containers

Às vezes, pode ser tentador atualizar manualmente o software dentro de seus contêineres. Isso deve ser evitado, pois vai de novo aos princípios do Docker.

Executando apt-get update & & apt get upgrade -y em um cronograma (ou as contrapartes do seu gerenciador de pacotes) é a prática padrão ao administrar um servidor Linux bare metal. Normalmente, esses comandos não são executados em um contêiner do Docker, embora possam ser incluídos como parte de um Dockerfile para obter os patches de segurança mais recentes durante a criação de uma imagem.

Extrair periodicamente a imagem base e recriar seus contêineres é a maneira preferida de mantê-los atualizados. Isso fornece todas as correções de segurança upstream e encurta a vida útil de contêineres individuais. Os ambientes de contêiner não devem ser modificados após a criação de uma instância; as mudanças no sistema de arquivos devem ser limitadas a gravações em caminhos temporários e volumes Docker dedicados que sobrevivem ao contêiner.

Automatizando atualizações de contêiner

Você pode automatizar o processo de verificação de tags de imagem atualizadas e reiniciar seus contêineres usando projetos de terceiros. Watchtower é uma escolha popular que monitora contêineres em execução e os substitui quando a imagem do Docker Hub muda.

A própria Watchtower é implantada como um contêiner:

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

Publicidade

Agora você tem uma instalação da Watchtower em funcionamento. O soquete Docker do seu host é montado no contêiner Watchtower, permitindo que ele execute comandos do Docker para criar e excluir contêineres.

A Watchtower detectará automaticamente novos lançamentos de imagens no Docker Hub, transferirá-os para sua máquina e substituirá os contêineres usando a imagem. Os contêineres existentes serão encerrados e novos recipientes idênticos serão criados em seu lugar. Os mesmos sinalizadores que você deu ao docker run serão fornecidos aos contêineres de substituição.

A Watchtower só funciona com o Docker Hub por padrão. Você pode usá-lo com registros de imagens privados, fornecendo credenciais em um arquivo de configuração.

Crie um arquivo JSON com o seguinte conteúdo:

 {"auths": {"example. com": {"auth": "credentials"}}} 

Substitua example. com pelo caminho para o seu registro.

Em seguida, gere uma sequência de credenciais a partir do seu nome de usuário e senha do registro:

 echo -n 'nome de usuário: senha' | base64 

Cole a string codificada em Base64 resultante no arquivo de configuração, substituindo o texto do marcador de posição das credenciais.

Publicidade

Monte o arquivo de configuração no contêiner da Watchtower para permitir o acesso ao seu registro:

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

Conclusão

O Docker carece de qualquer mecanismo para detectar e aplicar atualizações de imagem upstream aos contêineres em execução. Você pode usar os comandos Docker CLI em sequência, docker-compose como uma abstração de nível superior ou uma ferramenta de terceiros como a Watchtower para substituir seus contêineres quando novas versões de imagem forem lançadas.

Dependendo das suas circunstâncias, você pode não sentir necessidade de atualizar os contêineres desta forma. Se sua equipe usa pipelines de CI para construir uma imagem Docker em cada confirmação, você já pode estar produzindo e implantando imagens atualizadas várias vezes ao dia. Neste caso, certifique-se de estar usando o sinalizador --pull com docker para que as correções do upstream sejam incluídas em suas imagens.

Nenhum comentário