DEV Community

Yuri Peixinho
Yuri Peixinho

Posted on

Docker

O Docker é uma plataforma de contenedores (containters) que facilita a criação, distribuição e execução da aplicação em ambientes isolados. Ele resolve problemas relacionados à compatibilidade de software entre diferentes sistemas operacionais ou máquinas e permite que os desenvolvedores criem e executem aplicações com todas as dependências e configurações necessárias em um único pacote leve, chamado de container.

Docker ≠ Máquinas Virtuais

Muitas pessoas podem confundir o Docker com uma máquina virtual, o que está errado. Embora ambos proporcionem isolamento, o método e o propósito do isolamento são distintos.

Nas Máquinas virtuais, o isolamento envolve o hardware inteiro e executam um sistema operacional completo (guest OS), já o Docker isola apenas os processos e compartilha o Kernel do sistema operacional do host, sem precisar virtualizar o hardware ou carregar um sistema operacional completo para cada aplicação

Comparação Visual Simplificada

Característica Docker Máquina Virtual (VM)
Sistema Operacional Compartilhado (kernel do host) Completo e independente
Peso Leve Pesado
Velocidade de Inicialização Segundos Minutos
Portabilidade Muito alta Moderada
Isolamento Processo Total
Uso de Recursos Eficiente Alto

Fluxo de Execução

Abaixo, será mostrado o fluxo de execução de processo, desde o armazenamento de imagens até a execução de containers no sistema host. Vamos detalhar o processo passo a passo.

O fluxo de processo envolve:

  • Registry
  • Repositórios
  • Imagens
  • Contêineres

Image description

Registro

O registry (registro) é uma biblioteca de imagens estáticas, ou seja, um repositório onde estão armazenadas imagens Docker. O exemplo mais conhecido é o Docker Hub, mas pode ser outros.

O que acontece aqui?

Nessa etapa, as imagens de aplicações são enviadas (push) ou recuperadas (pull) para serem usadas localmente no host.

Repositórios

Dentro do registry, existem vários repositórios, que são organizados por nomes e versões de imagens. Cada repositório pode conter múltiplas versões de uma mesma aplicação (identificadas por tags como v1.0, v2.0, latest).

Exemplo Prático

No Docker Hub, você pode encontrar o repositório da imagem oficial do Node.Js: node, e dentro do repositório há diferentes versões como node:16, node:18, ou node:lastest

Images

As imagens Docker são baixadas do registry para host local. Elas contêm: o código da aplicação, bibliotecas necessárias e configurações do ambiente (como sistemas operacionais leves, por exemplo Ubuntu)

O comando docker pull é usado para trazer uma imagem do registry para o host local, por exemplo docker pull node:18.

Container

O container é criado a partir de uma imagem Docker. Quando você executa o comando docker run, uma instância da imagem é criada e executada como um processo isolado no sistema host. Então, ao dar docker run node:18 cria um container rodando a versão 18 do Node.js, e o container tem acesso às configurações e dependências definidas na imagem

Vantagens

  • Com Docker, a aplicação e suas dependências são empacotadas em containers, permitindo que você execute a mesma aplicação em diferentes ambientes (desenvolvimento, teste e produção) sem se preocupar com diferenças entre eles. Exemplo: "Funciona na minha máquina" não será mais um problema.
  • Isolamento, cada container é executado de forma isolada dos outros, garantindo que as aplicações não interfiram entre si. Você pode rodar diferentes versões de uma mesma aplicação ou serviço (ex.: Python 2 e Python 3) no mesmo host sem conflitos.
  • Ambiente Reproduzível. O uso de arquivos Dockerfile permite criar imagens que descrevem exatamente como o ambiente da aplicação deve ser configurado. Isso garante consistência em todas as máquinas.

Contêiner e Imagem

Para poder ser executado, um contêiner possui associado a ele um sistema de arquivos completo e isolado que contêm as bibliotecas necessárias. Esse sistema de arquivos somente-leitura são conhecidos como Imagens; e, a partir das é que os contêineres são criados.

Image description

Imagem

A Imagem é uma representação estática da aplicação, contendo o código as configurações e as dependências necessárias para executar a aplicação. Pense na imagem como um modelo ou receita para criar containers.

Container

É uma instância da imagem, ou seja, a execução de uma imagem em um ambiente isolado no host. Ele é executado como um processo na memória do sistema host, compartilhando o kernel do host

Como rodar o primeiro Docker (Exemplo Restaurante)

Vamos rodar nosso primeiro Docker? Você já viu como funciona o fluxo de execução do Docker de forma técnica. Para praticar vamos fingir que temos um restaurante mágico. Esse exemplo o fara assimilar de forma mais prática os conceitos do fluxo de execução.

Restaurante dos Containers

Em nosso restaurante temos um fluxo o qual nossos funcionários devem seguir para entregar os pedidos de forma eficiente.

  1. Chefe Master (Docker Engine): Ele que gerencia tudo, ele sabe como preparar os pratos, independente da receita. Não importa se é comida italiana, japonesa ou brasileira. ****
  2. Receitas (Imagens Docker): No estoque do restaurante tem várias receitas prontas, essas receitas vem de um livro gigante chamado Docker Hub.
    • Receita de Lasanha (Imagem do PostgreSQL)
    • Receita de Sushi (Imagem de Redis)
    • Receita de Hambúrguer (Imagem Ngix)
  3. Cozinheiros (Containers): Quando o cliente quer um prato específico, o Chef Master pega a receita (imagem) e manda para os cozinheiros prepararem o prato. Esses cozinheiros são os containers. Eles são como cópias do chefe usando uma receita específica, por exemplo:
    • Um container pode estar rodando a imagem do PostgreSQL e virando um banco de dados.
    • Outro container pode estar rodando a imagem do Nginx e virando um servidor web
  4. Pedido (Comando Docker Run): Quando você faz um pedido:

    docker run -d --name meu-postgres -e POSTGRES_PASSWORD=12345! -p 5432:5432 postgres
    

Para a prática!

1. Chegada no Restaurante (Docker ps)

Você acabou de chegar no restaurante e está louco para comer. O primeiro passo é ver o cardápio. No docker, isso é feito com com comando.

docker ps
Enter fullscreen mode Exit fullscreen mode

Na prática estamos perguntando ao garçom “Quais pratos estão sendo servidos agora?” a resposta do garçom pode ser “No momento, nenhum prato está na mesa” ou ele mostra a lista de containers rodando (se tiver algum).


2. Conferindo o Estoque de Receitas (Docker Images)

Agora você está curioso e deseja ver quais são as receitas disponíveis na cozinha:

docker images
Enter fullscreen mode Exit fullscreen mode

Se não tiver nada, o garçom diz: "Estamos sem ingredientes no momento, mas posso buscar uma receita pra você."


3. Buscando uma Receita no Livro Gigante (Docker Pull)

Você decide pedir uma deliciosa lasanha (PostgreSQL), mas o restaurante não tem a receita na cozinha. Então o chefe vai buscar o livre de receitas gigantes (Docker Hub)

docker pull postgres
Enter fullscreen mode Exit fullscreen mode

Com isso, o garçom some por um instante e volta dizendo: "Achei a receita de Lasanha Especial (PostgreSQL)! Podemos preparar pra você.". Agora a imagem está na sua máquina, pronta pra virar um prato.


4. Agora é hora de fazer o pedido! (Docker Run)

Você decide: "Quero a Lasanha Especial, bem temperada, e quero que ela fique na mesa 5432. Ah, e com um toque secreto na receita (senha do banco de dados)!”

docker run -d --name minha-lasanha -e POSTGRES_PASSWORD=1902mdj73s! -p 5432:5432 postgres
Enter fullscreen mode Exit fullscreen mode

Com o seu pedido, o que vai acontecer:

  • d: O garçom vai servir sem te incomodar (modo discreto).
  • -name minha-lasanha: O prato vai ser chamado de "minha-lasanha".
  • e POSTGRES_PASSWORD=1902mdj73s!!: O chef coloca um tempero secreto (variável de ambiente).
  • p 5432:5432: A mesa 5432 é reservada pra esse prato.
  • postgres: O chef usa a receita de Lasanha Especial (PostgreSQL).

5. Verificando a mesa

O seu pedido chegou e o garçom entregou em sua mesa. Você olha:

docker ps
Enter fullscreen mode Exit fullscreen mode

e o resultado é a lasanha servida na mesa 5432:

CONTAINER ID   IMAGE       NAMES          PORTS
abcd1234       postgres    minha-lasanha  0.0.0.0:5432->5432/tcp
Enter fullscreen mode Exit fullscreen mode

6. Experimentando o prato (docker exec)

Você está curioso pra saber como ficou o tempero. Então você se levanta e vai até a cozinha pra dar uma provadinha direto da panela:

docker exec -it minha-lasanha bash
Enter fullscreen mode Exit fullscreen mode

O chef te entrega um avental e você experimenta a lasanha (entra no terminal do container). Lá dentro, você pode fuçar o banco de dados, ver as tabelas, e até mudar umas coisinhas na receita se quiser. Quando se usa esse comando, você está dizendo para o Docker:

  • docker exec → Executa um comando dentro de um container que já está rodando.
  • it → Significa que queremos interagir com o terminal do container.
    • i (interactive): Mantém o terminal aberto para você interagir.
    • t (pseudo-TTY): Simula um terminal de verdade.
  • minha-lasanha → Nome do container que estamos acessando.
  • bash → O comando que queremos rodar dentro do container. Nesse caso, estamos abrindo um shell bash dentro dele.

Agora você está dentro do container e deve ver algo como:

root@abcd1234:/#
Enter fullscreen mode Exit fullscreen mode

Isso significa que você está dentro do ambiente isolado do container. Agora pode rodar comandos como se estivesse em um sistema operacional Linux normal.

Agora que você está na "cozinha", pode explorar como quiser. Aqui estão algumas coisas úteis:

Verificando arquivos dentro do container

ls -l
Enter fullscreen mode Exit fullscreen mode

Isso mostra os arquivos dentro do container. Você pode explorar e ver onde os dados do PostgreSQL estão armazenados.

Acessando o PostgreSQL dentro do container

Como estamos dentro de um container de banco de dados PostgreSQL, podemos abrir o cliente do banco e dar uma olhada nas tabelas:

psql -U postgres
Enter fullscreen mode Exit fullscreen mode

(O -U postgres indica que queremos conectar com o usuário postgres.)

Dentro do psql, você pode rodar comandos como:

\l   -- Lista os bancos de dados disponíveis
\dt  -- Lista as tabelas dentro do banco de dados
Enter fullscreen mode Exit fullscreen mode

Isso te dá uma visão do que está acontecendo no banco de dados dentro do container.

3️⃣ Saindo do container

Se quiser sair do ambiente do PostgreSQL, digite:

\q
Enter fullscreen mode Exit fullscreen mode

E para sair do container e voltar ao seu terminal normal, basta digitar:

exit
Enter fullscreen mode Exit fullscreen mode

7. Acompanhando o prepado (docker logs)

Enquanto você come, você encontra um cabelo na comida além de um gosto de camarão. Você é alergico a camarão e solicitou que não colocassem na receita. Então você pergunta ao garçom “posso olhar o diário do chefe” e ele te dá o diário.

docker logs minha-lasanha
Enter fullscreen mode Exit fullscreen mode

Você vê tudo o que rolou durante o preparo, desde quando acenderam o forno até o último toque de queijo. Se algo deu errado, você vai saber por aqui.


8. Devolver o prato (docker stop e docker rm)

Pelos fatores acima você decide que quer outro prato. Então você fala pro garçom: "Pode tirar essa lasanha da mesa."

docker stop minha-lasanha
Enter fullscreen mode Exit fullscreen mode

O garçom tira o prato da mesa, mas a louça suja ainda tá na cozinha. Se você quer tudo limpinho:

docker rm minha-lasanha
Enter fullscreen mode Exit fullscreen mode

9. Saindo do Restaurante

No fim, você sai do restaurante sabendo que:

  • Pode ver o cardápio com docker ps.
  • Ver as receitas no estoque com docker images.
  • Pedir pratos com docker run.
  • Dar uma provadinha na cozinha com docker exec.
  • Conferir os segredos do chef com docker logs.
  • Devolver o prato com docker stop e limpar a louça com docker rm.

Top comments (0)