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.