Neste artigo, imostrarei o que é Docker e os conceitos de containers.
O Docker é uma plataforma para criar, compartilhar e executar aplicativos com containers. Quando você utiliza containers para implantar os seus aplicativos, você utiliza a containerização.
Os containers são:
Flexíveis: Até as aplicações mais complexas podem ser containers;
Leves: os containers aproveitam e compartilham o kernel do host, tornando-os muito mais eficientes em termos de recursos do sistema do que as máquinas virtuais;
Portáteis: você pode criá-los localmente, implantar na nuvem e executar em qualquer lugar;
Fraco acoplamento: Containers são auto-suficientes e encapsulados, isto é, permitem substituir ou atualizar um sem atrapalhar outros;
Escaláveis: Você pode distribuir automaticamente réplicas de containers por um datacenter;
São seguros: aplicam restrições e isolamentos agressivos.
Mas o que é um container?
Bsicamente, não passa de um processo que está em execução, com o porém de ser isolado do host e de outros containers. Cada container interage com seu sistema de arquivos privado, sendo esse um sistema fornecido por uma imagem do Docker. Essa imagem incluirá tudo que for necessário para executar o aplicativo.
Ele difere de uma máquina virtual pois uma VM executa um SO completo, com acesso virtual a recursos do host. Já o Docker é executado nativamente no Linux e compartilha o kernel do Host com outros containers, executando um processo discreto, tornando-o leve.
Vantagens:
Com o Docker, temos uma alta portabilidade e podemos escalar nossos apps entre nuvens e datacenters, garantindo que esses aplicativos sejam executados da mesma maneira em qualquer lugar.
Orquestradores:
São ferramentas para gerenciar, dimensionar e manter aplicativos em containers. Os exemplos mais comuns são Kubernetes e Docker Swarm.
Para os próximos passos será necessário ter uma conta no Azure. Caso você ainda não tenha uma, eu recomendo a leitura do seguinte artigo: Azure DevOps + Angular + GitHub Pages, nele eu demonstro a criação de uma nova conta e a criação de uma pipeline no Azure DevOps.
Com o passo da conta OK, a sua imagem no Docker hub(passo demonstrado no artigo anterior)e o seu projeto já publicado no Web App for Containers. Vamos agora criar a nossa pipeline no Azure DevOps. Para isso, siga os passos abaixo:
Clique em pipelines:
Criando pipeline no Azure DevOps
Em seguida clique em Create Pipeline:
Criando pipeline no Azure DevOps
Agora clique em Use the classic editor:
Selecione o local do seu repositório, para esse exemplo eu irei utilizar um projeto versionado no meu GitHub: node-azure-7-steps. Clique nos três pontos e selecione o seu projeto:
GitHub Azure DevOps
Em seguida selecione a sua branch:
Selecionando branch Azure DevOps
Agora selecione o template Docker container.
Docker no Azure DevOps
Esse template deve criar dois steps: Build an Image para criar uma nova versão da imagem do seu projeto e Push an image, para publicar a imagem no no seu repositório de imagens, nesse artigo eu irei enviar para o Docker Hub.
Build imagem docker no Azure DevOps
Agora vamos dar permissão para pipeline subir uma nova versão da sua imagem no Docker Hub. Para isso, siga os passos abaixo:
Clique em Push an image, em Container Registry Type selecione Container Registry, em seguida selecione a sua conexão.
Caso não tenha uma conta registrada ainda, clique em + New e preenche a modal com os seus dados de acesso no Docker Hub.
Em seguida clique em Include Latest Tag:
E no nome da imagem coloque o seu usuário do dockerhub e o nome da sua imagem no passo de build e release:
Build
Release
Para verificar se tudo esta OK, clique em Save & queue e rode o processo:
build imagem doker no Azure DevOps
Quando esse processo finalizar você deve receber o resultado abaixo:
Build OK Azure DevOps
Com o processo do build OK, vamos criar a nossa release. Para isso, clique em Releases -> New pipeline e selecione o template Azure App Service deployment.
Clique em Artifacts e preencha conforme os passos abaixo:
Project: nome do projeto
Source (build pipeline): sua pipeline de build
Default version: versão que deve pegar
Source alias: nome do artefato
Criando relase node.js + docker no Azure DevOps
Agora clique em 1 job e forneça os dados do seu projeto no Azure Web App for Containers conforme lista abaixo:
Display name: nome da aplicação
Azure subscription: Subscription no Azure
App name: nome da sua aplicação no Azure
Image name: nome da imagem com o sufixo latest
Obs.: Esse sufixo garante que iremos sempre pegar a ultima versão da imagem criada.
Agora para verificar se todos passos anteriores estão OK, clique em Create release para gerar uma nova release do seu projeto:
Criando release Azure DevOps
Ao clicar em Create Release irá subir a seguinte mensagem:
Clique na sua Release para acompanhar o processo de deploy. Caso tudo esteja OK você deve receber o retorno abaixo:
Agora clique em Succeed:
Em seguida clique em Azure Wer App on Container Deploy:
E dentro do log copie a URL do seu projeto:
Agora para finalizar, cole a url no seu navegador e verifique se a ultima alteração do seu projeto esta nessa versão publicada:
Bom, a ideia desse artigo era demonstrar como automatizar o processo de deploy criado em um dos meus artigos anteriores.
Espero que tenham gostado e até um próxima artigo pessoal 😉
Dando continuidade a minha serie de artigos sobre RabbitMQ, hoje irei apresentar uma de suas formas de implementação, os workers. Caso tenha interesse em saber um pouco mais sobre os Workers ou ler os primeiros artigos dessa série, eu recomendo a leitura dos artigos abaixo:
Para que você possa ter um melhor entendimento, eu irei criar um exemplo utilizando o Node.js e o RabbitMQ dentro de um container Docker.
O primeiro passo é ter o RabbitMQ instalado, como mencionado acima eu irei utilizar o RabbitMQ dentro de em um container Docker. Caso você ainda não tenha esse ambiente, eu recomendo a leitura do segundo link que eu passei acima, la eu demonstro como criar esse ambiente.
Criação do projeto
Abra um terminal no seu computador, em seguida escolha um local para criação do seu projeto. Navegue até ele via terminal e execute o comando abaixo:
npm init -y
Esse comando irá inicializar o seu projeto criando um arquivo chamado package.json. Agora vamos baixar o pacote do RabbitMQ. Para isso, execute o comando abaixo no seu terminal:
npm install amqplib --save
Com o projeto criado e a biblioteca do amqplib importada, vamos criar dois novos arquivos no nosso projeto.
O primeiro será o arquivo da nossa aplicação, para esse artigo eu irei chamar ele de app.js. Crie ele na raiz do seu projeto, em seguida atualize ele com o trecho de código abaixo:
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost:5672', function (err, conn) {
conn.createChannel(function (err, ch) {
var q = 'hello';
var msg = 'Hello World 123!';
ch.assertQueue(q, { durable: false });
ch.sendToQueue(q, new Buffer(msg));
console.log(" [x] Sent %s", msg);
});
setTimeout(function () { conn.close(); process.exit(0) }, 500);
});
Analisando o código acima você tem:
1: importação da biblioteca amqplib
3: conexão com o RabbitMQ
4: criação de um novo canal
5: nome do canal
6: msg default para ser enviada
7: passando o nome da fila para conexão do RabbitMQ
8: O RabbitMQ trabalha com Buffer, estou passando a msg para ele e para qual fila ela deve ser enviada
Agora vamos criar os nossos Workers. Para isso, crie um novo arquivo chamado worker.js na raiz do seu projeto e atualize ele com o seguinte trecho de código:
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost:5672', function (err, conn) {
conn.createChannel(function (err, ch) {
var q = 'hello';
ch.assertQueue(q, { durable: false });
ch.prefetch(1);
console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q);
ch.consume(q, function (msg) {
console.log(" [x] Received %s", msg.content.toString());
}, { noAck: true });
});
});
Analisando esse código você tem:
1 a 7: as mesmas configurações que no app.js
10 a 12: escutando a fila que foi mencionada na linha 5 e processando ela
Testando o código
Agora para testar o nosso código, abra 3 terminais no seu computador, navegue até o seu projeto e siga os passos abaixo:
Terminal 01
Execute o comando abaixo para criar o seu primeiro worker:
node worker.js
Terminal 02
Execute o comando abaixo para criar o seu segundo worker:
node worker.js
Terminal 03
Execute o comando abaixo para criar a sua aplicação e enviar a primeira mensagem para sua fila.
Obs.: O RabbitMQ trabalha com o conceito de Round Robin, logo o worker 1 pode não ser o primeiro a consumir a sua fila
node app.js
Abaixo você tem um vídeo demonstrando esse passo:
O intuito desse artigo foi demonstrar como trabalhar com os Workers do RabbitMQ utilizando o Node.js. Caso tenha interesse em baixar o código desenvolvido nesse artigo, segue o seu link no meu GitHub: Node-RabbitMQ-Workers.
Espero que tenham gostado e até um próximo artigo pessoal.