Como usar o comando docker compose restart para gerenciar serviços

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como gerenciar efetivamente o ciclo de vida dos seus serviços Docker usando o comando docker compose restart. Começaremos configurando uma aplicação multi-serviço simples usando Docker Compose, consistindo em um serviço web e um serviço de banco de dados.

Após a configuração, você explorará várias maneiras de utilizar o comando docker compose restart. Isso inclui reiniciar todos os serviços dentro da sua aplicação, direcionar e reiniciar um serviço específico, reiniciar um serviço sem afetar suas dependências e, finalmente, reiniciar um serviço com um período de tempo limite definido. Através desses exercícios práticos, você obterá experiência prática no controle e manutenção de suas aplicações Dockerizadas.

Prepare uma aplicação simples de múltiplos serviços

Nesta etapa, prepararemos uma aplicação multi-serviço simples que usaremos ao longo deste laboratório para praticar a reinicialização de serviços Docker. Esta aplicação consiste em dois serviços: um serviço web e um serviço de banco de dados. Definiremos esses serviços usando um arquivo Docker Compose.

Primeiro, precisamos instalar o Docker Compose. Como ele não está pré-instalado no ambiente da VM do LabEx, faremos o download e a instalação.

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

O primeiro comando baixa o binário do Docker Compose do repositório oficial 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 para baixar o binário correto. O segundo comando torna o arquivo baixado executável.

Agora, vamos verificar a instalação verificando a versão do Docker Compose.

docker-compose --version

Você deve ver uma saída semelhante a Docker Compose version v2.20.2.

Em seguida, navegue para o diretório ~/project, que é seu diretório de trabalho para este laboratório.

cd ~/project

Agora, criaremos um arquivo docker-compose.yml para definir nossa aplicação multi-serviço. Este arquivo especificará os serviços, suas imagens e quaisquer configurações necessárias.

nano docker-compose.yml

Cole o seguinte conteúdo no arquivo docker-compose.yml:

version: "3.8"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - db

  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: mysecretpassword

Neste arquivo docker-compose.yml:

  • version: '3.8' especifica a versão do formato do arquivo Docker Compose.
  • services: define os diferentes serviços em nossa aplicação.
  • O serviço web usa a imagem nginx:latest, mapeia a porta 80 no host para a porta 80 no container e depende do serviço db. Isso significa que o serviço db será iniciado antes do serviço web.
  • O serviço db usa a imagem postgres:latest e define a variável de ambiente POSTGRES_PASSWORD, que é necessária pela imagem PostgreSQL.

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

Antes de iniciar os serviços, precisamos baixar as imagens Docker necessárias.

docker pull nginx:latest
docker pull postgres:latest

Esses comandos baixam as imagens nginx:latest e postgres:latest do Docker Hub.

Finalmente, vamos iniciar os serviços definidos em nosso arquivo docker-compose.yml.

docker-compose up -d

O comando docker-compose up -d constrói, cria e inicia os serviços em segundo plano (modo detached).

Você pode verificar o status dos serviços em execução usando o seguinte comando:

docker-compose ps

Você deve ver uma saída indicando que os serviços web e db estão em execução.

Reiniciar todos os serviços

Nesta etapa, aprenderemos como reiniciar todos os serviços definidos em nosso arquivo docker-compose.yml. Reiniciar serviços é uma operação comum quando você faz alterações no código da sua aplicação, na configuração ou no próprio arquivo Docker Compose.

Para reiniciar todos os serviços, usamos o comando docker-compose restart. Este comando irá parar todos os containers em execução definidos no arquivo docker-compose.yml e, em seguida, iniciá-los novamente.

Certifique-se de estar no diretório ~/project onde seu arquivo docker-compose.yml está localizado.

cd ~/project

Agora, execute o seguinte comando para reiniciar todos os serviços:

docker-compose restart

Você verá uma saída indicando que os serviços estão sendo parados e, em seguida, iniciados.

Após a conclusão do comando, você pode verificar se os serviços foram reiniciados e estão em execução novamente usando o comando docker-compose ps.

docker-compose ps

A saída deve mostrar que os serviços web e db estão no estado Up, indicando que foram reiniciados com sucesso.

Reiniciar todos os serviços é útil quando você precisa aplicar alterações que afetam várias partes da sua aplicação ou quando deseja garantir uma reinicialização limpa de toda a pilha da aplicação.

Reiniciar um serviço específico

Nesta etapa, aprenderemos como reiniciar apenas um serviço específico dentro de nossa aplicação multi-serviço. Isso é útil quando você fez alterações em um único serviço e não precisa reiniciar toda a pilha da aplicação.

Para reiniciar um serviço específico, você usa o comando docker-compose restart seguido pelo nome do serviço que deseja reiniciar. Os nomes dos serviços são definidos em seu arquivo docker-compose.yml (em nosso caso, web e db).

Certifique-se de estar no diretório ~/project.

cd ~/project

Vamos reiniciar o serviço web.

docker-compose restart web

Você verá uma saída indicando que o serviço web está sendo parado e, em seguida, iniciado. O serviço db permanecerá em execução.

Após a conclusão do comando, verifique o status dos serviços usando docker-compose ps.

docker-compose ps

A saída deve mostrar que os serviços web e db ainda estão no estado Up. No entanto, o serviço web teria sido parado e iniciado novamente.

Agora, vamos reiniciar o serviço db.

docker-compose restart db

Você verá uma saída indicando que o serviço db está sendo parado e, em seguida, iniciado. Observe que, como o serviço web depende do serviço db, o Docker Compose também pode parar e reiniciar brevemente o serviço web para garantir que a dependência seja atendida durante a reinicialização do db.

Verifique o status do serviço novamente:

docker-compose ps

Ambos os serviços devem estar Up. Reiniciar serviços individuais permite um controle mais granular sobre o ciclo de vida da sua aplicação.

Reiniciar um serviço sem suas dependências

Na etapa anterior, vimos que reiniciar o serviço db também causou a reinicialização breve do serviço web devido à relação depends_on definida em docker-compose.yml. Em alguns casos, você pode querer reiniciar um serviço sem afetar suas dependências.

Para reiniciar um serviço sem reiniciar suas dependências, você pode usar o comando docker-compose restart com a flag --no-deps.

Certifique-se de estar no diretório ~/project.

cd ~/project

Vamos tentar reiniciar o serviço db novamente, desta vez usando a flag --no-deps.

docker-compose restart --no-deps db

Observe a saída. Você deve ver que apenas o serviço db é parado e iniciado. O serviço web, que depende do db, não é afetado.

Verifique o status do serviço usando docker-compose ps.

docker-compose ps

Ambos os serviços ainda devem estar no estado Up. Isso demonstra como reiniciar um serviço em isolamento, o que pode ser útil para depuração ou para aplicar alterações a um único serviço sem interromper outros que dependem dele.

Reiniciar um serviço com um tempo limite específico

Nesta etapa final, aprenderemos como especificar um tempo limite (timeout) para a operação de reinicialização. Quando você reinicia um serviço, o Docker Compose envia um sinal de parada ao container e espera que ele seja desligado de forma graciosa. Se o container não parar dentro de um determinado período, o Docker força um desligamento. Você pode controlar este período de espera usando a flag --timeout.

O tempo limite padrão para parar containers é de 10 segundos. Vamos tentar reiniciar o serviço web com um tempo limite mais curto de 3 segundos.

Certifique-se de estar no diretório ~/project.

cd ~/project

Agora, execute o seguinte comando para reiniciar o serviço web com um tempo limite de 3 segundos:

docker-compose restart --timeout 3 web

Você verá uma saída indicando que o serviço web está sendo parado e, em seguida, iniciado. O Docker Compose esperará no máximo 3 segundos para que o container pare graciosamente antes de forçar um desligamento.

Após a conclusão do comando, verifique o status do serviço usando docker-compose ps.

docker-compose ps

Ambos os serviços ainda devem estar no estado Up.

Usar a flag --timeout permite que você controle por quanto tempo o Docker Compose espera que um serviço pare durante uma reinicialização. Isso pode ser útil para serviços que exigem mais ou menos tempo para desligar de forma limpa.

Finalmente, vamos limpar os serviços em execução, parando-os e removendo-os.

docker-compose down

O comando docker-compose down para e remove os containers, redes e volumes criados por docker-compose up.

Resumo

Neste laboratório, aprendemos como preparar uma aplicação simples de múltiplos serviços usando o Docker Compose. Isso envolveu a instalação do Docker Compose, a verificação da instalação e a criação de um arquivo docker-compose.yml para definir dois serviços: um serviço web (nginx) e um serviço de banco de dados (postgres), com o serviço web dependendo do serviço de banco de dados.

Em seguida, exploramos várias maneiras de gerenciar esses serviços usando o comando docker compose restart. Aprendemos como reiniciar todos os serviços definidos no arquivo docker-compose.yml, reiniciar um serviço específico, reiniciar um serviço sem reiniciar suas dependências e reiniciar um serviço com um período de tempo limite (timeout) especificado. Essas etapas demonstraram a flexibilidade e o controle oferecidos pelo Docker Compose para gerenciar o ciclo de vida de aplicações multi-container.