Como usar o comando docker compose wait para bloquear até que os serviços parem

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar efetivamente o comando docker compose wait para gerenciar o ciclo de vida dos seus serviços Docker Compose. Começaremos configurando um arquivo docker-compose.yml básico com múltiplos serviços e observando seu estado inicial após iniciá-los.

Posteriormente, você explorará a funcionalidade principal do docker compose wait para bloquear a execução até que todos os serviços dentro do seu projeto tenham parado. Em seguida, demonstraremos como usar este comando para esperar que serviços específicos parem e, finalmente, como combinar docker compose wait com a opção --down-project para um desligamento completo do projeto e operação de espera.

Crie um docker-compose.yml simples com múltiplos serviços

Nesta etapa, criaremos um arquivo docker-compose.yml simples que define dois serviços. Antes de começarmos, precisamos instalar o Docker Compose, pois ele não vem pré-instalado neste ambiente.

Primeiro, vamos baixar o binário do Docker Compose. Baixaremos a versão v2.20.2, que é compatível com a versão do Docker instalada.

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

Este comando baixa o binário do Docker Compose da página oficial de lançamentos do GitHub e o salva em /usr/local/bin/docker-compose. As partes $(uname -s) e $(uname -m) detectam automaticamente seu sistema operacional e arquitetura.

Em seguida, precisamos dar permissões de execução ao binário baixado.

sudo chmod +x /usr/local/bin/docker-compose

Agora, vamos verificar se o Docker Compose foi instalado corretamente, verificando sua versão.

docker-compose version

Você deve ver uma saída indicando a versão do Docker Compose que foi instalada.

Agora que o Docker Compose está instalado, podemos criar nosso arquivo docker-compose.yml. Este arquivo usa o formato YAML para definir os serviços, redes e volumes para sua aplicação. Criaremos um arquivo simples com dois serviços: um servidor web e um banco de dados.

Navegue até o diretório do seu projeto.

cd ~/project

Agora, crie um arquivo chamado docker-compose.yml usando o editor nano.

nano docker-compose.yml

Cole o seguinte conteúdo no editor:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: mysecretpassword

Vamos detalhar este arquivo:

  • version: '3.8' especifica a versão do formato do arquivo Docker Compose.
  • services: define os diferentes serviços que compõem sua aplicação.
  • web: define um serviço chamado web.
    • image: nginx:latest especifica que este serviço usará a imagem nginx mais recente do Docker Hub.
    • ports: mapeia a porta 80 na máquina host para a porta 80 no container web, permitindo que você acesse o servidor web do seu navegador.
  • db: define um serviço chamado db.
    • image: postgres:latest especifica que este serviço usará a imagem postgres mais recente do Docker Hub.
    • environment: define variáveis de ambiente dentro do container. Aqui, definimos a POSTGRES_PASSWORD necessária pela imagem PostgreSQL.

Salve o arquivo pressionando Ctrl + X, depois Y e, em seguida, Enter.

Você criou com sucesso um arquivo docker-compose.yml definindo dois serviços.

Inicie os serviços e observe seu estado

Nesta etapa, iniciaremos os serviços definidos em nosso arquivo docker-compose.yml e observaremos seu estado.

Primeiro, certifique-se de estar no diretório ~/project onde você criou o arquivo docker-compose.yml.

cd ~/project

Agora, use o comando docker-compose up para iniciar os serviços. A flag -d executa os containers em modo detached (destacado), o que significa que eles serão executados em segundo plano.

docker-compose up -d

Ao executar este comando pela primeira vez, o Docker Compose fará o download das imagens necessárias (nginx:latest e postgres:latest) se elas ainda não estiverem presentes em seu sistema. Isso pode levar algum tempo, dependendo da sua conexão com a internet. Após o download, ele criará e iniciará os containers para os serviços web e db.

Você deve ver uma saída indicando que as redes, volumes (se houver algum definido, embora não em nosso exemplo simples) e containers estão sendo criados e iniciados.

Para verificar o status dos serviços em execução, use o comando docker-compose ps.

docker-compose ps

Este comando lista os containers gerenciados pelo Docker Compose no diretório atual. Você deve ver os serviços web e db listados com seu estado, que deve ser Up (Em execução).

Você também pode usar o comando padrão docker ps para ver todos os containers em execução em seu sistema, incluindo aqueles iniciados pelo Docker Compose.

docker ps

Procure por containers cujos nomes são prefixados com o nome do diretório (project neste caso) seguido pelo nome do serviço (por exemplo, project-web-1, project-db-1).

Para ver os logs dos serviços, você pode usar o comando docker-compose logs. Por exemplo, para ver os logs do serviço web:

docker-compose logs web

E para o serviço db:

docker-compose logs db

Isso é útil para depurar e entender o que está acontecendo dentro de seus containers.

Você agora iniciou com sucesso os serviços definidos em seu arquivo docker-compose.yml e observou seu estado usando docker-compose ps.

Use docker compose wait para bloquear até que os serviços parem

Nesta etapa, exploraremos o comando docker compose wait, que é usado para bloquear até que os serviços atinjam um determinado estado. Por padrão, docker compose wait espera que os serviços parem.

Primeiro, certifique-se de que seus serviços estejam em execução a partir da etapa anterior. Você pode verificar isso usando docker-compose ps.

cd ~/project
docker-compose ps

Você deve ver os serviços web e db listados com o estado Up (Em execução).

Agora, abra uma nova janela de terminal ou aba. Mantenha a janela de terminal atual aberta, pois a usaremos para parar os serviços mais tarde.

Na nova janela do terminal, navegue até o diretório ~/project.

cd ~/project

Execute o comando docker compose wait. Este comando bloqueará e esperará até que todos os serviços definidos no arquivo docker-compose.yml no diretório atual tenham parado.

docker compose wait

Você notará que este comando parece travar. Isso é esperado porque os serviços estão atualmente em execução. O comando docker compose wait está esperando que eles parem.

Agora, volte para sua janela de terminal original onde os serviços estão em execução. Pararemos os serviços usando o comando docker-compose down. Este comando para e remove os containers, redes e volumes criados por docker-compose up.

cd ~/project
docker-compose down

Observe a saída na janela do terminal original. Você verá mensagens indicando que os containers estão sendo parados e removidos.

Agora, volte para a nova janela do terminal onde você executou docker compose wait. À medida que os serviços são parados pelo comando docker-compose down no outro terminal, o comando docker compose wait nesta janela detectará que os serviços pararam e sairá.

Você deve ver o prompt de comando retornar na nova janela do terminal. Isso demonstra como docker compose wait bloqueia até que os serviços especificados (todos os serviços por padrão) tenham parado.

Você usou com sucesso docker compose wait para bloquear até que todos os serviços em seu projeto parassem.

Use docker compose wait com serviços específicos

Na etapa anterior, usamos docker compose wait para esperar que todos os serviços parassem. Nesta etapa, aprenderemos como usar docker compose wait para esperar que serviços específicos atinjam um determinado estado.

Primeiro, vamos iniciar nossos serviços novamente usando docker-compose up -d. Certifique-se de estar no diretório ~/project.

cd ~/project
docker-compose up -d

Verifique se ambos os serviços estão em execução usando docker-compose ps.

docker-compose ps

Agora, abra uma nova janela de terminal ou aba. Usaremos este novo terminal para demonstrar a espera por um serviço específico.

Na nova janela do terminal, navegue até o diretório ~/project.

cd ~/project

Podemos especificar quais serviços esperar, fornecendo seus nomes após o comando docker compose wait. Por exemplo, para esperar apenas que o serviço web pare:

docker compose wait web

Semelhante à etapa anterior, este comando bloqueará porque o serviço web está atualmente em execução.

Agora, volte para sua janela de terminal original. Pararemos apenas o serviço web. Para fazer isso, podemos usar o comando docker stop com o nome do container. Você pode encontrar o nome do container usando docker ps. Provavelmente será algo como project-web-1.

cd ~/project
docker stop project-web-1

Substitua project-web-1 pelo nome real do container, se for diferente.

Observe a saída na janela do terminal original. Você verá uma mensagem indicando que o container web está sendo parado.

Agora, volte para a nova janela do terminal onde você executou docker compose wait web. À medida que o serviço web é parado, o comando docker compose wait web detectará isso e sairá.

Você deve ver o prompt de comando retornar na nova janela do terminal. Observe que o comando docker compose wait web saiu, mesmo que o serviço db ainda esteja em execução.

Para confirmar que o serviço db ainda está em execução, volte para o terminal original e execute docker-compose ps.

cd ~/project
docker-compose ps

Você deve ver o serviço db listado com o estado Up (Em execução), enquanto o serviço web não está mais listado ou mostra um estado parado.

Finalmente, vamos parar o serviço db restante.

cd ~/project
docker-compose down

Você usou com sucesso docker compose wait para bloquear até que um serviço específico parasse.

Use docker compose wait com a opção --down-project

Nesta etapa final, exploraremos a opção --down-project com docker compose wait. Esta opção é útil quando você deseja esperar que os serviços parem e, em seguida, derrubar automaticamente todo o projeto.

Primeiro, vamos garantir que nossos serviços sejam parados da etapa anterior. Você pode verificar isso usando docker-compose ps.

cd ~/project
docker-compose ps

Se algum serviço ainda estiver em execução, pare-o usando docker-compose down.

docker-compose down

Agora, vamos iniciar os serviços novamente em modo detached (desanexado).

cd ~/project
docker-compose up -d

Verifique se ambos os serviços estão em execução.

docker-compose ps

Agora, usaremos o comando docker compose wait com a opção --down-project. Este comando esperará que todos os serviços parem e, em seguida, executará automaticamente docker-compose down.

docker compose wait --down-project

Semelhante aos usos anteriores de docker compose wait, este comando bloqueará porque os serviços estão atualmente em execução.

Agora, abra uma nova janela de terminal ou aba. Neste novo terminal, pararemos os serviços manualmente.

Na nova janela do terminal, navegue até o diretório ~/project.

cd ~/project

Pare os serviços usando docker-compose down.

docker-compose down

Observe a saída na nova janela do terminal. Você verá mensagens indicando que os containers estão sendo parados e removidos.

Agora, volte para a janela de terminal original onde você executou docker compose wait --down-project. À medida que os serviços são parados pelo comando docker-compose down no outro terminal, o comando docker compose wait detectará isso. Como a opção --down-project foi usada, ele prosseguirá automaticamente para derrubar o projeto, o que, neste caso, significa remover os containers, redes e volumes.

Você deve ver uma saída na janela do terminal original semelhante ao que você viu quando executou manualmente docker-compose down. Depois que o projeto for derrubado, o comando docker compose wait sairá.

Você usou com sucesso docker compose wait com a opção --down-project para esperar que os serviços parassem e, em seguida, derrubar automaticamente o projeto.

Resumo

Neste laboratório, aprendemos como usar o comando docker compose wait para bloquear até que os serviços parem. Começamos instalando o Docker Compose e criando um simples arquivo docker-compose.yml definindo dois serviços, web e db. Essa configuração forneceu o ambiente necessário para demonstrar a funcionalidade do comando wait.

Em seguida, exploramos como usar docker compose wait para bloquear até que todos os serviços definidos no arquivo docker-compose.yml parem. Também aprendemos como usar o comando com nomes de serviços específicos para esperar apenas que esses serviços parem e como usar a opção --down-project para esperar que todo o projeto seja derrubado. Essas etapas ilustraram a flexibilidade e a utilidade do comando docker compose wait para gerenciar o ciclo de vida dos serviços do Docker Compose.