Em muitos posts e opiniões gerais, há um ditado que diz "um processo por contêiner".
Por que essa regra existe? Por que não executar ntp, nginx, uwsgi e mais processos em um único contêiner que precisa ter todos os processos para funcionar?
postagens de blog mencionando esta regra:
- "Processo único por contêiner é um padrão de design recomendado para aplicativos Docker."
- "O Docker é apenas para criar contêineres de processo único ou de serviço único".
- "melhor usar um processo por contêiner"
- "Executar um único serviço como um contêiner"
- "Um processo por contêiner"
- "um processo por contêiner"
docker
containers
Evgeny
fonte
fonte
Respostas:
Vamos esquecer os argumentos arquitetônicos e filosóficos de alto nível por um momento. Embora possa haver alguns casos extremos em que várias funções em um único contêiner possam fazer sentido, há razões muito práticas pelas quais você pode considerar seguir uma "função por contêiner" como regra geral:
Note que estou dizendo função, não processo. Esse idioma está desatualizado. A documentação oficial do docker deixou de dizer "um processo" para recomendar "uma preocupação" por contêiner.
fonte
Tendo matado um contêiner de "dois processos" há alguns dias, houve alguns pontos problemáticos para mim, o que me levou a usar dois contêineres em vez de um script python que iniciou dois processos:
fonte
A recomendação vem do objetivo e do design da virtualização no nível do sistema operacional
Os contêineres foram projetados para isolar um processo para outros, fornecendo a ele seu próprio espaço de usuário e sistema de arquivos.
Essa é a evolução lógica da
chroot
qual estava fornecendo um sistema de arquivos isolado; a próxima etapa foi isolar os processos dos outros para evitar sobrescrições de memória e permitir o uso do mesmo recurso (por exemplo, porta TCP 8080, por exemplo) de vários processos sem conflitos.O principal interesse em um contêiner é empacotar a biblioteca necessária para o processo sem se preocupar com conflitos de versão. Se você executar vários processos que precisam de duas versões da mesma biblioteca no mesmo espaço de usuário e sistema de arquivos, precisará ajustar pelo menos LDPATH para cada processo, para que a biblioteca apropriada seja encontrada primeiro e algumas bibliotecas não possam ser ajustadas dessa maneira, como o caminho deles é codificado no executável no momento da compilação, consulte esta pergunta para mais detalhes.
No nível da rede, você precisará configurar cada processo para evitar o uso das mesmas portas.
A execução de vários processos no mesmo contêiner exige alguns ajustes pesados e, no final do dia, derrota o objetivo de isolamento, se você estiver apto a executar múltiplos processos no mesmo espaço de usuário, compartilhando o mesmo sistema de arquivos e recursos de rede, por que não executá-los? no próprio host?
Aqui está a lista não exaustiva dos pesados ajustes / armadilhas em que consigo pensar:
Manipulando os logs
Estar com um volume montado ou intercalado no stdout, isso traz algum gerenciamento. Se usar um volume montado, seu contêiner deve ter seu próprio "local" no host ou dois contêineres iguais lutarão pelo mesmo recurso. A intercalação no stdout para tirar proveito
docker logs
disso pode se tornar um pesadelo para análise, se as fontes não puderem ser identificadas facilmente.Cuidado com os processos zumbis
Se um de seu processo ocorrer em uma falha de contêiner, a supervisord poderá não conseguir limpar os filhos em um estado de zumbi, e o init do host nunca os herdará. Depois de esgotar o número de pids disponíveis (2 ^ 22, aproximadamente 4 milhões), um monte de coisas irá falhar.
Separação de preocupações
Se você executar duas coisas separadas, como um servidor apache e um logstash no mesmo contêiner, isso pode facilitar o manuseio do log, mas você deverá encerrar o apache para atualizar o logstash. (Na realidade, você deve usar o driver de log do Docker) Será uma parada agradável para aguardar o término ou não das sessões atuais? Se for uma parada agradável, pode demorar um pouco e demorar muito para lançar a nova versão. Se você matar, afetará os usuários de um remetente de logs e isso deve ser evitado no IMHO.
Finalmente, quando você tem vários processos, está reproduzindo um sistema operacional e, nesse caso, o uso de uma virtualização de hardware parece mais compatível com essa necessidade.
fonte
Como na maioria dos casos, não é tudo ou nada. A orientação de "um processo por contêiner" decorre da idéia de que os contêineres devem servir a um propósito distinto. Por exemplo, um contêiner não deve ser um aplicativo Web e um servidor Redis.
Há casos em que faz sentido executar vários processos em um único contêiner, desde que ambos suportem uma única função modular.
fonte
O processo que chamarei como serviço aqui, 1 contêiner ~ 1 serviço , se algum dos meus serviços falhar, apenas girarei o contêiner respectivo e, em segundos, tudo estará novamente em funcionamento. Portanto, não haverá dependências entre os serviços. É uma prática recomendada manter o tamanho do seu contêiner menor que 200 MB e máximo de 500 MB (a exceção dos contêineres nativos do Windows tem mais de 2 GB). Caso contrário, será semelhante à máquina virtual, não exatamente, mas o desempenho é suficiente. Além disso, leve em consideração alguns parâmetros como dimensionamento, como eu poderia tornar meus serviços resilientes, implantar automaticamente etc.
Além disso, é sua decisão a escolha de como fazer seus padrões arquiteturais, como microsserviço em ambiente de poligonais, usando a tecnologia de contêineres que melhor se adapta ao seu ambiente e automatizará as coisas para você.
fonte