Estou tentando entender o Docker a partir do ponto de implantar um aplicativo que se destina a ser executado nos usuários na área de trabalho. Minha aplicação é simplesmente uma aplicação web de balão e banco de dados mongo. Normalmente eu instalaria em uma VM e encaminharia uma porta de host para o aplicativo Web convidado. Gostaria de experimentar o Docker, mas não tenho certeza de como devo usar mais de um programa. As documentações dizem que só pode haver ENTRYPOINT; portanto, como posso ter o Mongo e meu aplicativo de balão. Ou eles precisam estar em contêineres separados; nesse caso, como eles se comunicam e como isso facilita a distribuição do aplicativo?
150
Respostas:
Pode haver apenas um ENTRYPOINT, mas esse destino geralmente é um script que inicia quantos programas forem necessários. Além disso, você pode usar, por exemplo, Supervisord ou similar para cuidar de iniciar vários serviços em um único contêiner. Este é um exemplo de um contêiner de docker executando mysql, apache e wordpress em um único contêiner .
Digamos que você tenha um banco de dados usado por um único aplicativo da web. Então é provavelmente mais fácil executar os dois em um único contêiner.
Se você tiver um banco de dados compartilhado usado por mais de um aplicativo, será melhor executar o banco de dados em seu próprio contêiner e os aplicativos, cada um em seus próprios contêineres.
Há pelo menos duas possibilidades de como os aplicativos podem se comunicar quando estão em execução em contêineres diferentes:
fonte
Eu tinha requisitos similares de executar uma pilha LAMP, Mongo DB e meus próprios serviços
O Docker é uma virtualização baseada em SO, e é por isso que isola seu contêiner em torno de um processo em execução; portanto, requer pelo menos um processo em execução no FOREGROUND.
Para que você forneça seu próprio script de inicialização como ponto de entrada, seu script de inicialização se tornará um script de imagem estendido do Docker, no qual você pode empilhar qualquer número de serviços até que INICIAR PELO MENOS UM SERVIÇO PRÉVIO, O QUE DEMAIS TAMBÉM ESTÁ NO FINAL
Portanto, meu arquivo de imagem do Docker tem duas linhas abaixo no final:
No meu script, eu executo todo o MySQL, MongoDB, Tomcat etc. No final, eu executo o meu Apache como um thread em primeiro plano.
Isso me permite iniciar todos os meus serviços e manter o contêiner ativo, com o último serviço começando em primeiro plano
Espero que ajude
ATUALIZAÇÃO : Desde a última vez em que respondi a essa pergunta, surgiram coisas novas, como o Docker composite , que pode ajudá-lo a executar cada serviço em seu próprio contêiner, mas unir todos eles como dependências entre esses serviços, tente saber mais sobre o docker-compose e use-o, é uma maneira mais elegante, a menos que sua necessidade não corresponda a ele.
fonte
Discordo totalmente de algumas soluções anteriores que recomendavam a execução de ambos os serviços no mesmo contêiner. É claramente indicado na documentação que não é recomendado :
Existem bons casos de uso para supervisord ou programas similares, mas a execução de um aplicativo Web + banco de dados não faz parte deles.
Você definitivamente deve usar o docker-composite para fazer isso e orquestrar vários contêineres com responsabilidades diferentes.
fonte
Eles podem estar em contêineres separados e, de fato, se o aplicativo também foi projetado para ser executado em um ambiente maior, provavelmente o seriam.
Um sistema com vários contêineres exigiria um pouco mais de orquestração para poder exibir todas as dependências necessárias, embora no Docker v0.6.5 +, haja um novo recurso para ajudar com o incorporado no próprio Docker - Linking . No entanto, com uma solução para várias máquinas, ainda é algo que precisa ser organizado fora do ambiente do Docker.
Com dois contêineres diferentes, as duas partes ainda se comunicam por TCP / IP, mas, a menos que as portas tenham sido bloqueadas especificamente (não recomendado, pois você não conseguiria executar mais de uma cópia), teria que passar pela nova porta que o banco de dados foi exposto quanto ao aplicativo, para que ele pudesse se comunicar com o Mongo. Novamente, é algo que o Linking pode ajudar.
Para uma instalação pequena e mais simples, em que todas as dependências estão no mesmo contêiner, é possível ter o banco de dados e o tempo de execução do Python iniciados pelo programa chamado inicialmente como ENTRYPOINT. Isso pode ser tão simples quanto um script de shell ou algum outro controlador de processo - o Supervisord é bastante popular e existem vários exemplos nos Dockerfiles públicos.
fonte
Concordo com as outras respostas de que é preferível o uso de dois contêineres, mas se você quiser empacotar vários serviços em um único contêiner, poderá usar algo como supervisord.
em Hipache por exemplo, o Dockerfile incluído executa o supervisord, e o arquivo supervisord.conf especifica a execução do hipache e do redis-server.
fonte
O Docker fornece alguns exemplos de como fazê-lo. A opção leve é:
fonte
Você pode executar 2 processos em primeiro plano usando
wait
. Basta criar um script bash com o seguinte conteúdo. Ex .start.sh
:No seu Dockerfile, inicie-o com
fonte
Se um script dedicado parecer sobrecarregar demais, você poderá gerar processos separados explicitamente
sh -c
. Por exemplo:fonte