Aguarde...

26 de junho de 2020

Introdução ao Docker para desenvolvedores da Web

Introdução ao Docker para desenvolvedores da Web

Um guia curto e simples do docker, uma introdução aos desenvolvedores da web

Saber como usar contêineres no desenvolvimento de aplicativos é uma obrigação para um desenvolvedor moderno. Um dos motivos da recente demanda por contêineres foi o surgimento do Docker. O Docker não apenas aumentou o uso de contêineres, mas também teve um grande impacto na maneira como abordamos o desenvolvimento de aplicativos. 

Se você é um desenvolvedor que ainda não encontrou uma introdução adequada a essa tecnologia popular, está no lugar certo. Neste artigo, apresentaremos o conceito de Docker e obteremos uma abordagem prática para aprender o Docker, dockerizando um aplicativo simples. 

Primeiro, vamos esclarecer o que é o Docker e por que ele se tornou tão importante.


O que é o Docker?

O Docker é uma ferramenta que os desenvolvedores usam para criar, implantar e executar aplicativos em um ambiente isolado por meio de contêineres. 

Aqui está novamente, recipientes. Embora esse termo seja usado algumas vezes desde o início do artigo, talvez você não tenha uma idéia do que é um contêiner. Para entender completamente a afirmação acima, primeiro precisamos entender o que é um contêiner.


O que é um container e por que precisamos dele?

Um contêiner é uma unidade de software que compacta o código do aplicativo e todas as dependências usadas no aplicativo em um único pacote. O empacotamento permite que o contêiner isole o aplicativo do ambiente host em que está sendo executado. O aplicativo vê o contêiner como seu ambiente em vez do dispositivo host. Essa abstração garante que um aplicativo em execução em um ambiente de desenvolvimento possa executar em um ambiente de produção sem passar por mudanças significativas. 

Mesmo que vários aplicativos estejam em execução no dispositivo host, o contêiner isola o aplicativo em contêiner de interferir na operação de outros aplicativos e compartilhar seus recursos. 

Antes dos contêineres, as máquinas virtuais eram usadas para isolar aplicativos do ambiente host. Nas máquinas virtuais, cada máquina usa um sistema operacional separado para executar o aplicativo. Embora essa abordagem também atinja o objetivo de isolar os aplicativos, ela tem a desvantagem de adicionar muita sobrecarga ao aplicativo. Os contêineres, por outro lado, compartilham o kernel do sistema operacional do dispositivo host, em vez de usar um sistema operacional próprio, o que remove a sobrecarga adicionada pelas máquinas virtuais. Isso torna os contêineres mais leves e econômicos em comparação com as máquinas virtuais. 

Embora os contêineres estejam em uso muito antes do Docker, é seguro dizer que o Docker é a maior razão para a extrema popularidade dos contêineres no mundo da programação moderno. Além de ser de código aberto, a facilidade de uso, a confiabilidade e a eficiência do Docker fizeram o mundo da programação se apaixonar instantaneamente por essa tecnologia.


O que são o Dockerfile, o Docker Image e o Docker Engine?

O Docker vem com seu idioma especial. Dockerfile, imagem do Docker e mecanismo do Docker são três palavras comumente usadas entre os usuários do Docker. Esses também são os três componentes mais importantes usados ​​na construção de contêineres do Docker. 

Dockerfile

O Dockerfile contém um conjunto de instruções para criar uma imagem do Docker, que discutiremos a seguir. Essas instruções serão executadas uma após a outra ao criar a imagem do Docker. As instruções no Dockerfile contêm informações como o SO do dispositivo host, o idioma de programação do aplicativo, o local do diretório do aplicativo, as portas de rede e as variáveis ​​de ambiente. 

Imagem do Docker

A imagem do Docker é um modelo usado para criar o contêiner final do Docker para o aplicativo. Podemos gerar a imagem do Docker de um aplicativo executando o comando docker build com o Dockerfile como parâmetro. Para criar o contêiner do Docker, usamos o comando docker run e a imagem do Docker. 

Docker Engine

O mecanismo do Docker é o local em que todos os contêineres do Docker estão em execução. Aplicativos baseados em Windows e Linux podem ser executados nos mecanismos do Docker.


Como dockerizar um aplicativo simples

Agora chegamos à parte mais interessante deste tutorial. Vamos dockerizar um aplicativo simples para obter experiência prática no Docker. Primeiro, criaremos um aplicativo Node.js simples e, em seguida, criaremos o Dockerfile, a imagem do Docker e, finalmente, o contêiner do Docker para o aplicativo. 

Antes de continuar, no entanto, verifique se o Docker está instalado no seu dispositivo. Você pode seguir a documentação oficial para instalar o Docker no seu sistema operacional Windows ou Ubuntu . Confira os documentos para outro sistema operacional.

Criar um aplicativo Node.js simples

Vamos criar um aplicativo Node simples que envia uma mensagem “Hello World” quando visitarmos a rota raiz. 

Siga estas etapas para configurar seu aplicativo:

npm init
npm install express --save

Dentro do diretório, o app.jsarquivo contém o código principal do aplicativo.   

const express = require('express')
const app = express()
 
app.get('/', (req, res) => {
    res.send("Hello World!")
})
 
app.listen(process.env.PORT, () => {
    console.log("Node server has started running")
})

Crie o Dockerfile para o aplicativo

Agora podemos criar o Dockerfile com as informações necessárias para criar a imagem do Docker. 

Crie um arquivo nomeado Dockerfiledentro do diretório do aplicativo. Para criar a imagem do Docker para nosso aplicativo, o Dockerfile deve conter um conjunto de comandos como este. 

FROM node:latest
 
WORKDIR /docker-tutorial
 
COPY . .
 
ENV PORT 3000
 
RUN npm install
 
EXPOSE $PORT
 
ENTRYPOINT ["node", "app.js"]

Agora, veremos o que cada um desses comandos significa. 

  1. FROM – Este comando define a imagem base e a nova imagem do aplicativo é criada sobre isso. No nosso caso, usamos uma imagem que contém npm e a versão mais recente do Node.js. Esta imagem é extraída do Docker Hub, que é um repositório público de imagens do Docker. 
  2. WORKDIR – Este comando define o diretório de trabalho do aplicativo que será executado dentro do contêiner. 
  3. COPY – Este comando copia os arquivos no diretório do aplicativo para o diretório de trabalho que configuramos com o comando anterior. Você pode passar o caminho para um nome de arquivo específico ou fazer o seguinte para copiar todos os arquivos no diretório do aplicativo para a imagem do Docker. No último caso, verifique se você navegou para o diretório do aplicativo na linha de comandos ao executar o comando docker build.
  4. ENV – No aplicativo Node, observe como passamos a variável de ambiente PORT (process.env.PORT) para a função app.listen, em vez de passar diretamente o número da porta que o aplicativo deve ouvir. Portanto, precisamos definir a variável de ambiente PORT no ambiente do aplicativo. Para nosso aplicativo que está indo para o contêiner do Docker. Portanto, usamos o comando ENV para passar as variáveis ​​que queremos definir como variáveis ​​de ambiente dentro do contêiner do Docker. 
  5. EXECUTAR – Este comando executa o npm install para instalar as dependências usadas em nosso aplicativo, que são salvas no arquivo package.json. 
  6. EXPOSE – Este comando expõe o aplicativo para ouvir a porta especificada. Como já definimos o número da porta como uma variável de ambiente, passamos o nome da variável, $ PORT, no lugar do número da porta real. No entanto, lembre-se de que o aplicativo está exposto à porta 3000 dentro do ambiente do contêiner e não do ambiente do dispositivo host. 
  7. PONTO DE ENTRADA – Este comando define como entrar ou como iniciar nosso aplicativo. O Docker se une à matriz que passamos para criar um único comando que inicia o aplicativo, que é o nó app.js. 

Criar a imagem do Docker

Usamos o comando docker build para criar a imagem do Docker a partir do Dockerfile. Aqui está como funciona:

docker build -t <image-name> <dockerfile-location>

Verifique se você navegou para o diretório do aplicativo na sua linha de comandos antes de executar o comando. Você pode passar um ponto (.) No lugar do local do Dockerfile para indicar que o Dockerfile está no diretório atual. 

Para o nosso exemplo, executaremos:

docker build -t docker-tutorial .

Resultado:

Sending build context to Docker daemon  2.008MB
Step 1/7 : FROM node:latest
latest: Pulling from library/node
81fc19181915: Pull complete 
ee49ee6a23d1: Pull complete 
828510924538: Pull complete 
a8f58c4fcca0: Pull complete 
33699d7df21e: Pull complete 
923705ffa8f8: Pull complete 
ae06f9217656: Pull complete 
39c7f0f9ab3c: Pull complete 
df076510734b: Pull complete 
Digest: sha256:719d5524c7e927c2c3e49338c7dde7fe56cb5fdb3566cdaba5b37cc05ddf15da
Status: Downloaded newer image for node:latest
 ---> dcda6cd5e439
Step 2/7 : WORKDIR /docker-tutorial
 ---> Running in 8797780960e9
Removing intermediate container 8797780960e9
 ---> b80abb69066b
Step 3/7 : COPY . .
 ---> cc9215d75956
Step 4/7 : ENV PORT 3000
 ---> Running in 4bf08e16b94d
Removing intermediate container 4bf08e16b94d
 ---> 95007721d5ee
Step 5/7 : RUN npm install
 ---> Running in d09f45f0bbd7
npm WARN docker-tutorial@1.0.0 No description
npm WARN docker-tutorial@1.0.0 No repository field.

audited 50 packages in 1.146s
found 0 vulnerabilities

Removing intermediate container d09f45f0bbd7
 ---> 292a854f73e2
Step 6/7 : EXPOSE $PORT
 ---> Running in f2ae755655b3
Removing intermediate container f2ae755655b3
 ---> 6d42325fe934
Step 7/7 : ENTRYPOINT ["node", "app.js"]
 ---> Running in d657168980d8
Removing intermediate container d657168980d8
 ---> 0c6df3f042eb
Successfully built 0c6df3f042eb
Successfully tagged docker-tutorial:latest

Depois de executar o comando docker build, o Docker executará cada comando no Dockerfile consecutivamente. Ao executar o comando FROM, se a imagem do Nó não tiver sido puxada para o seu dispositivo antes, o Docker puxará a imagem do Docker Hub. 

Depois que todos os comandos forem executados, você verá a mensagem “construído com êxito” se a imagem foi criada sem ocorrer um erro. 

Você pode usar o comando,, docker imagespara ver todas as imagens atualmente no seu dispositivo. 

Resultado:

REPOSITORY       TAG      IMAGE ID        CREATED         SIZE
docker-tutorial  latest   0c6df3f042eb    3 minutes ago   943MB
node             latest   dcda6cd5e439    2 weeks ago     942MB

Criar o contêiner do Docker

Usamos o seguinte comando para criar e executar o contêiner do Docker usando a imagem do Docker já criada. 

docker run -d -p 8080:3000 docker-tutorial

Resultado:

a7cc6a41996fa565890b57e292aff5df99cb5e13a8c7ab8cea2506e16d70d01e

Aqui, o -dflag é usado para executar o contêiner no modo daemon. O sinalizador -p é usado para mapear a porta que o contêiner abre para o mundo externo àquele que o aplicativo está ouvindo. No Dockerfile, anteriormente, configuramos a porta interna, ou a porta do aplicativo, para 3000. Então, aqui, estamos mapeando a porta 8080, que o contêiner abre para o dispositivo host, para a porta 3000. docker-tutorialé o nome do Docker imagem. 

Você pode ver os contêineres do Docker atualmente em execução no seu dispositivo com seus IDs usando o docker pscomando 

Com isso, concluímos o processo de dockerizing nosso aplicativo Node simples. Você pode visitar o URL http: // localhost: 8080 no seu navegador para verificar se o aplicativo e o contêiner estão funcionando corretamente. Se você conseguiu, você verá a mensagem “Hello World”. (Se o mecanismo do Docker não estiver em execução no host local, substitua o host local pelo endereço IP que ele está usando no dispositivo.)  

Parando e removendo um contêiner do Docker

Se você deseja interromper um contêiner do Docker em execução, use o seguinte comando. 

docker stop <first-3-characters-of-the-container-id>

No entanto, isso apenas interrompe o contêiner sem removê-lo totalmente do sistema. Se você deseja reiniciar o contêiner, pode usar o comando docker start com o ID do contêiner. 

Se você deseja remover completamente um contêiner parado, use este comando. 

docker rm <first-3-characters-of-the-container-id>

Resumo

Hoje, o Docker se tornou uma tecnologia grande demais para ser ignorada por todos os desenvolvedores existentes. Nosso artigo apresentou essa tecnologia popular com uma explicação do que é o Docker e como trabalhar com o Docker para contêiner um aplicativo. Aprendemos como criar um Dockerfile, uma imagem do Docker e, finalmente, um contêiner do Docker para um aplicativo simples do Node.js. Mas este é apenas o começo do Docker. Possui muito mais recursos e configurações avançadas para ajudá-lo a criar, executar e implantar aplicativos com bastante facilidade e eficiência. Portanto, aproveite esta introdução ao Docker como uma oportunidade para aprofundar e explorar conceitos mais complexos relacionados ao Docker.

Obrigado pela leitura!

Postado em Blog
Escreva um comentário