Docker na Prática - Como construir uma aplicação com Docker?

Docker na Prática - Como construir uma aplicação com Docker?

Docker na Prática - Como construir uma aplicação com Docker?

Docker na Prática: Como construir uma aplicação com Docker?

Fala galera, tudo certo? Vocês já conhecem o Docker?

Hoje estou aqui para falar rapidamente sobre um tema bastante relevante para quem desenvolve aplicações e realiza publicação em diferentes provedores de nuvem como AWS, Azure, Heroku, ou mesmo Google Cloud Platform, entre outros.

1. O que é Docker?

Nada mais que uma plataforma aberta para criação, execução e publicação (deploy) de containers. Um Container é a forma de empacotar sua aplicação e suas dependências (bibliotecas) de forma padronizada.

Podemos dizer que as palavras chaves para o Docker são: construir, entregar e rodar em qualquer ambiente (develop, ship and run anywhere).

1.1 Existe alguma desvantagem no Docker?

A grosso modo: não. A questão não é exatamente se existe uma desvantagem, mas se existe necessidade de usá-lo. Tudo depende do seu cenário. Algumas questoes de seguranca tambem devem ser consideradas quando em quando utilizar o docker e falaremos mais sobre isso em outro momento.

Se seu projeto passa por problemas que podem ser resolvidos pelo docker, se ele precisa orquestrar contêineres, então as desvantagens praticamente não existem.

Vou deixar um link de um video falando mais sobre esse tema: 👇👇👇👇👇

2. Arquitetura do Docker

Nesta seção, vamos abordar a arquitetura do Docker e seus principais componentes.

Os principais componentes da arquitetura envolvem:

  • Docker para Mac, Linux e Windows – versões que permitem instalar e executar containers nos sistemas operacionais de forma isolada.
  • Docker Daemon – Software que roda na máquina onde o Docker está instalado. Usuário não interage diretamente com o daemon.
  • Docker Client – CLI ou REST API que aceita comandos do usuário e repassa estes comandos ao Docker daemon.
  • Docker Image – É um template. Uma imagem contém todos os dados e metadados necessários para executar containers a partir de uma imagem.
  • Docker Container – Detém tudo que é necessário para uma aplicação ser executada. Cada container é criado a partir de uma imagem. Cada container é uma aplicação isolada independente.
  • Docker Engine – Usado para criar imagens e containers.
  • Docker Registry – Uma coleção de imagens hospedadas e rotuladas que juntas permitem a criação do sistema de arquivos de um container. Um registro pode ser público ou privado.
  • Docker Hub – Este é um registro usado para hospedar e baixar diversas imagens. Pode ser visto como uma plataforma SAAS de compartilhamento e gerenciamento de imagens.
  • Dockerfile – Um arquivo texto contendo uma sintax simples para criação de novas imagens.
  • Docker Compose – Usado para definir aplicações usando diversos containers.
  • Docker Swarm – É uma ferramenta que permite o agrupamento (clustering) de Containers Docker. grafico da arquitetura do docker

Arquitetura do Docker

Se formos comparar com a tecnologia de virtualização teremos o seguinte cenário:

VM versus Docker

É possível perceber que esta nova arquitetura simplifica bastante o uso de recursos e a sobrecarga do sistema para podermos configurar e distribuir nossas aplicações, independentemente do provedor que estaremos hospedando.

A principal vantagem desta arquitetura é que não é necessário ter hardware extra para o sistema operacional hospedeiro. Tudo será tratado como Container.

Leituras recomendadas: Orquestração de contêineres e O que é Kubernetes? Tudo que você precisa saber sobre!

3. Vale a pena usar o Docker?

A seguir listei algumas das vantagens de se utilizar o Docker:

  • Ele reduz tempo de build e deploy
  • Permite rodar vários containers simultaneamente em qualquer host
  • Ele oferece uma maneira segura de rodar aplicações isoladas em containers, empacotadas com todas as suas dependências e bibliotecas.
  • Uma aplicação dockerizada pode ser transportada e executada em qualquer plataforma sem nenhuma modificação.

4. Como instalar o Docker?

Linux

Se o seu sistema operacional for linux, Ubuntu, por exemplo, você deve seguir os seguintes passos:

  1. Abra o terminal com o atalho Ctrl + Alt + T. Baixe as últimas atualizações do sistema.

$ sudo apt update && sudo apt upgrade

  1. Instale utilizando o repositório do Ubuntu 18.04

$ sudo apt install docker.io

  1. Inicie o Docker

$ sudo systemctl start docker

  1. Entretanto, garanta que ele seja iniciado após a reinicialização

$ sudo systemctl enable docker

  1. Caso queira verificar a versão instalada

$ docker -v 

MacOS X

Se você estiver utilizando MacOS, certifique-se de estar utilizando MAC OS X Sierra 10.12 ou superior. Baixe o Docker para Mac; Dê duplo clique no arquivo DMG, autorize a instalação e informe sua senha de administrador, depois dê um duplo clique em Docker.app para iniciar. Após baixar, rode em uma janela do terminal os seguintes comandos para verificar se está tudo ok:


$ docker --version
$ docker-compose --version
$ docker-machine --version

Windows

Se você estiver utilizando Windows, siga os seguintes passos:

Verifique se o suporte a virtualização está habilitado em seu computador; Seu Windows deve ser 64bits versão 1607 e build: 14393.0; Você deve habilitar o recurso do hyper-v; Baixe o Docker para Windows.

5. Utilitário de linha de comando – Docker CLI

Depois de entender a arquitetura e realizar a instalação, é chegada a hora de conhecer o utilitário de linha de comando. Utilizar o docker consiste em informar a ele opções e argumentos da seguinte forma:


$ docker [option] [command] [arguments]

Para exibir as informações globais de sistema sobre o Docker, digite:


$ docker info

Caso deseje ver todos os subcomandos do utilitário digite no terminal:


$ docker
attach    Attach to a running container
build     Build an image from a Dockerfile
commit    Create a new image from a container’s changes
cp        Copy files/folders between a container and the local filesystem
create    Create a new container
diff      Inspect changes on a container’s filesystem
events    Get real time events from the server
exec      Run a command in a running container
export    Export a container’s filesystem as a tar archive
history   Show the history of an image
images    List images
import    Import the contents from a tarball to create a filesystem image
info      Display system-wide information
inspect   Return low-level information on a container or image
kill      Kill a running container
load      Load an image from a tar archive or STDIN
login     Log in to a Docker registry
logout    Log out from a Docker registry
logs      Fetch the logs of a container
network   Manage Docker networks
pause     Pause all processes within a container
port      List port mappings or a specific mapping for the CONTAINER
ps        List containers
pull      Pull an image or a repository from a registry
push      Push an image or a repository to a registry
rename    Rename a container
restart   Restart a container
rm        Remove one or more containers
rmi       Remove one or more images
run       Run a command in a new container
save      Save one or more images to a tar archive
search    Search the Docker Hub for images
start     Start one or more stopped containers
stats     Display a live stream of container(s) resource usage statistics
stop      Stop a running container
tag       Tag an image into a repository
top       Display the running processes of a container
unpause   Unpause all processes within a container
update    Update configuration of one or more containers
version   Show the Docker version information
volume    Manage Docker volumes
wait      Block until a container stops, then print its exit code

Para conhecer as opções adicionais de um comando específico de seu interesse, digite:


$ docker subcomando --help

Agora vamos rodar um container da imagem do Ubuntu, para aquecer os motores e iniciar nossa jornada nesse novo mundo. Em uma janela do terminal ou prompt de comando, digite:


$ docker run -t -i ubuntu /bin/bash

A saída resultante do comando acima, deve indicar que o Docker está executando corretamente a imagem do Ubuntu, em modo interativo, note que executei um comando top para listar os processos que estão executando internamente ao container:

Neste ponto você já pode executar qualquer comando dentro do container, não é preciso utilizar usuário sudo, porque você já está operando com privilégio de super usuário (root).

Teste, executando os comandos:


$ apt-get update 

…e depois instale o node.js para fazer um breve teste:


 $ apt-get install -y nodejs

Repare que utilizamos o comando run do utilitário e as opções -i -t:

Em outro terminal rode o comando abaixo para listar os Containers:


$ docker ps

A saída resultante será:

Para exibir o último containers criado, informe ao comando a chave -l:


$ docker ps -l

Se quiser exibir todos os containers – ativos e inativos, passe ao comando a chave -a:


$ docker ps -a

Para exibir um container executado ou ativo é só digitar:


$ docker stop id-do-container

O container-id pode ser encontrado na saída do comando docker ps.

Se após realizar uma série de configurações de uma imagem docker você quiser disponibilizá-la ou até mesmo hospedá-la no Docker Hub para uso futuro, você pode.

Basta criar uma conta no Docker Hub e, depois de efetuar login, faça o carregamento da imagem para o repositório.


$ docker login -u username-docker

Após efetuar o login no Docker Hub você poderá então enviar a imagem que desejar, utilizando:


$ docker push username-docker/nome-da-imagem

Após finalizar o upload da imagem, você poderá acessar no endereço do Docker Hub.

6. Vamos criar uma aplicação?

Suponha que você queira criar uma aplicação que possua todas as dependências do Node.js já instalados, sem instalar as dependências manualmente ou diretamente em sua máquina.

Usando Docker você pode fazer isso de maneira isolada com alguns comandos declarados no arquivo de configuração. Isso se chama “Dockerfile”.

Leitura recomendada: Kubernetes: a arquitetura de um cluster

7. Develop, Ship e Run

Veja um exemplo de conteúdo de um Dockerfile:


FROM node:10-alpine
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# Install app dependencies
COPY package*.json ./
USER node
RUN npm install
COPY --chown=node:node . .
EXPOSE 8080
CMD [ "node", "app.js" ]

Se olharmos para o arquivo app.js que define uma aplicação básica em Node.js e express, nós teremos:

const express = require('express');
const app = express();
app.get('/', function (req, res) {
    res.send('Geek Hunter!');
});
app.listen(3000, function () {
    console.log('Servidor Geek Hunter rodando na porta 3000!');
});

Agora que já definimos nossa aplicação em app.js e já temos nosso Dockerfile, vamos criar uma imagem para poder rodar nossa aplicação e realizar o deploy na imagem que será carregada no container.

Vamos criar uma imagem executando o comando:


$ docker build -t vmoll/nodejs-image-demo .

A opção -t serve para informarmos uma tag para a imagem que estamos criando.

Após a criação será possível rodar a aplicação utilizando o seguinte comando:


$ docker run -it -p 3000:3000 -h instance-hostname --rm --name nodejs-image-demo vmoll/nodejs-image-demo:latest

No comando que acabamos de executar informamos -p . 3000:3000.

Esse comando é responsável por realizar o bind ou vinculação da porta local para uma porta externa do serviço, que será disponibilizado na máquina que está hospedando a aplicação.

Veja como a aplicação está funcional e operante, acessando http://localhost:3000, e receberá a mensagem “Hello Geeks!”:

Todo o código da aplicação de exemplo, juntamente com seu Dockerfile, estão disponíveis na minha página do Github, linkada acima.

Observação importante: criei aqui uma aplicação bem simples, apenas para demonstrar que é possível realizar o deploy na imagem que criamos. Nosso foco principal é a criação e execução de containers usando Docker.

Caso queria criar uma aplicação completa você pode utilizar algum gerador como o express-generator. Para isso execute o seguintes comandos:


$ npm install express-generator -g
$ express minhaAplicacao
$ cd minhaAplicacao
$ npm install
$ npm start

Após isso abra uma janela do browser em: http://localhost:3000

Como última dica 🔥, gostaria de deixar aqui um link onde existem diversos exemplos de aplicações e recomendações que podem ser estudados e seguidos para uma melhor utilização. Acesse aqui:

8. Projetos Docker

Galera, espero ter ajudado vocês a compreenderem de maneira simples os benefícios da utilização do Docker em nossas aplicações.

Creio que, se você ainda não está fazendo uso dessa tecnologia, logo passará a utilizá-la em seus novos projetos.


Deixe seu comentário, siga nossas redes:

  • Twitter
  • Instagram
  • Youtube
  • E fique ligado, pois toda semana teremos videos e novos tópicos que podem ser de seu interesse.

Abraço e até a próxima! 😉👍

Published on Jun 26, 2020 by Vinicius Moll

Share on / compartilhe: