Use Docker Parar Containers Sem Complicações!

Tendo problemas com o Docker para parar containers? Encontrar a maneira correta de interromper um container pode ser desafiador, dada a capacidade de criar vários containers diferentes. Neste artigo, você aprenderá os comandos do Docker para interromper um container ou todos os containers.

Continue lendo para saber mais!

Pré-requisitos

Para acompanhar este tutorial, certifique-se de ter o seguinte:

  • Windows 10 – O tutorial utiliza o Windows para executar o Docker, mas você também pode aplicar as mesmas etapas gerais no Linux ou macOS.
  • Docker Desktop – Este tutorial utiliza a versão 3.5.2. O motor Docker está disponível se você estiver no Linux, já que a interface gráfica não está.
  • A running Docker container or containers.

Encerrando Containers com o Comando docker stop Containers

Vamos começar com o primeiro comando: o comando docker stop containers e como ele interrompe os containers.

Por exemplo, talvez você precise interromper um container em execução com o nome mystifying_hofstadter e um ID de fb66ed502096. Conforme mostrado no exemplo abaixo, interrompa o container com o comando docker stop containers.

# Pare o contêiner pelo nome
docker stop mystifying_hofstadter
# Pare o contêiner pelo ID (mesmo contêiner)
docker stop fb66ed50209
Stopping a single Docker container via the container name or container ID.

E se você tiver vários contêineres em execução e gostaria de pará-los? O comando docker stop suporta parar múltiplos IDs de contêiner, um de cada vez.

Primeiro, liste todos os contêineres via o comando docker ps e passe os IDs dos contêineres para o comando docker stop, como mostrado abaixo.

# Liste todos os contêineres em execução
docker ps
# Pare os seguintes contêineres do Docker via o ID do contêiner
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
Listing all running containers and then stopping them

E se você deseja parar todos os contêineres em execução sem recuperar os IDs dos contêineres manualmente e passá-los para o docker stop? O comando docker ps -q fará isso. O parâmetro -q do comando docker ps produz apenas os IDs dos contêineres.

# Crie três contêineres. Um ponto e vírgula separa cada comando
docker run -d -t ubuntu; docker run -d -t ubuntu; docker run -d -t ubuntu
# Liste todos os contêineres em execução
docker ps -q
# Recupere todos os IDs dos contêineres em execução e passe-os para o docker stop
docker stop $(docker ps -q)
Stopping multiple Docker containers at once.

O construto $(docker ps -q) acima é uma subexpressão tanto no Bash no Linux quanto no PowerShell no Windows. Uma subexpressão instrui o shell a processar um conjunto de comandos, docker ps -q, primeiro e então retornar o conjunto de resultados para o comando original docker stop.

O comando docker stop containers usa o sinal SIGTERM. Os sinais do Linux informam um processo de um evento, mas cabe ao processo decidir como agir com base em um sinal dado.

Ao usar o sinal SIGTERM, o Docker utiliza o sinal para parar um processo de forma graciosa, aguardando 10 segundos padrão antes de enviar o sinal SIGKILL, que encerra o processo imediatamente.

Parando um Contêiner Usando Sinais de Processo

Você aprendeu sobre o comportamento padrão do Docker (sinal de parada), com o comando docker stop containers, ao parar um contêiner. Mas você pode não querer o comportamento padrão. Em vez disso, você pode instruir o Docker a usar sinais de parada alternativos.

Com a flag --stop-signal dos comandos docker run, você pode especificar o sinal de parada ao iniciar o contêiner. Essa flag define o sinal que será enviado ao contêiner em execução quando você deseja pará-lo.

No exemplo abaixo, a bandeira --stop-signal recebe o valor SIGQUIT, o que diz ao Docker para enviar o sinal SIGQUIT quando for hora de parar o contêiner. O exemplo também usa os seguintes parâmetros:

  • d – Runs the container in detached (background) mode. The detached mode will not allow the container to be immediately interacted with by the user since the process is running in the background.
  • t – allocates a Pseudo-TTY (PTY) console, which emulates a real terminal console in the container and stops the Ubuntu container from immediately exiting. The Ubuntu container in the example requires a PTY console to stay active in the background.
  • “nome da imagem” – Qual imagem do Docker usar para criar o contêiner, neste caso, a imagem ubuntu.
docker run -d -t --stop-signal SIGQUIT ubuntu
Specifying SIGQUIT as the signal when starting and then stopping a Docker container.

Você também pode especificar o sinal de parada usando um Dockerfile, que diz ao Docker como construir um contêiner. Você pode adicionar uma entrada ao Dockerfile especificando o sinal de parada com STOPSIGNAL SIGQUIT, por exemplo. Você pode substituir o SIGQUIT por qualquer sinal de parada desejado.

Saindo dos Contêineres Imediatamente com docker kill

Haverá momentos em que você desejará sair dos contêineres sem permitir-lhes um período de graça. O comando docker kill interrompe imediatamente um contêiner.

O exemplo abaixo passa o contêiner com ID 2aa318273db5 para o docker kill. O contêiner sairá imediatamente via sinal SIGKILL. O contêiner não terá permissão para sair graciosamente. Como resultado do comando, o contêiner sairá e o ID do contêiner será mostrado.

docker kill 2aa318273db5

Interromper todos os contêineres com o comando docker kill $(docker ps -q). Observe que (docker ps -q) é uma sub-expressão aqui.

Parando e Removendo um Contêiner com docker rm

Por padrão, ao criar um contêiner, esse contêiner é construído da mesma forma que antes: é idempotente. Remover um contêiner terá um impacto mínimo, e com isso em mente, o docker rm pode forçar a parada e remover um contêiner. O Docker emite um sinal SIGKILL para o processo principal e remove o contêiner da lista de contêineres disponíveis na sua instalação do Docker.

Se o contêiner precisar manter os arquivos internos modificados ou seu estado precisar ser mantido, então remover um contêiner destruirá essas alterações. Cuidado com possíveis problemas!

No exemplo a seguir, talvez você tenha iniciado um contêiner que foi atribuído o nome kind_galileo. Antes de remover um contêiner, o contêiner deve ser parado, como mostrado abaixo. O comando docker ps -a está exibindo o status de Exited para o contêiner de exemplo.

Listing all containers, including stopped containers.

Agora que o contêiner está parado, emitindo o comando docker rm removerá completamente o contêiner.

docker rm kind_galileo

Em vez de parar o contêiner para então removê-lo, a combinação de --force e docker rm irá parar e remover o contêiner em uma única operação. O contêiner, laughing_elion, não estará mais disponível para ser executado.

docker rm --force laughing_elion

Se você não especificar o comando --force, você encontrará a mensagem de erro Resposta de erro do daemon: Você não pode remover um contêiner em execução...

Stopping and removing a container.

Parando Contêineres Docker com Docker Compose

Os comandos do Docker geralmente são usados em um único contêiner, mas você pode criar um serviço com vários contêineres trabalhando em conjunto. A ferramenta Docker Compose permite configurar um serviço composto por vários contêineres para trabalhar juntos.

Como os contêineres dentro de um serviço são projetados para trabalhar juntos, é melhor parar o próprio serviço inteiro de forma graciosa em vez de qualquer contêiner individual.

Se você tiver um serviço em execução com vários contêineres, [docker-compose stop] interrompe o serviço sem remover os contêineres ou o serviço. Siga abaixo para criar um serviço Docker Compose, iniciar o serviço e, por fim, parar o serviço de forma graciosa.

1. Crie um diretório para armazenar seu arquivo de configuração. Neste exemplo, o diretório C:\Artigos\Ubuntu irá armazenar o arquivo.

mkdir C:\Articles\Ubuntu

2. Em seguida, crie o arquivo docker-compose.yml, contendo a seguinte configuração. O arquivo Docker Compose abaixo cria um serviço com dois contêineres Ubuntu e, quando iniciado, os contêineres não saem imediatamente.

# A versão da especificação do docker-compose
version: "3.9"
# A coleção de aplicativos que compõem este serviço
services:
  # Primeiro contêiner Ubuntu
  container1:
    image: ubuntu
    # O mesmo que a opção -t e aloca um Pseudo-TTY, para que o contêiner não saia imediatamente.
    tty: true
  # Segundo contêiner Ubuntu
  container2:
    image: ubuntu
    tty: true

3. Em uma sessão de terminal, navegue até o diretório do seu arquivo de configuração personalizado do Docker, que neste exemplo é C:\Artigos\Ubuntu. Execute o comando docker-compose up -d para gerar e iniciar o serviço criado no passo anterior em segundo plano, conforme indicado pela opção -d.

Starting a Docker Compose service.

4. Na mesma sessão de terminal e diretório, emita o comando docker-compose stop para encerrar o serviço e os contêineres de forma adequada.

Stopping a Docker Compose service.

O comando docker-compose, assim como o comando docker, também possui os parâmetros rm --force e kill. Os parâmetros do docker-compose funcionam no serviço em vez de em um único contêiner. O comando docker-compose kill também aceita uma opção -s para especificar o sinal de parada.

Conclusão

Os contêineres do Docker são uma ferramenta poderosa para criar ambientes únicos e segmentados para uso no desenvolvimento e produção. Neste artigo, você aprendeu várias maneiras de o Docker parar um ou mais contêineres, até mesmo todos. Você também aprendeu sobre o sinal de parada padrão usado pelo Docker e como alterá-lo.

Com esse conhecimento, agora você conhece os detalhes de como parar os contêineres do Docker e como não cometer erros ao interromper os contêineres em execução. Como você planeja parar seus contêineres a partir de agora, tendo esse conhecimento recém-adquirido?

Source:
https://adamtheautomator.com/docker-stop-containers/