unless-stopped
A opção restart
no Docker define como o Docker deve gerenciar a reinicialização de containers em diferentes cenários, como falhas ou reinicializações do daemon. Uma das políticas disponíveis é o unless-stopped
, que oferece um comportamento específico para containers que devem ser persistentes, exceto em casos onde o administrador os tenha explicitamente parado.
Visão Geral da Política unless-stopped
unless-stopped
A política unless-stopped
é projetada para garantir que um container seja reiniciado automaticamente, independentemente do motivo da sua interrupção, exceto quando o container foi manualmente parado pelo administrador. Isso torna essa política útil em cenários de long running services (serviços de longa duração), que devem ser mantidos ativos mesmo em caso de falhas ou reinicializações do Docker daemon ou do sistema.
Estrutura do Comando
Para iniciar um container com a política de reinicialização unless-stopped
, o comando básico é o seguinte:
Comportamento da Política
Falha do container (Exit Status != 0):
Se o container falhar devido a um erro, como um código de saída diferente de zero, o Docker tentará reiniciar o container automaticamente.
Encerramento normal (Exit Status = 0):
Mesmo que o container seja finalizado de maneira normal, com um código de saída zero (sem erros), ele será reiniciado automaticamente.
Parada manual do container:
Se o container for parado manualmente por um administrador usando o comando
docker stop
oudocker kill
, ele não será reiniciado automaticamente, a menos que o administrador o inicie novamente manualmente.
Reinicialização do daemon ou do sistema:
Quando o daemon Docker é reiniciado (por exemplo, após uma reinicialização do host ou do próprio Docker), os containers com a política
unless-stopped
serão reiniciados, desde que não tenham sido parados manualmente.
Diferença entre unless-stopped
e Outras Políticas
unless-stopped
e Outras PolíticasPara entender melhor o comportamento do unless-stopped
, é útil compará-lo com outras políticas de reinicialização do Docker:
always
:O Docker tentará reiniciar o container independentemente de como ele parou (normalmente ou por erro) e independentemente de ter sido manualmente parado pelo administrador. Mesmo após um
docker stop
, o container será reiniciado na próxima vez que o Docker ou o sistema forem reiniciados.
on-failure
:O Docker só reiniciará o container se ele falhar com um código de saída diferente de zero. Caso o container seja finalizado normalmente ou manualmente, ele não será reiniciado.
unless-stopped
:Semelhante ao
always
, exceto que o Docker não reinicia containers que foram manualmente parados pelo administrador antes de uma reinicialização do daemon ou do sistema.
Exemplo Prático
Imagine que você está executando um serviço web em um container Docker que deve estar em execução continuamente, mas você deseja ter o controle de pará-lo manualmente sem que ele seja reiniciado automaticamente após uma reinicialização do sistema.
Neste caso:
Se o container falhar ou for finalizado por qualquer razão (exceto manualmente), o Docker tentará reiniciá-lo.
Se o container for manualmente parado (usando
docker stop
), ele não será reiniciado automaticamente, mesmo após uma reinicialização do sistema.
Agora, se você verificar o status dos containers com docker ps -a
, verá que ele não reiniciou após ser manualmente parado:
Após o comando stop
, o container será mostrado como "exited" e não será reiniciado até que você o inicie novamente manualmente com docker start
.
Comportamento com o Daemon Docker
Uma das características importantes da política unless-stopped
é o comportamento em relação à reinicialização do daemon Docker. Quando o daemon Docker ou o sistema são reiniciados, o Docker restaura automaticamente os containers que estavam em execução antes da reinicialização, exceto aqueles que foram manualmente parados. Isso garante que serviços críticos sejam restaurados após interrupções no sistema.
No entanto, containers que foram explicitamente parados com docker stop
permanecerão parados após a reinicialização. Essa diferença é o que torna a política unless-stopped
uma escolha poderosa para administradores que precisam equilibrar entre manter serviços continuamente ativos e ter controle manual sobre containers quando necessário.
Exemplo de Reinicialização do Sistema
Imagine o seguinte cenário:
Você tem dois containers em execução: um com a política
always
e outro comunless-stopped
.O daemon Docker ou o sistema é reiniciado.
Após a reinicialização:
O container com a política
always
será reiniciado automaticamente, independentemente de como ele foi parado.O container com a política
unless-stopped
será reiniciado apenas se não tiver sido manualmente parado antes da reinicialização. Caso tenha sido parado manualmente, ele permanecerá parado.
Verificação do Status e Logs
Para verificar o status e logs de um container com a política unless-stopped
, você pode usar os comandos padrão do Docker:
Verificar o status do container:
Isso mostrará todos os containers, incluindo os que estão parados.
Verificar os logs de um container:
Considerações
Uso em Serviços Persistentes: A política
unless-stopped
é ideal para serviços que precisam estar em execução contínua, mas com a possibilidade de serem manualmente gerenciados (parados ou iniciados) sem que sejam reiniciados automaticamente após uma interrupção.Reinicialização do Docker: Ao reiniciar o daemon Docker, containers com
unless-stopped
que não foram explicitamente parados retornarão ao estado de execução, enquanto os parados manualmente permanecerão inativos.Containers Críticos e Controle Manual: Se você estiver lidando com containers críticos, como bancos de dados ou serviços web, a política
unless-stopped
fornece uma maneira de garantir que o serviço seja restaurado automaticamente, exceto quando houver a necessidade de manutenção ou intervenção manual.
Conclusão
A política restart unless-stopped
é uma ferramenta versátil que combina o comportamento de reinicialização automática com o controle manual sobre a execução dos containers. Ela é particularmente útil em cenários onde a continuidade do serviço é importante, mas o administrador ainda deseja controlar manualmente a parada e o início dos containers. A escolha dessa política garante resiliência aos serviços em caso de falhas, mas respeita as decisões administrativas quando um container é parado manualmente.
Laboratório
Remover todos os containers em execução:
Execução do container com a política unless-stopped:
Container em execução:
Monitoramento com watch. Container em execução há aproximadamente 1 minuto:
Encerrar a aplicação com sucesso:
O container foi iniciado automaticamente há 10 segundo:
Encerrar a aplicação com erro:
O container foi iniciado automaticamente há 4 segundos:
Derrubar o Docker Daemon. Para isso, faz-se necessário parar a execução do watch:
O container foi interrompido:
Porém ao iniciar o Docker Daemon ele é reiniciado:
Container em execução há 7 segundos:
Porém se o container for interrompido manualmente ele não é reiniciado:
O container foi interrompido com código 137:
Se o Docker Daemon for reiniciado o container não voltará a ser executado. O container continuará parado.
Ao iniciar o container a aplicação volta a funcionar com a resiliência aplicada pela política unless-stopped:
Docker events dos testes realizados em laboratório:
Last updated