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.\trepresenta 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.



