Parar Containers Docker Sem Complicações!

Tendo problemas com o Docker para parar containers? Encontrar a maneira correta de parar um container pode ser difícil, especialmente com a capacidade de criar vários containers diferentes. Neste artigo, você aprenderá comandos Docker para parar 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 usa 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á presente.
  • 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 parar um container em execução com o nome mystifying_hofstadter e um ID de fb66ed502096. Como mostrado no exemplo abaixo, pare o container com o comando docker stop containers.

# Parar o contêiner pelo nome
docker stop mystifying_hofstadter
# Parar 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 quiser pará-los? O comando docker stop suporta parar vários IDs de contêineres, um de cada vez.

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

# Listar todos os contêineres em execução
docker ps
# Parar os seguintes contêineres Docker através do 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.

# Criar 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
# Listar todos os contêineres em execução
docker ps -q
# Recuperar todos os IDs dos contêineres em execução e passá-los para 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 depois retornar o conjunto de resultados para o comando original docker stop.

O comando docker stop de contêineres utiliza o sinal SIGTERM. Sinais do Linux informam um processo de um evento, mas cabe ao processo decidir como agir em um sinal dado.

Ao usar o sinal SIGTERM, o Docker utiliza o sinal para interromper graciosamente um processo, esperando por 10 segundos antes de enviar o sinal SIGKILL, que termina 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 de contêineres, ao parar um contêiner. Mas talvez você não queira o comportamento padrão. Em vez disso, você pode instruir o Docker a usar sinais de parada alternativos.

Com a flag --stop-signal do comando 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ê quiser pará-lo.

No exemplo abaixo, a flag --stop-signal recebe o valor SIGQUIT, o que diz ao Docker para enviar o sinal SIGQUIT quando é hora de parar o contêiner. O exemplo também utiliza 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 Docker para provisionar 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 trocar o SIGQUIT por qualquer sinal de parada que desejar.

Saindo Imediatamente dos Contêineres com docker kill

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

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

docker kill 2aa318273db5

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

Parando e Removendo um Contêiner com docker rm

Por padrão, quando você cria 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 comando 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 deve manter os arquivos internos alterados ou seu estado deve ser mantido, então remover um contêiner destruirá essas alterações. Cuidado com possíveis falhas!

No exemplo a seguir, talvez você tenha iniciado um contêiner que foi designado com 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 Exited para o contêiner de exemplo.

Listing all containers, including stopped containers.

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

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 execução.

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

Comandos do Docker são tipicamente 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 que você configure um serviço composto por vários contêineres para trabalharem juntos.

Como os contêineres dentro de um serviço são projetados para funcionarem 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] para 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 iniciados, os contêineres não saem imediatamente.

# A versão de 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
    # 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. Numa sessão de terminal, navegue até o diretório do seu arquivo de configuração Docker personalizado, 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, como 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 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 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, até mesmo todos, os contêineres. Você também aprendeu sobre o sinal de parada padrão usado pelo Docker e como alterá-lo.

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

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