Docker Compose para colocar em contêiner um aplicativo MEAN Stack



Docker Compose é uma ferramenta para definir e executar vários contêineres para executar aplicativos complexos no Docker, por exemplo, contêiner um aplicativo MEAN.

Nos blogs anteriores no Docker, você deve ter lido sobre o que são imagens Docker, contêineres Docker e qual é a necessidade deles. Se você não leu sobre eles, então eu peço que você leia , antes de continuar com este blog no Docker Compose.

Depois de explorar as possibilidades que vêm com o Docker, certamente é muito empolgante aprender mais. Não é? Bem, pelo menos eu estava quando tropecei em um desafio.





Introdução ao Docker Compose

Colocar em contêiner um único aplicativo de serviço foi fácil para mim. Mas quando tive que colocar vários serviços em contêineres separados, me deparei com um obstáculo. Minha necessidade era contêiner e hospedar um aplicativo MEAN stack.

Sim, você leu certo. Um aplicativo full stack. Inicialmente, pensei que não fosse possível. Mas depois que ouvi sobre o Docker Compose, soube que todos os meus problemas seriam resolvidos.



O Docker Compose pode ser usado para criar contêineres separados (e hospedá-los) para cada uma das pilhas em um aplicativo MEAN stack. MEAN é a sigla para MongoDB Express Angular & NodeJs. A demonstração que mostrarei neste blog também é sobre o mesmo assunto.

Usando o Docker Compose, podemos hospedar cada uma dessas tecnologias em contêineres separados no mesmo host e fazer com que se comuniquem entre si. Cada contêiner irá expor uma porta para comunicação com outros contêineres.

A comunicação e o tempo de atividade desses contêineres serão mantidos pelo Docker Compose.



Então você pode perguntar, como configurar toda essa infraestrutura? Bem, então, deixe-me dar uma explicação mais detalhada.

Dockerfile

Semelhante a como giramos qualquer contêiner de aplicativo único escrevendo um dockerfile, teremos que escrever um dockerfile separado para construir cada um dos aplicativos de contêiner único. Além disso, teremos que escrever um arquivo Docker Compose que fará o trabalho real. O Docker Compose File executará os diferentes dockerfiles para criar os diferentes contêineres e permitir que eles interajam entre si.

Em nosso caso, temos um aplicativo full stack composto por MongoDB, ExpressJS, Angular e NodeJS. O MongoDB cuida do banco de dados de back end, NodeJS e ExpressJS são para renderização do lado do servidor e Angular é para front end.

App MEAN Stack - Docker Compose - Edureka

Como existem três componentes, temos que girar os contêineres para cada um dos componentes. Temos que girar os contêineres da seguinte maneira:

  1. Container 1 - Angular
  2. Container 2 - NodeJS e ExpressJS
  3. Container 3 - MongoDB

Criação de contêineres Docker

Como a primeira etapa para encaixar o aplicativo médio, vamos escrever o dockerfile para construir cada um dos componentes, começando do contêiner do Angular. Este dockerfile terá que estar presente dentro do diretório do projeto junto com o arquivo ‘package.json’. O ‘package.json’ contém os detalhes sobre qual versão das dependências precisa ser usada pelo ‘NPM’ para construir o aplicativo angular.

1. Dockerfile para front end

FROM node: 6 RUN mkdir -p / usr / src / app WORKDIR / usr / src / app COPY package.json / usr / src / app RUN npm cache clean RUN npm install COPY. / usr / src / app EXPOSE 4200 CMD ['npm', 'iniciar']

Como sempre, nosso primeiro comando é puxar uma imagem de base, e estamos puxando uma imagem de base ‘node: 6’.

Os próximos dois comandos são sobre como criar um novo diretório ‘/ usr / src / app’ dentro do Docker Container para armazenar códigos angulares e tornar este o diretório de trabalho dentro do Container.

Em seguida, estamos copiando o arquivo ‘package.json’ de nosso diretório de projeto para dentro do contêiner.

Em seguida, executamos o comando ‘npm cache clean’ que limpa o cache npm.

Depois disso, executamos o comando ‘npm install’ que inicia o download das placas de caldeira necessárias para hospedar o aplicativo Angular. Ele começa a baixar as placas de caldeira com base nas versões das dependências especificadas em ‘package.json’.

A próxima execução do comando ‘RUN’ é copiar todos os códigos e pastas presentes no diretório do projeto para dentro do contêiner.

O comando acima pede ao contêiner para expor o número da porta 4200 para comunicação com o servidor back-end para enviar solicitações feitas por usuários que acessam o cliente front-end por meio da IU da web.

Finalmente, o último comando é o comando ‘RUN’ para iniciar ‘npm’. Isso começa a executar os códigos para construir nosso aplicativo Angular.

O aplicativo Angular agora está pronto, mas não será hospedado corretamente devido à sua dependência de um servidor back-end e um banco de dados. Então, vamos prosseguir e escrever um dockerfile para armazenar o servidor back-end.

2. Dockerfile para back-end

Mesmo este dockerfile estará presente em um diretório de projeto. Este diretório também conterá o arquivo ‘package.json’ para definir as dependências do servidor Express e outros requisitos do NodeJS. Mas o mais importante, ele contém o código do projeto para oferecer suporte ao servidor de back-end.

FROM node: 6 RUN mkdir -p / usr / src / app WORKDIR / usr / src / app COPY package.json / usr / src / app RUN npm cache clean RUN npm install COPY. / usr / src / app EXPOSE 3000 CMD ['npm', 'iniciar']

Como você pode ver, existem muitas semelhanças entre os dois dockerfiles. Usamos o mesmo ‘node: 6’ como a camada de imagem de base, criamos um novo diretório dentro do contêiner, tornamos-o o diretório de trabalho e executamos o comando ‘npm install’ entre outros. Mas a única diferença é o número da porta exposto para comunicação. Nesse caso, o número da porta 3000 é definido. É aqui que o servidor será hospedado e procurará as solicitações do cliente.

3. Banco de dados

Você pode estar se perguntando por que não mencionei ‘dockerfile For Database’ no título. A razão é que, na verdade, não precisamos fazer personalização. Podemos obter imediatamente uma imagem de base ‘MongoDB’ para armazenar nossos dados e apenas expor o número da porta na qual eles podem ser acessados.

Agora, a pergunta em sua mente seria: onde eu faria isso? Bem, podemos fazer isso no Docker Compose File.

Arquivo Docker Compose

Docker Compose File é um arquivo YAML que contém detalhes sobre os serviços, redes e volumes para configurar o aplicativo Docker.

Execute o comando abaixo para encontrar a versão do seu Docker Engine.

docker -v

Executar o comando retornará a versão em execução em seu host. Com base na versão do Docker Engine em seu host, baixe uma versão apropriada do Docker Compose. Você pode procurar a versão apropriada para baixar, em Documentação oficial do Docker .

Como estou executando o Docker Engine versão 17.05.0-ce, usei o Docker Compose versão 3.

Instale o Docker Compose

Para baixar o Compose, execute o conjunto de comandos abaixo.

sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o / usr / local / bin / docker- compor sudo chmod + x / usr / local / bin / docker-compose

Observe que o número da versão no comando mudará com base na versão do Docker Engine que você está executando.

Abaixo estão os comandos que fazem parte do meu arquivo Docker Compose.

version: '3.0' # especificar docker-compose version # Definir os serviços / contêineres a serem executados services: angular: # nome da primeira compilação de serviço: angular-app # especificar o diretório das portas Dockerfile: - '4200: 4200' # especificar mapeamento de porta express: # nome da segunda construção de serviço: express-server # especificar o diretório das portas Dockerfile: - '3000: 3000' #especificar links de mapeamento de portas: - banco de dados # vincular este serviço ao banco de dados de serviço de banco de dados: # nome da terceira imagem de serviço: mongo # especificar imagem para construir o contêiner das portas: - '27017: 27017' # especificar encaminhamento de porta

Tenho certeza de que os comandos no arquivo acima não fazem sentido para você. Então, vamos resolver esse problema.

Na primeira linha de código, defini a versão do Docker Compose que estou usando. Esta é uma etapa muito importante se você deseja que o Compose funcione corretamente sem gerar nenhum erro. Certifique-se de baixar a versão Docker Compose de acordo com a versão do seu Docker Engine.

Depois disso, defini três contêineres usando a palavra-chave ‘serviços’. Esses serviços referem-se aos três componentes de minha pilha, front end, back end e banco de dados. Portanto, neste caso, o nome dos meus contêineres será o nome dos meus serviços, ou seja, 'angular', 'expresso' e 'banco de dados'.

A palavra-chave ‘build’ é usada para indicar que o dockerfile para girar esse contêiner está presente nesse diretório. Espere, você está confuso como?

É simples. O caminho precisa ser especificado após ‘build:’. Em nosso caso, ‘angular-app’ e ‘express-server’ são caminhos para dois diretórios que podem ser acessados ​​a partir do diretório onde o Docker Compose File está presente. Para nosso contêiner de banco de dados, eu simplesmente disse para usar uma base ‘image: mongo’ em vez de um caminho para dockerfile.

Para cada um desses serviços, também especifiquei os números de porta que podem ser usados ​​para receber / enviar solicitações de outros contêineres (serviços). 4200 no caso do angular, 3000 no caso do expresso e 27017 no caso do mongo.

Além disso, o contêiner expresso tem um ‘link:’ para o contêiner do banco de dados, indicando que quaisquer dados recebidos no lado do servidor serão enviados para o banco de dados onde serão armazenados.

Agora, finalmente, estamos concluindo a criação de um Compose. Para iniciar um Docker Compose e girar os três contêineres com três serviços, precisamos simplesmente executar os dois comandos a seguir a partir do diretório onde o Docker Compose File (arquivo YAML) está presente:

docker-compose build docker-compose up

O comando ‘docker-compose build’ é usado para construir / reconstruir os serviços, enquanto o comando ‘docker-compose up’ é usado para criar / iniciar os contêineres. Continue! Experimente você mesmo.

Abaixo estão as capturas de tela das imagens do Docker sendo construídas e executadas. Você pode notar que a imagem angular está sendo construída e, em seguida, marcada com o nome como ‘angular: mais recente’.

Além disso, uma imagem para Express é construída com nome e tag como ‘express: mais recente’.

Agora que a imagem foi construída, vamos tentar executá-la e, assim, girar um contêiner no processo. Abaixo está a imagem.

Abaixo está a captura de tela que diz ‘webpack: compilado com sucesso’, o que significa que os três serviços são armazenados em contêineres pelo Docker.

exemplos de programas Java applet com saída

Agora que os contêineres estão hospedados, você pode ver os serviços ativos em suas respectivas portas. Vá digitar os seguintes números de porta em seu navegador da web para interagir com a GUI do aplicativo MEAN.

localhost: 4200 - App Angular (Front-end)
localhost: 3000 - Servidor expresso e NodeJS (back-end / lado do servidor)
localhost: 27017 - MongoDB (banco de dados)

Ainda está impressionado? Espere, porque o Docker ainda não acabou! Podemos usar o comando “docker-compose scale =’ x '”para aumentar / diminuir facilmente o número de implantações. Em outras palavras, podemos criar esse número de contêineres para um serviço. Abaixo está o comando completo para dimensionar um serviço específico para '5' contêineres:

escala docker-compose = 5

Aumentar a escala dos serviços com tanta facilidade, empacotá-los e contê-los de maneira econômica é o que torna o Docker uma das melhores ferramentas de implantação e minha favorita.

Se você ainda tiver dúvidas sobre este conceito, então você pode assistir ao vídeo abaixo, onde expliquei o mesmo conceito com uma experiência prática de como configurar um Docker Compose.

Docker Compose | Containerização do aplicativo MEAN Stack | Tutorial DevOps

Agora que você aprendeu sobre o Docker, verifique o pela Edureka, uma empresa de aprendizagem online confiável com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. Este curso de Treinamento de Certificação Edureka Docker ajuda os alunos a ganhar experiência na implementação do Docker e dominá-lo.

Tem alguma questão para nós? Mencione isso na seção de comentários e entraremos em contato com você.