A opção restart no Docker define como o Docker deve lidar com a reinicialização automática de containers quando eles falham ou quando o daemon é reiniciado. Uma das políticas mais utilizadas é on-failure. Nesta documentação, vamos explorar em profundidade o comportamento dessa política, suas características, e exemplos práticos de uso.
Visão Geral da Política on-failure
A política de reinicialização on-failure instrui o Docker a reiniciar o container automaticamente apenas quando ele falha, ou seja, retorna um código de saída diferente de zero (indicando erro). Isso permite que o serviço se mantenha resiliente a falhas ocasionais, como erros de execução. Se o container parar voluntariamente ou for encerrado por um comando normal, como docker stop, ele não será reiniciado.
Estrutura do Comando
A política on-failure pode ser configurada de duas formas:
1. Sem especificação de limite de tentativas:
O Docker tentará reiniciar o container indefinidamente sempre que ele falhar.
docker run --restart on-failure <container_name_or_image>
2. Com um limite de tentativas:
O Docker pode ser configurado para tentar reiniciar o container um número máximo de vezes. Se o container continuar falhando além desse limite, ele permanecerá em estado de falha.
docker run --restart on-failure:5 <container_name_or_image>
Nesse exemplo, o Docker tentará reiniciar o container até cinco vezes antes de desistir.
Comportamento da Política
1. Falha do container (Exit Status != 0):
Quando o container sai com um código de erro (diferente de zero), o Docker reinicia automaticamente o container.
2. Encerramento normal (Exit Status = 0):
Quando o container é encerrado normalmente, seja por término natural do processo principal ou por comando de parada do Docker, ele não será reiniciado. Neste caso, o código de saída será zero.
3. Limite de tentativas:
Se um limite de tentativas for definido e o container falhar continuamente, ele será reiniciado até atingir o número máximo especificado. Após o limite ser alcançado, o Docker não tentará mais reiniciar o container.
4. Comportamento após o reinício do daemon:
Ao reiniciar o daemon do Docker (ou o host onde ele está rodando), containers com a política on-failurenão serão reiniciados, a menos que tenham sido finalizados anteriormente por falhas.
Exemplo Prático
Imagine um container que executa um script Python responsável por monitorar um serviço de rede. Caso haja falha na execução do script, como um erro de conexão ou uma exceção não tratada, o container falhará com um código de saída diferente de zero, acionando a política de reinicialização.
docker run --name monitor-script --restart on-failure:3 my-python-monitor
Neste caso:
O Docker tentará reiniciar o container até três vezes caso ele continue falhando.
Se o container parar normalmente (código de saída 0), o Docker não irá reiniciá-lo.
Se as três tentativas de reinicialização falharem, o container não será mais reiniciado automaticamente.
Verificação do Status do Container
Você pode verificar o status do container para entender se ele está em um ciclo de reinicialização por falha. O comando docker ps -a exibirá o histórico de reinicializações e falhas.
docker ps -a
Isso mostrará algo como:
CONTAINER ID IMAGE STATUS RESTARTS NAME
a1b2c3d4e5f6 my-python-monitor Exited (1) 1 minute ago 3 monitor-script
Aqui podemos ver que o container monitor-script falhou e foi reiniciado três vezes antes de parar definitivamente.
Logs e Depuração
Para depurar o que causou a falha no container, os logs são uma ferramenta essencial. O comando docker logs pode ser usado para visualizar o que ocorreu durante as tentativas de execução.
docker logs <container_name_or_id>
Esse comando ajuda a identificar o ponto de falha no processo e corrigir o comportamento indesejado.
Considerações
Uso com containers críticos: O on-failure é uma política apropriada para containers críticos onde falhas são possíveis, mas o reinício pode permitir uma recuperação automática sem intervenção manual. Exemplo típico: serviços web ou de banco de dados que podem falhar devido a sobrecarga ou problemas de rede.
Limite de tentativas: Definir um número de tentativas adequado evita loops infinitos de reinicialização quando há falhas persistentes no container.
Falhas de rede temporárias: É comum configurar essa política para containers que dependem de serviços externos ou de rede. Problemas temporários, como quedas de rede, podem ser resolvidos automaticamente com a reinicialização.
Conclusão
A política restart on-failure do Docker é uma ferramenta poderosa para garantir a resiliência de containers que possam falhar ocasionalmente. Ao configurá-la adequadamente, você pode garantir que seus serviços continuem operando mesmo em caso de falhas transitórias. Por outro lado, o controle sobre o número de reinicializações evita loops intermináveis quando há falhas persistentes. É uma opção recomendada para cenários onde a alta disponibilidade é crucial.
Laboratório
Ambiente limpo:
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
$ docker volume ls
DRIVER VOLUME NAME
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
9d2935162cab bridge bridge local
73f2d51a39de host host local
9198ba9fc6fd none null local
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1748efe417e marcelodpbarbieri/simulador-caos:v1 "docker-entrypoint.s…" 12 seconds ago Up 11 seconds 0.0.0.0:8080->3000/tcp, :::8080->3000/tcp sad_villani
Se a aplicação for encerrada com erro, o container deve ser executado novamente de forma automática.
O teste poderá ser acompanhado a partir de outros terminais com os comandos "watch 'docker container ls -a'" e/ou "docker events".