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
Se formos comparar com a tecnologia de virtualização teremos o seguinte cenário:
É 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:
- Abra o terminal com o atalho Ctrl + Alt + T. Baixe as últimas atualizações do sistema.
$ sudo apt update && sudo apt upgrade
- Instale utilizando o repositório do Ubuntu 18.04
$ sudo apt install docker.io
- Inicie o Docker
$ sudo systemctl start docker
- Entretanto, garanta que ele seja iniciado após a reinicialização
$ sudo systemctl enable docker
- 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:
- 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