Como (e por que) adicionar verificações de integridade a seus contêineres Docker

Você criou sua imagem Docker, colocou-a no registro e iniciou um novo contêiner em produção. Tudo está funcionando enquanto você vai para casa durante o dia, mas você recebe relatórios de interrupção quando volta na manhã seguinte. Seu contêiner ainda está em execução, mas não está atendendo a solicitações.
Este cenário pode ser desconfortavelmente familiar para as equipes de operações que trabalham com o Docker. Veja como usar o recurso de verificação de integridade do Docker para obter dados precisos sobre a disponibilidade de seus serviços.
Como funcionam as verificações de saúde
As verificações de integridade permitem que um contêiner exponha a disponibilidade de sua carga de trabalho. Isso é diferente de o contêiner estar em execução. Se seu banco de dados cair, seu servidor de API não será capaz de lidar com solicitações, embora seu contêiner do Docker ainda esteja em execução.
Isso torna experiências inúteis durante a solução de problemas. Um docker ps simples informaria o contêiner como disponível. Adicionar uma verificação de integridade estende a saída do docker ps para incluir o verdadeiro estado do contêiner.
Você configura as verificações de integridade do contêiner em seu Dockerfile. Isso aceita um comando que o daemon do Docker executará a cada 30 segundos. O Docker usa o código de saída do comando para determinar a integridade do seu contêiner:
- 0 – O contêiner está íntegro e funcionando normalmente.
- 1 – O contêiner não é saudável; a carga de trabalho pode não estar funcionando.
- 2 – Este código de status é reservado pelo Docker e não deve ser usado.
Quando HEALTHCHECK está presente em um Dockerfile, você verá a integridade do contêiner na coluna STATUS ao executar o docker ps.

A salubridade não é verificada imediatamente quando os contêineres são criados. O status será mostrado como inicial antes da execução da primeira verificação. Isso dá ao contêiner tempo para executar qualquer tarefa de inicialização. Um contêiner com uma verificação de integridade aprovada será mostrado como íntegro; um contêiner não íntegro exibe não íntegro.
Escrevendo comandos de verificação de integridade
As verificações de integridade do contêiner são configuradas com a instrução HEALTHCHECK em seu Dockerfile. Você deve usar um comando de verificação de integridade apropriado para o seu contêiner. Para servidores da web, o curl oferece uma maneira fácil de realizar uma verificação básica de prontidão. Execute ping em um endpoint conhecido que deve estar disponível sempre que seu serviço estiver ativo.
DE nginx: o mais recente HEALTHCHECK CMD curl --fail http: // localhost / api / healthcheck || saída 1
Este exemplo marcaria o contêiner como não íntegro se o endpoint do servidor &’ s / api / healthcheck emitisse um status de erro.
Você pode usar o docker inspect para ver a saída dos comandos de verificação de integridade. Isso é útil quando você está depurando sua instrução HEALTHCHECK.
docker inspect --format = '{}' my-container
Substitua my-container pelo ID ou nome do container que deseja inspecionar. Esses detalhes são exibidos na saída docker ps.
Personalização de verificações de saúde
O Docker permite que você personalize a frequência das verificações de saúde. Você também pode alterar os critérios que marcam um contêiner como não íntegro.
Existem quatro opções disponíveis:
- --interval – Defina o tempo entre as verificações de saúde. Isso permite que você substitua o valor padrão de 30 segundos. Use um intervalo maior para aumentar o tempo entre as verificações. Isso ajuda se você tiver um serviço de baixa prioridade em que verificações regulares de integridade podem afetar o desempenho. Use uma frequência mais regular para serviços críticos.
- --start-period – Defina a duração após o início de um contêiner, quando as verificações de integridade devem ser ignoradas. O comando ainda será executado, mas um status não íntegro não será contado. Isso dá aos contêineres tempo para concluir os procedimentos de inicialização.
- --retries – Isso permite que você exija várias falhas sucessivas antes que um contêiner seja marcado como não íntegro. O padrão é 3. Se uma verificação de integridade falhar, mas a subsequente for aprovada, o contêiner não fará a transição para não íntegra. Ele se tornará insalubre após três falhas consecutivas nas verificações.
- --timeout – Defina o tempo limite para comandos de verificação de integridade. O Docker tratará a verificação como falha se o comando não sair dentro deste período de tempo.
As opções são passadas como sinalizadores para a instrução HEALTHCHECK. Forneça-os antes do comando de verificação de saúde:
HEALTHCHECK --interval = 60s --retries = 5 CMD curl --fail http: // localhost || saída 1
Esta configuração instrui o Docker a executar curl a cada 60 segundos. O contêiner será marcado como não íntegro se cinco testes consecutivos tiverem um código de saída diferente de zero.
Formato do comando
A sintaxe do comando HEALTHCHECK oferece suporte a um CMD simples ou a uma matriz de exec do estilo de ponto de entrada. Você também pode passar NONE em vez de CMD para desativar verificações de saúde:
[PRÉ] VERIFICAÇÃO DE SAÚDE NENHUMA
Isso permite que você iniba as verificações de integridade de sua imagem de base. Cada instrução HEALTHCHECK substitui todas as instruções anteriores nas camadas da sua imagem.
E quanto ao Docker Compose?
O Docker Compose também oferece suporte a definições de verificação de integridade. Adicione uma seção de verificação de integridade ao seu serviço :.
versão: " 3 " serviços: app: image: nginx: portas mais recentes: - 80:80 healthcheck: test: curl --fail http: // localhost || intervalo de saída 1: tentativas 10s: 5 start_period: tempo limite 5s: 10s
A chave de teste define o comando a ser executado. As outras chaves mapeiam para os parâmetros aceitos pela instrução Dockerfile HEALTHCHECK.
Resumo
Definir uma instrução HEALTHCHECK torna mais fácil diagnosticar um contêiner com comportamento incorreto. Você pode acompanhar a prontidão de sua carga de trabalho independentemente do contêiner &’ s “ em execução ” estado.
As verificações de saúde são compatíveis com qualquer comando que emita um código de saída 0 ou 1. Você pode usar comandos comuns como curl e ping para inspecionar serviços da web e bancos de dados. Para um controle mais avançado, escreva um script dedicado e inclua-o em suas imagens.
Nenhum comentário