Como usar o comando docker service update para modificar um serviço

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como gerenciar e modificar efetivamente serviços Docker usando o comando docker service update. Você começará criando um serviço simples e, em seguida, explorará como escalá-lo atualizando o número de réplicas.

Além disso, você aprenderá como realizar um reinício contínuo (rolling restart) do seu serviço, adicionar ou remover portas publicadas e entender como reverter seu serviço para uma versão anterior, fornecendo habilidades essenciais para gerenciar o ciclo de vida de suas aplicações em contêineres em um ambiente Docker Swarm.

Criar um serviço simples

Nesta etapa, você aprenderá como criar um serviço Docker simples. Um serviço é um grupo de contêineres da mesma imagem. Os serviços são úteis para escalar sua aplicação e garantir alta disponibilidade.

Primeiro, vamos baixar a imagem alpine do Docker Hub. Esta imagem é muito pequena e útil para testes.

docker pull alpine

Você deve ver uma saída indicando que a imagem está sendo baixada e transferida.

Agora, vamos criar um serviço chamado my-service usando a imagem alpine. Executaremos um comando simples dentro do contêiner que imprime "Hello, LabEx!" e, em seguida, sai.

docker service create --name my-service alpine echo "Hello, LabEx!"

Este comando cria um novo serviço. A flag --name my-service dá um nome ao serviço. alpine é a imagem a ser usada, e echo "Hello, LabEx!" é o comando a ser executado dentro do contêiner.

Você deve ver uma saída semelhante a esta, indicando o ID do serviço:

<service_id>

Para verificar se o serviço foi criado com sucesso, você pode listar os serviços:

docker service ls

Você deve ver my-service listado na saída.

Atualizar réplicas do serviço

Nesta etapa, você aprenderá como escalar um serviço Docker atualizando o número de réplicas. Réplicas são cópias idênticas dos contêineres do seu serviço. Aumentar o número de réplicas permite que seu serviço lide com mais carga e forneça maior disponibilidade.

Atualmente, nosso my-service tem apenas uma réplica. Você pode ver isso na saída de docker service ls na coluna "REPLICAS".

Vamos escalar o serviço para 3 réplicas. Podemos fazer isso usando o comando docker service update com a flag --replicas.

docker service update --replicas 3 my-service

Este comando informa ao Docker Swarm para atualizar o my-service para ter 3 réplicas. O Docker Swarm criará automaticamente os contêineres adicionais necessários para atingir a contagem de réplicas desejada.

Você deve ver uma saída indicando que o serviço foi atualizado.

Para verificar se o serviço foi escalado, liste os serviços novamente:

docker service ls

Olhe para a coluna "REPLICAS" para my-service. Agora deve mostrar 3/3, indicando que 3 réplicas são desejadas e 3 estão atualmente em execução.

Você também pode inspecionar as tarefas associadas ao serviço para ver os contêineres individuais:

docker service ps my-service

Este comando mostrará o status de cada réplica (tarefa) do serviço. Você deve ver três tarefas listadas, provavelmente com o estado "Running".

Realizar um reinício gradual do serviço

Nesta etapa, você aprenderá como realizar um reinício gradual de um serviço Docker. Um reinício gradual atualiza as tarefas do serviço uma por vez, garantindo que o serviço permaneça disponível durante o processo de atualização. Isso é crucial para manter o tempo de atividade da aplicação.

Para acionar um reinício gradual, podemos usar o comando docker service update com a flag --force. Essa flag força uma nova atualização, mesmo que a configuração do serviço não tenha sido alterada.

docker service update --force my-service

Este comando iniciará um reinício gradual do my-service. O Docker Swarm irá parar e iniciar cada réplica do serviço sequencialmente.

Você deve ver uma saída indicando que o serviço foi atualizado.

Para observar o reinício gradual em andamento, você pode monitorar continuamente as tarefas do serviço:

docker service ps my-service

Execute este comando várias vezes. Você verá o "CURRENT STATE" das tarefas mudar de "Running" para "Shutdown" e, em seguida, de volta para "Running" à medida que cada réplica é reiniciada. Esse processo acontece uma réplica de cada vez, demonstrando a natureza gradual do reinício.

Depois que todas as tarefas forem reiniciadas, a saída de docker service ps my-service mostrará todas as tarefas no estado "Running" com timestamps atualizados na coluna "UPDATED".

Adicionar ou remover uma porta publicada

Nesta etapa, você aprenderá como adicionar ou remover uma porta publicada para um serviço Docker. Publicar uma porta torna uma porta dentro do contêiner acessível de fora do cluster Docker Swarm. Isso é essencial para expor sua aplicação a usuários ou outros serviços.

Nosso my-service atual não tem nenhuma porta publicada porque ele apenas executa um simples comando echo e sai. Para demonstrar a publicação de portas, vamos criar um novo serviço que executa um servidor web simples. Usaremos a imagem nginx para isso.

Primeiro, puxe a imagem nginx:

docker pull nginx

Agora, vamos criar um novo serviço chamado web-service e publicar a porta 80 do contêiner para a porta 8080 no host.

docker service create --name web-service --publish 8080:80 nginx

Este comando cria um serviço chamado web-service usando a imagem nginx. A flag --publish 8080:80 mapeia a porta 80 dentro do contêiner para a porta 8080 no host.

Você deve ver uma saída indicando o ID do serviço.

Para verificar se a porta está publicada, você pode inspecionar o serviço:

docker service inspect web-service

Procure a seção EndpointSpec na saída. Você deve ver uma entrada em Ports que mostra o mapeamento da porta publicada (por exemplo, PublishedPort: 8080, TargetPort: 80).

Agora, vamos remover a porta publicada do web-service. Podemos fazer isso usando o comando docker service update com a flag --publish-rm, especificando a porta de destino dentro do contêiner.

docker service update --publish-rm 80 web-service

Este comando remove o mapeamento da porta para a porta 80 dentro do contêiner.

Você deve ver uma saída indicando que o serviço foi atualizado.

Para verificar se a porta foi removida, inspecione o serviço novamente:

docker service inspect web-service

A seção EndpointSpec não deve mais mostrar o mapeamento da porta que você acabou de remover.

Reverter o serviço para uma versão anterior

Nesta etapa, você aprenderá como reverter um serviço Docker para uma versão anterior. A reversão é essencial quando uma nova atualização do serviço introduz problemas. O Docker Swarm acompanha as configurações anteriores do serviço, permitindo que você reverta rapidamente para um estado estável.

Primeiro, vamos simular uma atualização da qual podemos querer reverter. Vamos atualizar o web-service para usar uma versão de imagem diferente e hipotética (embora não a puxemos de fato, a estrutura do comando é o que importa para a reversão).

docker service update --image nginx:1.20.0 web-service

Este comando tenta atualizar o web-service para usar a imagem nginx:1.20.0. Em um cenário real, esta pode ser uma nova versão com um bug.

Agora, digamos que descobrimos um problema com esta atualização e queremos reverter para a versão anterior (que estava usando a imagem nginx padrão). Podemos usar o comando docker service rollback.

docker service rollback web-service

Este comando diz ao Docker Swarm para reverter o web-service para sua configuração anterior. O Docker Swarm irá parar as tarefas que executam a nova imagem e iniciar tarefas usando a versão anterior da imagem.

Você deve ver uma saída indicando que o serviço está sendo revertido.

Para verificar se a reversão foi bem-sucedida, você pode inspecionar o serviço novamente:

docker service inspect web-service

Olhe para o campo Image na saída. Ele agora deve mostrar a imagem nginx original (sem a tag :1.20.0, assumindo que você puxou a imagem padrão mais recente inicialmente).

Você também pode verificar as tarefas do serviço para ver os contêineres executando a imagem mais antiga:

docker service ps web-service

As tarefas agora devem estar executando a imagem original.

Resumo

Neste laboratório, você aprendeu a gerenciar serviços Docker usando o comando docker service update. Você começou criando um serviço simples usando a imagem alpine e um comando echo básico.

Posteriormente, você explorou as principais operações de atualização de serviço. Você escalou o serviço modificando o número de réplicas, realizou um reinício contínuo (rolling restart) para atualizar as tarefas do serviço sem tempo de inatividade e aprendeu como adicionar ou remover portas publicadas para expor o serviço externamente. Finalmente, você praticou a reversão do serviço para uma versão anterior, demonstrando como reverter as alterações se uma atualização causar problemas. Essas etapas forneceram experiência prática no gerenciamento do ciclo de vida e da configuração de serviços Docker.