Como usar o comando docker stack services para listar serviços

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar efetivamente o comando docker stack services para gerenciar e inspecionar serviços dentro de uma pilha Docker (Docker stack). Começaremos configurando uma pilha Docker simples usando Docker Compose, o que envolve a instalação do Docker Compose e a implantação de uma aplicação básica definida em um arquivo docker-compose.yml.

Com a pilha em execução, você explorará a funcionalidade principal do docker stack services para listar todos os serviços em uma pilha. A partir disso, você aprenderá como refinar suas listagens de serviços filtrando com base no nome e ID do serviço. Por fim, você descobrirá como personalizar o formato de saída da lista de serviços para exibir as informações que você precisa de maneira clara e organizada.

Listar todos os serviços em uma pilha

Nesta etapa, você aprenderá como listar todos os serviços em execução dentro de uma pilha Docker. Antes de podermos listar os serviços, precisamos ter uma pilha em execução. Como o Docker Compose não está pré-instalado, primeiro o instalaremos e, em seguida, implantaremos uma pilha simples.

Primeiro, vamos instalar o Docker Compose. Faremos o download do binário e o tornaremos executável.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Agora que o Docker Compose está instalado, vamos criar um arquivo docker-compose.yml simples para definir nossa pilha. Criaremos um arquivo chamado docker-compose.yml no diretório ~/project.

nano ~/project/docker-compose.yml

Adicione o seguinte conteúdo ao arquivo:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  app:
    image: alpine:latest
    command: sleep 3600

Este arquivo define uma pilha com dois serviços: web usando a imagem nginx e app usando a imagem alpine. O serviço web mapeia a porta 80 no host para a porta 80 no container. O serviço app simplesmente executa o comando sleep 3600 para manter o container em execução.

Salve o arquivo e saia do editor (Ctrl+X, Y, Enter no nano).

Agora, vamos implantar a pilha usando docker stack deploy. Vamos nomear nossa pilha mystack.

docker stack deploy -c ~/project/docker-compose.yml mystack

Este comando lê o arquivo docker-compose.yml e cria os serviços definidos nele como uma pilha Docker chamada mystack. Você deve ver a saída indicando que os serviços estão sendo criados.

Depois que a pilha for implantada, você pode listar todos os serviços na pilha usando o comando docker stack services seguido pelo nome da pilha.

docker stack services mystack

Este comando exibirá uma tabela mostrando informações sobre os serviços na pilha mystack, incluindo seu ID, nome, modo, réplicas, imagem e portas.

Você deve ver uma saída semelhante a esta:

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest
xxxxxxxxxxxx   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

A saída lista os serviços mystack_app e mystack_web, confirmando que eles estão em execução como parte da pilha mystack.

Filtrar serviços por nome

Nesta etapa, você aprenderá como filtrar a lista de serviços em uma pilha Docker com base em seus nomes. Isso é útil quando você tem muitos serviços em uma pilha e deseja ver apenas informações sobre serviços específicos.

O comando docker stack services suporta a flag --filter, que permite especificar critérios para filtrar a saída. Para filtrar por nome do serviço, você pode usar o filtro name.

A sintaxe para filtrar por nome é --filter name=<nome_do_servico>. Lembre-se de que os nomes dos serviços em uma pilha são tipicamente prefixados com o nome da pilha, seguido por um sublinhado e o nome do serviço definido no arquivo docker-compose.yml (por exemplo, mystack_web).

Vamos filtrar os serviços em nossa pilha mystack para mostrar apenas o serviço web.

docker stack services mystack --filter name=mystack_web

Este comando exibirá apenas a linha correspondente ao serviço mystack_web.

Você deve ver uma saída semelhante a esta:

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

Observe que apenas as informações do serviço mystack_web são exibidas.

Da mesma forma, você pode filtrar para ver apenas o serviço app:

docker stack services mystack --filter name=mystack_app

Isso exibirá as informações do serviço mystack_app:

ID             NAME                 MODE         REPLICAS   IMAGE
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest

Usar o filtro name permite que você encontre e visualize rapidamente detalhes de serviços específicos dentro de uma pilha grande.

Filtrar serviços por ID

Nesta etapa, você aprenderá como filtrar a lista de serviços em uma pilha Docker com base em seu ID exclusivo. Embora a filtragem por nome seja frequentemente mais intuitiva, a filtragem por ID é útil quando você precisa ser absolutamente preciso ou quando lida com serviços que podem ter nomes semelhantes.

Cada serviço em uma pilha Docker recebe um ID exclusivo. Você pode ver esses IDs na primeira coluna da saída de docker stack services.

Para filtrar por ID do serviço, você usa a flag --filter com o filtro id. A sintaxe é --filter id=<service_id>. Você só precisa fornecer um prefixo suficiente do ID para identificar exclusivamente o serviço.

Primeiro, vamos listar todos os serviços novamente para obter seus IDs.

docker stack services mystack

Observe a saída e identifique os IDs dos serviços mystack_web e mystack_app. Os IDs serão uma string de caracteres hexadecimais. Por exemplo, a saída pode ser semelhante a esta (seus IDs serão diferentes):

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest
yyyyyyyyyyyy   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

Digamos que o ID para mystack_web comece com yyyyyyyyyyyy. Você pode filtrar por este ID (ou um prefixo exclusivo mais curto) assim:

docker stack services mystack --filter id=yyyyyyyyyyyy

Substitua yyyyyyyyyyyy pelo início real do ID do seu serviço mystack_web.

Este comando exibirá apenas a linha do serviço com o ID correspondente.

Você deve ver uma saída semelhante a esta, mostrando apenas o serviço mystack_web:

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
yyyyyyyyyyyy   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

Da mesma forma, você pode filtrar pelo ID do serviço mystack_app. Encontre seu ID na saída de docker stack services mystack e use-o no filtro. Por exemplo, se o ID começar com xxxxxxxxxxxx:

docker stack services mystack --filter id=xxxxxxxxxxxx

Substitua xxxxxxxxxxxx pelo início real do ID do seu serviço mystack_app.

Isso exibirá as informações do serviço mystack_app:

ID             NAME                 MODE         REPLICAS   IMAGE
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest

A filtragem por ID fornece uma maneira precisa de direcionar serviços específicos, especialmente em scripts automatizados ou ao lidar com serviços que podem ter nomes semelhantes.

Formatar a saída da lista de serviços

Nesta etapa, você aprenderá como formatar a saída do comando docker stack services. Por padrão, a saída é exibida em um formato de tabela legível por humanos. No entanto, você pode usar a flag --format para personalizar a saída, o que é particularmente útil para scripting ou quando você precisa de informações específicas em um formato diferente.

A flag --format aceita uma string de template Go. Isso permite que você especifique exatamente quais campos exibir e como formatá-los. Campos comuns que você pode querer exibir incluem .ID, .Name, .Image, .Mode, .Replicas e .Ports.

Vamos tentar formatar a saída para mostrar apenas o ID, nome e imagem do serviço, separados por tabulações.

docker stack services mystack --format "{{.ID}}\t{{.Name}}\t{{.Image}}"

Neste comando:

  • {{.ID}}, {{.Name}} e {{.Image}} são espaços reservados (placeholders) do template Go que serão substituídos pelos respectivos valores para cada serviço.
  • \t representa um caractere de tabulação, usado aqui como um separador.

A saída agora será uma lista de serviços, com cada linha contendo o ID, nome e imagem, separados por tabulações:

xxxxxxxxxxxx mystack_app alpine:latest
yyyyyyyyyyyy mystack_web nginx:latest

(Lembre-se de que os IDs serão diferentes no seu ambiente).

Você também pode formatar a saída como uma lista, o que pode ser mais fácil de analisar em alguns casos. Por exemplo, para listar o nome do serviço e o número de réplicas:

docker stack services mystack --format "- {{.Name}} (Replicas: {{.Replicas}})"

Isso produzirá a saída:

- mystack_app (Replicas: 1/1)
- mystack_web (Replicas: 1/1)

A flag --format fornece uma maneira poderosa de adaptar a saída de docker stack services às suas necessidades específicas, tornando mais fácil a integração com outras ferramentas ou scripts.

Finalmente, vamos limpar a pilha implantada removendo-a.

docker stack rm mystack

Este comando removerá todos os serviços e redes associados à pilha mystack. Você deve ver uma saída indicando que a pilha está sendo removida.

Resumo

Neste laboratório, você aprendeu como listar serviços dentro de uma pilha Docker usando o comando docker stack services. Isso envolveu primeiro a instalação do Docker Compose e a implantação de uma pilha simples definida em um arquivo docker-compose.yml. Em seguida, você usou docker stack services <stack_name> para exibir uma tabela de todos os serviços na pilha implantada.

O laboratório também abordou a filtragem de serviços por nome e ID, permitindo que você restringisse a lista a serviços específicos. Finalmente, você explorou como formatar a saída do comando docker stack services para personalizar as informações exibidas.