Você está na página 1de 36

Desvendando

o Docker
nata.house - info.produtos - Desvendando oDocker - 2022

Introdução

Sua simplicidade, leveza e eficiência são coisas comentadas aos

quatro ventos pelos seus utilizadores O que faz com que mais e

mais empresas adotem o Docker em seus ambientes.

A conteinerização é um marco no desenvolvimento

contemporâneo e ainda existe muito potencial a ser explorado,

estamos no início dessa revolução tecnológica.

Desde seu lançamento em 2014, o Docker


Neste ebook, iremos iniciar nossa jornada desvendando esta
vem se tornando referência em
tecnologia, começando com um pouco de história e conceitos.
conteinerização, e sendo cada vez uma
Juntos, vamos sair do ponto zero, aos conhecimentos básicos
ferramenta necessária para qualquer
necessários para gerir um projeto conteinerizado.

desenvolvedor.

Vamos lá?
nata.house - info.produtos - Desvendando oDocker - 2022

O que é um container?

O Docker é uma tecnologia que nos possibilita a criação e

manipulação de containers.

Atualmente, é a ferramenta mais conhecida neste quesito, mas antes

de se aprofundar um pouco mais no Docker, você pode estar se

perguntando: o que é um container?

Quando falamos em container estamos falando em isolamento de

recursos, como CPU, memória, disco, processos, I/O, ou seja, recursos

que podem ser encontrados em uma máquina.

A partir do momento em que podemos isolar recursos, também

podemos replicar estes isolamentos para outros contêineres, e por

padrão, um container não possui acesso aos recursos de outro e nem

os mesmos nem se comunicam.

nata.house - info.produtos - Desvendando oDocker - 2022

Máquinas Virtuais vs Containers

A principal diferença entre VM’s e containers pode ser resumida na complexidade. Toda VM necessita de um sistema operacional
completo para funcionar, ou seja, além do sistema operacional hospedeiro, outro sistema operacional com outro kernel deverá ser
carregado para que a aplicação.

Na maioria das vezes, utiliza somente uma parcela dos recursos carregados, gerando uma sobrecarga no hospedeiro.

Então nos perguntamos: porque não podemos utilizar o sistema operacional do hospedeiro e assim acabar com esta sobrecarga?

E é justamente aí que inserimos o Docker.

Contêineres não necessitam de outro sistema operacional para que possam funcionar e isso é dado através do container runtime do
Docker, a Docker Engine.

A Docker Engine fica encarregada de todo isolamento de recursos que cada container necessita, eliminando toda a sobrecarga
existente no uso de máquinas virtuais.

nata.house - info.produtos - Desvendando oDocker - 2022

Máquinas Virtuais vs Containers

App 1 App 1 App 1 App 1 App 1 App 1


Na imagem podemos visualizar a diferença
Bins/
Bins/
Bins/
Bins/
Bins/
Bins/
entre o uso de máquinas virtuais e containeres.

Libs Libs Libs Libs Libs Libs

Observe que, para rodarmos uma aplicação em


Guest
Guest
Guest
DOCKER ENGINE
OS OS OS uma máquina virtual, é necessário todo um
OPERATING SYSTEM sistema operacional virtualizado dentro do
HYPERVISOR hospedeiro, enquanto na utilização de
INFRASTRUCTURE contêineres, o sistema hospedeiro é isolado
HOST OS
pela docker engine para cada aplicação.

INFRASTRUCTURE
nata.house - info.produtos - Desvendando oDocker - 2022

Imagens de Container
Agora que já sabemos o que é um container, vamos falar sobre imagens.

Uma imagem é um template com instruções para criação de um container, ou seja, uma imagem só se torna um container após sua
execução.

Uma imagem funciona em camadas, na primeira, é necessário definir em qual tipo de sistema sua imagem será baseada, como por
exemplo, debian, ubuntu ou em outra imagem já existente.

Agora você pode estar pensando:

“Mas no capítulo anterior não havíamos dito que não eram necessários outros sistemas
operacionais para utilizar o docker?”

Sim, e isso continua sendo verdade. Essas imagens não carregam o kernel e todo aquele overhead e sim os
utilitários e ferramentas do sistema especificado.

É por isso que podemos ter imagens baseadas em linguagens, como por exemplo, uma imagem Python.

nata.house - info.produtos - Desvendando oDocker - 2022

Imagens de Container

Na segunda camada podemos instalar utilitários ou programas que serão necessários para rodar nossa aplicação, como o nginx e
outras ferramentas.

Já na terceira camada é onde iremos realizar a cópia de nossa aplicação para imagem.

E na quarta e última camada, algo interessante ocorre. Até então, as camadas anteriores são somente leitura e no momento que
criamos um container a partir desta imagem, uma última camada que possibilita a leitura e escrita é adicionada.

A camada de leitura e escrita serve para armazenamento de quaisquer dados gerados em tempo de execução do container, qualquer
log gerado ou arquivo movido a informação criada.

Entretanto, atenção! Nesta camada existe somente o tempo de vida do container, ou seja, caso o container ‘morra’, toda essa camada
desaparece junto com qualquer arquivo que lá esteja salvo. Não existe persistência.

Para salvar os arquivos gerados, vamos usar volumes que iremos falar sobre já já. Continue a leitura!

nata.house - info.produtos - Desvendando oDocker - 2022

Wooooow! Muita informação, não é?


Mas vamos continuar, e se surgir alguma dúvida, é só voltar um pouquinho e
consultar o que já vimos nesse material.

Até agora, você já consegue dizer o que é um container, o que é o docker, o que são
imagens e também acabou de aprender que qualquer dado importante gerado
durante o tempo de vida do container, não poderá ser salvo dentro do mesmo.

Você já sabe a base, e com esse contexto já estabelecido, vamos voltar e falar um
pouco sobre as tecnologias que foram necessárias para que hoje pudéssemos ter o
Docker.

nata.house - info.produtos - Desvendando oDocker - 2022

Namespaces e Cgroups

Falando um pouco sobre história, no início dos anos 2000 uma feature chamada namespaces foi adicionada ao Linux. Essa feature
fornece workspaces que basicamente isolam recursos da máquina.

Quando você executa um contêiner, o Docker cria um conjunto de namespaces para esse contêiner. Esses namespaces fornecem uma
camada de isolamento e cada aspecto de um contêiner é executado em um namespace separado com seu acesso limitado a esse
namespace.

Por que, então, as tecnologias de conteinerização só se popularizaram depois do Docker em 2014?

Porque as principais features de namespaces só foram finalizadas em meados de 2012-2013.

nata.house - info.produtos - Desvendando oDocker - 2022

Namespaces e Cgroups

Host
O cgroup também é responsável por isolar recursos, mas recursos
Container 1
Container 2
Container 3
relacionados à CPU e memória, enquanto namespaces são
(namespaces) (namespaces) (namespaces) responsáveis pelo isolamento da parte de network, usuários, discos,
processos e etc.

Agora sabemos a importância dos namespaces e cgroups para a


cgroups cgroups cgroups
conteinerização.

Kernel
Instalando e primeiros passos no Docker
nata.house - info.produtos - Desvendando oDocker - 2022

Instalando e primeiros passos no Docker

A instalação do Docker é bastante simples. Basta acessar o site Get Docker e escolher sua distribuição para download.

Caso você esteja no Linux e necessite realizar alguns ajustes na instalação, só acessar este link.

Após a instalação, você poderá abrir o terminal e executar o seguinte comando:

Caso o resultado seja igual ao da imagem,


parabéns! Temos o docker instalado em sua
máquina com sucesso!

nata.house - info.produtos - Desvendando oDocker - 2022

A própria Docker disponibilizou um PDF com alguns comandos essenciais.

E se você está iniciando agora, o download deste arquivo é fundamental, pois


poderá consultar em caso de dúvidas.

Você poderá baixar AQUI

nata.house - info.produtos - Desvendando oDocker - 2022

Já no terminal, você também pode consultar os comandos, basta digitar:

Para que possamos subir nosso primeiro container, iremos executar o seguinte comando em nosso terminal:
nata.house - info.produtos - Desvendando oDocker - 2022

Com este comando, estamos dizendo para o Docker:

Executar ( run ) um container em background ( -d )

Que a porta 80 do container seja mapeada para a porta 80 do computador host ( -p 80:80 )

E o container seja o getting-started do repositório do Docker Hub do Docker ( docker/getting-started )

Executando o comando acima o docker irá fazer o download da imagem e criar um container em sua máquina, mapeando a porta do

container para a porta de seu computador, para que possamos acessá-lo.

Então vamos testar?

Abra seu navegador em “http://localhost:80”, você encontrará a documentação do Docker vindo direto de um container executando

em sua máquina!

nata.house - info.produtos - Desvendando oDocker - 2022

Agora vamos voltar no terminal de digitar:

Pode observar que algumas informações surgiram, como na imagem abaixo:


nata.house - info.produtos - Desvendando oDocker - 2022

Quando existir contêineres executando, este comando reunirá informações sobre todos nesta

listagem. São elas:

Container ID Image Command

ID de identificação do Imagem utilizada pelo Comando executado para

container
container
iniciar o container

Created e Status Names

A quanto tempo o container


O nome do container
foi criado e a quanto tempo

ele está sendo executado.


nata.house - info.produtos - Desvendando oDocker - 2022

Caso voltarmos no terminal e digitarmos:

Iremos parar o container, ele desaparecerá da listagem e o site da documentação não estará mais disponível.
nata.house - info.produtos - Desvendando oDocker - 2022

O Dockerfile
Para que possamos criar imagens a partir de nossas aplicações, devemos primeiramente saber o que é o Dockerfile.

O Dockerfile é um documento de texto que contém todos os comandos que um usuário pode chamar para montar uma imagem.

É nele que vamos definir as camadas anteriormente citadas, instalando as dependências de nosso projeto, copiando os arquivos
necessários e definindo os comandos para que nosso projeto seja executado.

nata.house - info.produtos - Desvendando oDocker - 2022

Para criarmos nosso primeiro Dockerfile, vamos primeiramente realizar um clone de um projeto.

Após criar uma pasta em seu computador, execute o seguinte comando dentro da mesma:

Navegue até a pasta ‘app’. Nela você encontrará dois arquivos: o ‘package.json’ e ‘yarn.lock’ e as pastas ‘spec’ e ‘src’.

Neste local, você criará um arquivo chamado ‘Dockerfile’ e em seguida iremos montá-lo.

nata.house - info.produtos - Desvendando oDocker - 2022

Antes de iniciarmos a montagem, vamos comentar sobre alguns comandos utilizados no Dockerfile, são eles:

FROM: Especifica qual imagem base iremos utilizar, exemplo: Ubuntu, Debian..

RUN: Comandos que queremos que sejam executados durante a construção da imagem.

COPY: Comando utilizado para copiar arquivos para dentro da imagem criada.

WORKDIR: Define o diretório padrão dentro do container.

EXPOSE: Comando que expõe uma porta do container para o mundo exterior, utilizado para acessarmos a aplicação

CMD: Executa o comando para que possamos iniciar nossa aplicação.

ENTRYPOINT: Assim como o ‘CMD’, o entrypoint define comando para execução da aplicação.

nata.house - info.produtos - Desvendando oDocker - 2022

Agora que sabemos o básico sobre os comandos, crie seu arquivo ‘Dockerfile’ na pasta ‘app’ e cole o seguinte conteúdo:

Na primeira linha, estamos definindo qual será a imagem base. Essa em específico, é uma imagem que já possui o ‘node’ configurado
em uma distribuição linux chamada ‘alpine’, que é conhecida por ser bastante leve.
nata.house - info.produtos - Desvendando oDocker - 2022

Na segunda e terceira linhas, estamos adicionando algumas bibliotecas que serão utilizadas no projeto e definindo o diretório principal
da aplicação, como o ‘/app’.

Na quarta linha estamos copiando os conteúdos localizados na pasta onde o Dockerfile se encontra, para o diretório definido na linha
anterior, o ‘/app’.

Durante a quinta e sexta linha estamos instalando os pacotes necessários para aplicação e definindo o comando de execução.
Chegando na última linha, expomos a porta 3000 do container para o host, tornando possível acessar a aplicação.

Agora com nosso arquivo Dockerfile construído, iremos executá-lo!

nata.house - info.produtos - Desvendando oDocker - 2022

Copie o seguinte comando no terminal da pasta:

Aqui estamos pedindo para o docker ‘buildar’, definindo a imagem com o nome ‘getting-started’ ( -t ), o Dockerfile localizado onde o

terminal está rodando, ou seja, na pasta atual (representado pelo ponto ‘.’).

O Docker se encarregará da construção da imagem, executando os comandos definidos e então nossa imagem estará criada.

nata.house - info.produtos - Desvendando oDocker - 2022

Para conferir sua criação, execute no terminal o comando:

E você verá que existe uma imagem ‘getting-started’ na listagem mostrada.

Para executá-la, como fizemos anteriormente, inserimos no terminal o comando:

E ao entrarmos em ‘http://localhost:3000/’ iremos nos deparar com a aplicação que acabamos de conteinerizar!
nata.house - info.produtos - Desvendando oDocker - 2022

Um adendo sobre volumes!

Lá no início deste material, falamos que tudo que é criado pelo container durante seu

tempo de vida e não é salvo fora do mesmo, é perdido, ele não possui persistência.

Para solucionar esse problema, temos os volumes no Docker.

Como o próprio nome já diz, trata-se de um volume criado para persistir os arquivos

criados dentro de nosso container.

nata.house - info.produtos - Desvendando oDocker - 2022

Para proceder com sua criação é bastante simples. Basta executar o seguinte comando:

(no comando vamos nomear o volume como todo-volume)

Em seguida, se executarmos o comando ‘docker volume inspect todo-volume’, podemos ver algumas especificações do volume criado,

como na imagem abaixo:


nata.house - info.produtos - Desvendando oDocker - 2022

Podemos observar inclusive, que é possível ver onde nosso volume está sendo guardado, caminho designado pelo ‘Mountpoint’.

Agora com nosso volume criado, basta configurar nosso container para utilizar o volume criado.

(Caso o container esteja rodando, pare-o para que possamos reiniciá-lo. Utilize ‘docker container ps’ para listar os containers ativos e
‘docker stop <container>’ para pará-lo.)

A configuração se dará com um comando a mais no ‘docker run’. Este comando irá comunicar para nosso container que existe um
volume criado para ele, e iremos dizer de qual pasta dentro do container o conteúdo deverá ser salvo no volume.

nata.house - info.produtos - Desvendando oDocker - 2022

Nosso docker run ficará assim:

Em adendo ao comando inserido anteriormente, adicionamos a seguinte linha “-v todo-volume: /etc/todos/ ”, em que:

“-v” define que usaremos um volume

“todo-volume: /etc/todos/ ” define que o volume a ser utilizado será o ‘todo-volume’ e os arquivos a serem salvos nele serão provenientes

da pasta do container ‘/etc/todos/ ’.


nata.house - info.produtos - Desvendando oDocker - 2022

Para testarmos o uso do container, execute o comando acima (se não executou ainda), adicione um item na lista da aplicação, derrube

o container e suba novamente com o mesmo comando.

Você poderá ver que o item inserido ainda se encontra na listagem. Isso porque ao iniciar o container, os arquivos salvos no volume

foram utilizados, adicionando assim persistência a sua aplicação!

nata.house - info.produtos - Desvendando oDocker - 2022

Conclusão

Ao longo deste material, pudemos ter um pouco de contexto sobre a evolução das tecnologias necessárias para chegarmos até aqui.

Vimos sobre o que é um container, o que é o Docker e como realizar operações básicas com ele.

Criamos nosso primeiro volume e adicionamos persistência a um container que criamos a partir de um Dockerfile.

Estamos no início da era da conteinerização, muitas aplicações e diversas empresas utilizam tecnologias
semelhantes para administrar e visualizar suas aplicações conteinerizadas.

Então, se você trabalha com desenvolvimento e quer se destacar no mercado, é importante que entenda
e saiba usar essa ferramenta a seu favor.


Compartilhar experiências e
Chegamos ao final da nossa jornada e esperamos que você tenha gostado e aprendido com esse conhecimentos faz parte do
conteúdo.
DNA da moçada aqui na
nata.house!
nata.house - info.produtos - Desvendando oDocker - 2022

Autor
Rodolfo Moreira - Desenvolvedor na nata.house

Estudante de Engenharia da Computação

Hobbies: cozinhar, aprender idiomas e pesquisar sobre outras culturas


e lugares.

O Rodolfo está sempre curioso e disposto a aprender novas


tecnologias, assim como aplicá-las e aperfeiçoar seu uso no dia-dia.

Espero que esse conteúdo tenha contribuído para a sua carreira


profissional e agregado ainda mais conhecimento na sua jornada.

Continue acompanhando os conteúdos da nata.house!

Conheça a nata.house
Somos uma empresa de criação de soluções que tem como objetivo resolver problemas por meio da tecnologia. Trabalhamos com

foco em desenvolvimento ágil e tecnologias modernas.

Com um time altamente especializado, nosso foco é escalar seu produto e negócio.

Unimos expertise técnica, tecnologias modernas e comunicação proativa para criar softwares que cumprem seus objetivos dentro

do prazo, sem dores de cabeça.

A nata.house maximiza resultados para clientes ao focar em um conjunto de tecnologias sólidas usadas por grandes empresas

(React, NodeJS e o ecossistema ao seu redor). Nossos serviços ficam ainda mais eficazes com o acompanhamento, de engenheiros

sênior e de um arquiteto especialista, que ajudam a chegar na solução ideal para cada projeto.

Como não somos apenas desenvolvedores, com uma raíz forte em negócios, abraçamos a evolução e inovação constantes nos

processos internos em prol da melhora dos serviços. Não queremos ser uma fábrica de software qualquer, mas sim chegar num

modo de trabalho excelente para clientes e colaboradores.

Conheça mais sobre a nata.house: www.natahouse.com.br

nata.house - info.produtos - Desvendando oDocker - 2022

Fontes:

Namespaces e Cgroups - https://bit.ly/3ahSaiX

Docker Docs: https://docs.docker.com/

Você também pode gostar