Docker
  • Introdução a Containeres e Docker
    • Introdução
    • O que é um container e suas vantanges
    • VM versus Container
    • Como funcionam os containers
    • Linux
    • Container sem Docker
      • cgroup
      • cpu.max
    • LxC
    • LxD
    • Containers versus Imagens
    • Arquitetura do Docker
    • Arquitetura do Docker mais a fundo
    • Projetos Open Source
  • Instalação do Docker
    • Linux
    • Windows
      • Docker Desktop
      • Rancher Desktop
      • WSL
    • Mac
    • Visual Studio Code
  • Primeiros Passos com Docker
    • Criação e listagem básica de um container
    • Interagindo com o container
    • Executando containers continuamente
      • nginx
      • docker container run
      • docker container run nginx
      • docker container run -d nginx
      • docker container exec
    • Como usar publish de porta
      • docker container stop
      • docker container start
      • docker container rm
      • docker container rm -f $(docker container ls -qa)
    • Containers e variáveis de ambiente
      • docker container run -e
  • Desafio
    • Desafio 01 - Banco de Dados Postgresql
    • Desafio 02 - Banco de Dados MySQL
    • Desafio 03 - Banco de Dados MongoDB
  • Executando a sua primeira aplicação em containers
    • Introdução
    • Preparando o container para a aplicação
    • Executando a aplicação
      • docker container cp
  • Primeiros Passos com Docker Images
    • Introdução
    • OverlayFS na Prática
    • Copy-on-Write
    • Formas de criar uma imagem Docker
    • Como funciona o Docker Commit
    • Docker Commit na Prática
      • docker commit
    • Entendendo melhor a sua imagem
      • docker image history
      • docker image inspect
    • Entrando mais a fundo na imagem
    • Como usar a imagem Docker no modo raiz
  • Avançando em imagens Docker com Dockerfile
    • O que é Dockerfile
    • Primeira Imagem com Dockerfile
      • docker image build
    • Como funciona a construção com Dockerfile
    • Possibilidades com Dockerfile
    • FROM
    • RUN
    • WORKDIR
    • COPY
    • ADD
    • LABEL
    • ENV
    • VOLUME
    • ARG
    • EXPOSE
    • USER
    • ENTRYPOINT
    • CMD
    • ENTRYPOINT versus CMD
    • Principais comandos com imagem
    • Imagem da aplicação com Dockerfile
    • Comparando Docker Commit com Dockerfile
  • Docker Registry
    • Introdução
    • Docker Hub
    • Sua imagem com o nome certo
    • Renomear imagens com Docker Tag
      • docker image tag
    • Enviando a sua primeira imagem para o Docker Hub
      • docker image push
      • docker image pull
  • Algumas boas práticas para construção de imagem
    • Um processo por container
    • Usar imagens confiáveis
    • Otimizar sempre a sua imagem
    • Uso inteligente das camadas
    • Dockerignore
  • Multistage Build
    • Introdução
    • Multistage build na prática
    • Target para fazer o build
      • docker image build --target
    • Imagem externa no Multistage build
    • Usar um estágio de build como base
  • Docker Volume
    • Introdução
      • docker volume
    • Bind Mount
    • Particularidades do Bind Mount
    • Bind Mount no Windows
    • Exemplo com Bind Mount
    • Docker Volume
      • docker volume create
      • docker volume inspect
      • docker volume ls
      • docker volume prune
      • docker volume rm
    • Onde ficam os arquivos do Docker volume?
    • Usando o volume no Dockerfile
    • Como fazer backup de um Docker Volume
    • Exemplo com Docker Volume
    • Storage tmpfs
    • Como criar algo funcional com o que aprendemos
  • Network
    • Introdução
    • Componentes do Docker Network
    • Rede Bridge na prática
      • docker network
      • docker network create
      • docker network inspect
      • docker network ls
      • docker network prune
      • docker network rm
    • Criando a sua rede bridge
      • docker network connect
      • docker network disconnect
    • Como funciona a rede bridge por dentro
    • Rede Host na prática
    • Rede none da prática
    • Como adicionar domínios no seu container
  • Aplicação 100% no Docker
    • Introdução
    • Criação da Imagem e Envio para o Docker Hub
    • Criação do Docker Network
    • Container do PostgreSQL
    • Container da Aplicação Web
    • Atualização da aplicação
  • Docker Compose
    • Introdução
      • docker compose
    • A evolução do docker compose
    • Criação básica de um Docker Compose
      • docker compose attach
      • docker compose build
      • docker compose config
      • docker compose cp
      • docker compose create
      • docker compose down
      • docker compose events
      • docker compose exec
      • docker compose images
      • docker compose kill
      • docker compose logs
      • docker compose ls
      • docker compose pause
      • docker compose port
      • docker compose ps
      • docker compose pull
      • docker compose push
      • docker compose restart
      • docker compose rm
      • docker compose run
      • docker compose scale
      • docker compose start
      • docker compose stats
      • docker compose stop
      • docker compose top
      • docker compose unpause
      • docker compose up
      • docker compose version
      • docker compose wait
      • docker compose watch
    • Variáveis de Ambiente
    • Volume Bind Mount
    • Docker Volume
    • Docker Network - Bridge
    • Docker Network - Host Driver e Add Host
    • Ordenando a execução dos containers
    • Compose com build de imagem
    • Como Parametrizar o Compose com Variáveis de Ambiente
    • Múltiplos Composes
    • Extends
    • Merge
    • Include
    • Profiles
    • Comandos importantes do Docker Compose
  • Troubleshooting
    • Introdução
    • Docker Info
    • Docker Events
    • Docker Logs
    • Docker Inspect
    • Docker Top
    • Docker Stats
    • Docker Exec
  • Resiliência e Gerenciamento de Recursos
    • Introdução
    • Docker Restart
      • Introdução
      • on-failure
      • unless-stopped
      • always
      • Docker Compose
    • Healthcheck
      • Introdução
      • Linha de Comando
      • Docker Compose
      • Direto na Imagem
    • Gerenciamento de Recurso
      • CPU
        • Como Gerenciar CPU
        • Prática
      • Memória
        • Como Gerenciar Memória
        • Prática
      • Docker Compose
  • Fazendo um ambiente mais seguro
    • Introdução
    • Docker Scout
      • Introdução
      • Verificação Simples de Imagem
      • Como adicionar um repositório
      • Primeira melhoria na imagem
  • BUSCA RÁPIDA
    • Referências
    • Comandos
      • docker commit
      • docker compose
      • docker container
      • docker image
      • docker network
      • docker volume
    • Dockerfile
Powered by GitBook
On this page
  • Visão Geral da Política unless-stopped
  • Estrutura do Comando
  • Comportamento da Política
  • Diferença entre unless-stopped e Outras Políticas
  • Exemplo Prático
  • Comportamento com o Daemon Docker
  • Exemplo de Reinicialização do Sistema
  • Verificação do Status e Logs
  • Considerações
  • Conclusão
  • Laboratório
  1. Resiliência e Gerenciamento de Recursos
  2. Docker Restart

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

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:

docker run --restart unless-stopped <container_name_or_image>

Comportamento da Política

  1. 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.

  2. 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.

  3. Parada manual do container:

    • Se o container for parado manualmente por um administrador usando o comando docker stop ou docker kill, ele não será reiniciado automaticamente, a menos que o administrador o inicie novamente manualmente.

  4. 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

Para entender melhor o comportamento do unless-stopped, é útil compará-lo com outras políticas de reinicialização do Docker:

  1. 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.

  2. 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.

  3. 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.

docker run --name meu-servidor-web --restart unless-stopped -d nginx

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:

docker stop meu-servidor-web
docker ps -a

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:

  1. Você tem dois containers em execução: um com a política always e outro com unless-stopped.

  2. 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:

  1. Verificar o status do container:

    docker ps -a

    Isso mostrará todos os containers, incluindo os que estão parados.

  2. Verificar os logs de um container:

    docker logs <container_name_or_id>

Considerações

  1. 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.

  2. 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.

  3. 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:

$ docker container rm -f $(docker container ls -qa)

Execução do container com a política unless-stopped:

$ docker container run -d -p 8080:3000 \
          --restart=unless-stopped marcelodpbarbieri/simulador-caos:v1
29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e

Container em execução:

$ docker container ls
CONTAINER ID   IMAGE                                 COMMAND                  CREATED         STATUS         PORTS                                       NAMES
29cddafe2839   marcelodpbarbieri/simulador-caos:v1   "docker-entrypoint.s…"   2 seconds ago   Up 2 seconds   0.0.0.0:8080->3000/tcp, :::8080->3000/tcp   suspicious_feistel

Monitoramento com watch. Container em execução há aproximadamente 1 minuto:

$ watch 'docker container ls -a'

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:

$ sudo systemctl stop docker
[sudo] password for marcelo:
Warning: Stopping docker.service, but it can still be activated by:
  docker.socket

O container foi interrompido:

Porém ao iniciar o Docker Daemon ele é reiniciado:

$ sudo systemctl start docker

Container em execução há 7 segundos:

Porém se o container for interrompido manualmente ele não é reiniciado:

$ docker container ls
CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS         PORTS                                       NAMES
29cddafe2839   marcelodpbarbieri/simulador-caos:v1   "docker-entrypoint.s…"   11 minutes ago   Up 2 minutes   0.0.0.0:8080->3000/tcp, :::8080->3000/tcp   suspicious_feistel

$ docker container stop 29cddafe2839
29cddafe2839

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 container start 29cddafe2839
29cddafe2839

Docker events dos testes realizados em laboratório:

$ docker events

# criação do container
2024-09-08T19:37:32.477856114-03:00 container create 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel)
2024-09-08T19:37:32.517102945-03:00 network connect 420830cc79ec2a53beb0be0365ad346976b37281d8b869685819473f5aec86b3 (container=29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e, name=bridge, type=bridge)
2024-09-08T19:37:32.768813083-03:00 container start 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel)
# aplicação encerrada com sucesso
2024-09-08T19:40:32.123177262-03:00 network disconnect 420830cc79ec2a53beb0be0365ad346976b37281d8b869685819473f5aec86b3 (container=29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e, name=bridge, type=bridge)
2024-09-08T19:40:32.136515549-03:00 container die 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (execDuration=179, exitCode=0, image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel)
# container reiniciado automaticamente
2024-09-08T19:40:32.183091866-03:00 network connect 420830cc79ec2a53beb0be0365ad346976b37281d8b869685819473f5aec86b3 (container=29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e, name=bridge, type=bridge)
2024-09-08T19:40:32.376973635-03:00 container start 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel)
# aplicação encerrada com erro
2024-09-08T19:42:25.016584238-03:00 network disconnect 420830cc79ec2a53beb0be0365ad346976b37281d8b869685819473f5aec86b3 (container=29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e, name=bridge, type=bridge)
2024-09-08T19:42:25.032069085-03:00 container die 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (execDuration=112, exitCode=1, image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel)
# container reiniciado automaticamente
2024-09-08T19:42:25.076737131-03:00 network connect 420830cc79ec2a53beb0be0365ad346976b37281d8b869685819473f5aec86b3 (container=29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e, name=bridge, type=bridge)
2024-09-08T19:42:25.367878280-03:00 container start 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel)
# Docker Daemon parado
2024-09-08T19:44:39.936901749-03:00 container kill 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel, signal=15)
2024-09-08T19:44:49.947604425-03:00 container kill 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel, signal=9)
2024-09-08T19:44:50.348544460-03:00 network disconnect 420830cc79ec2a53beb0be0365ad346976b37281d8b869685819473f5aec86b3 (container=29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e, name=bridge, type=bridge)
2024-09-08T19:44:50.359112946-03:00 container stop 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel)
2024-09-08T19:44:50.364433895-03:00 container die 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (execDuration=144, exitCode=137, image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel)
unexpected EOF

# Docker Daemon iniciado
# container reiniciado automaticamente

$ docker events
# container parado manualmente
2024-09-08T19:49:00.093004760-03:00 container kill 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel, signal=15)
2024-09-08T19:49:10.111562647-03:00 container kill 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel, signal=9)
2024-09-08T19:49:10.563175215-03:00 network disconnect bb5c97c648c3d87055eeb562372870678811f39e672292bb8fca5cc51f776501 (container=29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e, name=bridge, type=bridge)
2024-09-08T19:49:10.571735408-03:00 container stop 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel)
2024-09-08T19:49:10.576906485-03:00 container die 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (execDuration=185, exitCode=137, image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel)
# o container não foi reiniciado automaticamente
# container iniciado manualmente
2024-09-08T19:52:00.672011414-03:00 network connect bb5c97c648c3d87055eeb562372870678811f39e672292bb8fca5cc51f776501 (container=29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e, name=bridge, type=bridge)
2024-09-08T19:52:00.881759053-03:00 container start 29cddafe28393add9dbefa6c549e26fed60ad3041d848903ec8dd99132deaf3e (image=marcelodpbarbieri/simulador-caos:v1, name=suspicious_feistel)
Previouson-failureNextalways

Last updated 8 months ago