DOCKER —- SUPREME GUIDE
DOCKER —- SUPREME GUIDE
MATEUS CELESTINO PRO X/DOCKER —- SUPREME GUIDE

DOCKER —- SUPREME GUIDE

Categoria
Criado em
May 7, 2025 01:15 PM GMT+0
Última edição
May 7, 2025 02:57 PM GMT+0
notion image

📘 Sobre Docker: Entendendo Containers x Máquinas Virtuais de Forma Técnica e Profunda

🧠 Módulo 1: Fundamentos da Virtualização — Docker vs Máquinas Virtuais

🧱 1.1. Arquitetura Computacional: Recursos Fundamentais

Antes de mergulharmos nas diferenças entre Docker e Máquinas Virtuais (VMs), é essencial entender a estrutura básica de um sistema computacional moderno.
Um computador — seja local ou em nuvem — dispõe dos seguintes recursos físicos (hardware):
  • CPU (Unidade Central de Processamento): núcleo(s) de processamento responsáveis por executar instruções;
  • Memória RAM (Random Access Memory): armazenamento volátil de alta velocidade, usado para manter dados e processos temporariamente em execução;
  • Armazenamento (HD/SSD): onde os dados persistentes são mantidos — variando entre gigabytes (GB) e terabytes (TB);
  • Periféricos: dispositivos de entrada e saída, como câmera, microfone, teclado, GPU, etc.

🔧 1.2. Papel do Sistema Operacional e do Kernel

Todo esse hardware é orquestrado por um sistema operacional (SO), que é composto por duas partes:
  • Kernel (Núcleo): a camada mais fundamental do sistema. Atua como intermediário entre o hardware físico e os processos (softwares) executados. Ele gerencia:
    • A alocação de memória,
    • A execução e escalonamento de processos,
    • A comunicação com drivers de dispositivos,
    • E o controle de permissões e chamadas de sistema.
  • Processos de Espaço do Usuário: aplicações e serviços que interagem com o kernel através de APIs, bibliotecas e chamadas de sistema.

🧩 1.3. A Nova Era da Eficiência: Virtualização e Portabilidade

Com o avanço massivo no poder computacional moderno — multi-core, dezenas de GB de RAM, SSDs de alta velocidade — surgiu a necessidade de utilizar melhor os recursos disponíveis.
A busca por eficiência operacional, flexibilidade e portabilidade de aplicações se tornou um objetivo central na arquitetura moderna de TI.
E é aqui que surgem duas abordagens distintas de virtualização:
Critério
Máquinas Virtuais (VMs)
Containers (Docker)
Base
Virtualizam hardware completo
Virtualizam apenas o ambiente do sistema
Peso
Pesadas (cada VM roda um SO completo)
Leves (compartilham o kernel do Host)
Performance
Menor, devido à sobrecarga de SO
Alta performance
Isolamento
Forte (nível de SO)
Médio (nível de processo)
Inicialização
Lenta (boot completo)
Instantânea (start do processo)

🖥️ 1.4. Como Funcionam as Máquinas Virtuais

Uma Máquina Virtual (VM) cria um sistema computacional completo, emulado sobre o hardware físico. Cada VM é composta por:
  • Um sistema operacional próprio (Guest OS),
  • Suas bibliotecas,
  • Suas dependências,
  • E seus arquivos e aplicações.

⚙️ Exemplo Prático

Imagine que você possui um servidor físico Linux com os seguintes recursos:
  • 12 núcleos de CPU
  • 24 GB de memória RAM
Você decide rodar uma VM com Windows, alocando:
  • 4 núcleos de CPU
  • 8 GB de RAM
Neste cenário:
notion image
  • A VM consome exclusivamente os 4 núcleos e 8 GB enquanto estiver ativa;
  • Esses recursos ficam inacessíveis ao sistema Host (Linux) durante o tempo de execução;
  • Periféricos (como webcam ou microfone) podem ser "passados" diretamente à VM — mas novamente, ficam indisponíveis para o Host até a VM ser desligada.
🧠 Observação crítica: A tecnologia que viabiliza essa virtualização de hardware é chamada de Hypervisor— um software especializado que gerencia múltiplos sistemas operacionais no mesmo hardware físico.

⚖️ 1.5. Características Técnicas das VMs

✅ Vantagens:

  • Isolamento Total: cada VM opera em um ambiente fechado, ideal para segurança, sandboxing, ambientes heterogêneos (Linux dentro de Windows e vice-versa);
  • Ambientes Dedicados: perfeito para simular infraestruturas completas;
  • Compatibilidade Completa: permite rodar aplicações que exigem um sistema operacional específico.

❌ Desvantagens:

  • Alto consumo de recursos: exige memória e armazenamento duplicado por conta de múltiplos SOs;
  • Inicialização demorada: boot do SO, carregamento de serviços e inicialização de aplicações;
  • Menor portabilidade: mover VMs entre sistemas exige muito mais tempo, configuração e compatibilidade.
 
notion image

🔎 1.6. O Papel das VMs na Arquitetura Moderna

Máquinas virtuais ainda são extremamente relevantes em contextos como:
  • Data centers corporativos tradicionais
  • Ambientes regulados ou com requisitos legais de isolamento
  • Execução de sistemas legados, onde não há opção de migrar para contêineres,
  • Simulações e testes de segurança, onde o isolamento é vital.
 

🐳 1.7. O Modelo Docker: Containerização Moderna de Aplicações

🚢 A Filosofia por Trás do Docker

Diferente das Máquinas Virtuais que virtualizam todo o sistema operacional, o Docker adota uma abordagem mais enxuta, chamada de containerização.
Essa técnica revolucionou a forma como aplicações são empacotadas, distribuídas e executadas, promovendo portabilidade, leveza e desempenho extremo.

🔬 1.8. O Que São Containers, Tecnicamente?

Um container Docker é um ambiente isolado de execução que compartilha o kernel do sistema operacional do host, mas mantém seu próprio espaço de usuário (user space).
Ou seja:
  • kernel é único e compartilhado
  • Mas cada container possui:
    • Suas próprias bibliotecas,
    • Suas dependências,
    • Suas variáveis de ambiente,
    • E sua percepção isolada do sistema.
Essa combinação permite que o container:
  • Rode como se estivesse em um sistema separado,
  • Mas com muito menos sobrecarga que uma VM.

🧱 1.9. Containerização na Prática: Eficiência por Design

Imagine novamente um host Linux com 12 núcleos de CPU e 24GB de RAM.
Ao criar um container Docker:
  • Por padrão, ele enxerga todos os recursos do host (12 núcleos, 24GB);
  • No entanto, você pode restringir explicitamente os recursos disponíveis com flags como -cpus-memory ou control groups (cgroups).

🧠 Exemplo:

bash CopiarEditar docker run --cpus="2.0" --memory="1g" ubuntu
Aqui, você está limitando o container a 2 núcleos de CPU e 1GB de RAM, mesmo que o host tenha mais.
Diferente das VMs, não há reserva física de recursos; há apenas uma limitação lógica/virtual.

🔐 1.10. Isolamento com Namespaces

Containers fornecem isolamento através de uma poderosa funcionalidade do kernel Linux: os namespaces.
Cada namespace isola um aspecto do sistema. Exemplo:
  • PID Namespace → isola processos;
  • NET Namespace → isola interfaces de rede;
  • MNT Namespace → isola sistema de arquivos montado;
  • UTS Namespace → isola hostname;
  • IPC Namespace → isola comunicação entre processos;
  • USER Namespace → permite mapeamento de UID/GID distintos.

🧬 Visualização:

Se os processos A e B estão rodando diretamente no host, e você inicia o processo C dentro de um container, então:
  • container verá apenas o processo C;
  • host verá A, B e C.
Essa característica garante:
  • Segurança por isolamento,
  • Redução de conflitos entre processos,
  • Capacidade de executar múltiplos containers simultaneamente, mesmo com aplicações idênticas.

⚙️ 1.11. Leveza e Escalabilidade Extrema

Devido ao compartilhamento do kernel e à inexistência de boot completo de SO, os containers:
  • Iniciam em milissegundos;
  • Consumem muito menos memória e disco;
  • Permitem rodar dezenas, centenas ou milhares em uma única máquina poderosa — algo impossível com VMs.
Essa leveza é fundamental para arquiteturas modernas de microserviços, onde:
  • Cada container executa uma pequena parte (serviço) de uma aplicação maior;
  • Serviços são escaláveis, modulares e substituíveis sem afetar o restante do sistema.

notion image

🧳 1.12. Portabilidade e Consistência Total

 
Containers Docker empacotam uma aplicação com todas as suas dependências: binários, bibliotecas, configurações — tudo o que ela precisa para rodar.
Isso garante:
  • Ambientes consistentes, independentemente de onde você executa:
    • Sua máquina local,
    • Um servidor de staging,
    • Um cluster Kubernetes,
    • Ou um provedor cloud como AWS, GCP ou Azure.
  • Evita o clássico problema de "na minha máquina funciona".

🖥️ 1.13. Compatibilidade com Hosts Não-Linux

O Docker é nativo do Linux — containers dependem da infraestrutura do kernel Linux.
Mas como rodar containers em Windows ou macOS?
A solução é simples e elegante:
  • Docker Desktop inicia uma VM leve com kernel Linux (geralmente via Hyper-V, WSL2 ou QEMU);
  • Essa VM fornece o ambiente Linux necessário;
  • O usuário continua interagindo normalmente com docker rundocker build, etc.
Tudo é transparente para o desenvolvedor, mantendo a experiência fluida.

🧪 1.14. Aplicações Reais dos Containers

Containers são ferramentas de aplicação, não de infraestrutura.
Se você quer isolar o sistema operacional inteiro → use VM.
Se você quer empacotar, escalar e rodar aplicações de forma leve → use container.

📦 Casos de uso ideais:

  • Desenvolvimento de Software com Ambientes Consistentes
  • Deploy de Aplicações em Produção
  • Execução de Microserviços
  • Testes Automatizados com Ambientes Isolados
  • CI/CD Pipelines (Integração e Entrega Contínuas)
 

📘 1.15. Conceitos Fundamentais do Docker

🔍 O Que é o Docker?

O Docker é uma plataforma open-source de containerização que revolucionou o ciclo de vida de desenvolvimento de software, oferecendo uma maneira poderosa de empacotar, distribuir e executar aplicações em ambientes isolados, consistentes e portáveis.
Ao utilizar o Docker, você transforma sua aplicação e tudo o que ela precisa para funcionar — incluindo:
  • Código-fonte,
  • Ambiente de execução (runtime),
  • Bibliotecas e dependências do sistema,
  • Ferramentas auxiliares (CLI, scripts, utilitários),
  • Variáveis de ambiente e configurações,
em um único pacote executável padronizado, chamado de container.

📦 1.16. O Que é um Container Docker?

Tecnicamente, um container Docker é uma instância em execução de uma imagem Docker. Ele é:
  • Leve: Compartilha o kernel com o host e outros containers;
  • Isolado: Cada container tem seu próprio espaço de execução e recursos isolados;
  • Portável: Pode ser executado de forma idêntica em qualquer ambiente (dev, teste, produção, cloud);
  • Reprodutível: Garante que o comportamento da aplicação seja o mesmo, independentemente de onde esteja rodando.
Resumo poderoso: Um container é como uma "mini máquina virtual" dedicada à sua aplicação — mas sem o peso e a sobrecarga de um sistema operacional completo.

🔧 1.17. Componentes Essenciais do Docker

Para operar, o Docker é composto por quatro blocos fundamentais, cada um com papel técnico distinto:

1. Docker Engine

É o motor central do Docker, o serviço que torna tudo possível. Ele gerencia:
  • A construção de imagens (docker build),
  • A execução de containers (docker run),
  • O controle de redes, volumes, logs, etc.
A engine é dividida em duas partes principais: cliente e daemon (ver arquitetura mais abaixo).

2. Docker Images

São modelos somente leitura que definem como um container deve ser construído e executado. Cada imagem é construída a partir de um Dockerfile, que descreve passo a passo como criar o ambiente da aplicação.
Exemplo de Dockerfile simplificado:
dockerfile CopiarEditar FROM python:3.11 COPY . /app WORKDIR /app RUN pip install -r requirements.txt CMD ["python", "main.py"]
🧠 Isso cria uma imagem que:
  • Usa Python 3.11 como base,
  • Copia seu código para dentro do container,
  • Instala as dependências,
  • E executa o script main.py.

3. Docker Containers

 
Um container é uma instância ativa e em execução de uma imagem.
Você pode pensar da seguinte forma:
  • Imagem = blueprint (projeto arquitetônico);
  • Container = construção final baseada nesse blueprint.
Cada container pode:
  • Ter seu próprio ciclo de vida (startstoppauseremove),
  • Ser destruído e recriado com facilidade,
  • Ser atualizado de forma incremental com novos builds.

4. Docker Registry

Registries são repositórios remotos onde as imagens são armazenadas e distribuídas.
  • Docker Hub é o registro público padrão e gratuito;
  • Também existem registros privados como HarborGitLab Container RegistryAWS ECRAzure ACR, entre outros.
Com um registry, você pode versionar suas imagens, compartilhá-las entre equipes, integrá-las com pipelines CI/CD e mantê-las seguras.

🏗️ 1.18. Arquitetura do Docker: Modelo Cliente-Servidor

O Docker adota uma arquitetura moderna e robusta de cliente-servidor, onde cada componente tem responsabilidades bem definidas:

🖥️ 1. Docker Daemon (dockerd)

  • É o servidor que escuta comandos do cliente;
  • Gerencia os containers, imagens, volumes, redes;
  • Exige permissões administrativas para rodar;
  • Roda como serviço em segundo plano.

💻 2. Docker Client (docker)

  • Interface linha de comando (CLI) com a qual o desenvolvedor interage diretamente;
  • Cada comando que você roda (docker rundocker build, etc.) envia instruções ao dockerd via API HTTP(RESTful).
🧠 Exemplo:
bash CopiarEditar docker run nginx
Esse comando envia uma requisição HTTP para o daemon requisitando a execução de um container baseado na imagem nginx.

☁️ 3. Docker Registry

  • Onde as imagens são armazenadas, versionadas e publicadas;
  • O daemon pode puxar (pull) ou publicar (push) imagens para o registro;
  • Registries privados exigem autenticação via docker login.

🔐 1.19. Isolamento, Segurança e Modularidade

Os containers são processos Linux comuns, mas que rodam com namespaces, cgroups e layers de segurança adicionais:
  • Isolamento de rede
  • Isolamento de sistema de arquivos
  • Controle de acesso ao hardware
  • Capacidades reduzidas por padrão
Esse modelo torna o Docker seguro por padrão, mas flexível o suficiente para ser usado em produção, em escala e em ambientes críticos.

🚀 1.20. Por Que o Docker Revolucionou o Desenvolvimento?

Vantagens Estratégicas:

  • Elimina problemas de ambiente: "Funciona na minha máquina" não existe mais.
  • Reduz tempo de setup: de horas para segundos.
  • Permite DevOps real: integração contínua, testes, deploys automatizados.
  • Padroniza ambientes: em times pequenos ou empresas globais.
  • Acelera escopo de CI/CD, microserviços e escalabilidade.
 

📘 1.21. Uso Prático do Docker: Instalação, Testes e Primeiros Passos

🧰 Instalação do Docker: Abordagens Práticas por Sistema Operacional

Existem diferentes maneiras de instalar o Docker, dependendo do seu sistema operacional e do objetivo (uso pessoal com interface gráfica ou servidor em linha de comando).

🖥️ 1. Docker Desktop (GUI)

Docker Desktop é uma solução tudo-em-um que oferece:
  • Interface gráfica para gerenciamento de containers, imagens, volumes e redes;
  • Visualização de consumo de recursos em tempo real;
  • Instalação simplificada do Docker Engine + CLI + VM de suporte.
✅ Recomendado para iniciantes, desenvolvedores e ambientes locais.

🔗 Link oficial:


🍎 2. Instalação via Homebrew (macOS e Linux)

Se você está em um ambiente UNIX-like (macOS ou distribuições Linux com suporte ao Homebrew), pode instalar o Docker CLI diretamente via terminal.

💻 Comando:

bash CopiarEditar brew install docker
Esse método instala apenas o cliente Docker (docker), não o daemon (dockerd).
Portanto, ele precisa de um daemon remoto ativo ou do Docker Desktop para funcionar corretamente.

🐧 3. Instalação Manual no Linux (Servidor)

Para uso em servidores Linux (sem interface gráfica), o ideal é instalar o Docker Engine diretamente, de forma nativa e otimizada.
✅ Recomendado para sysadmins, servidores cloud, ambientes de produção.

📚 Guia prático:

Esse processo envolve:
  1. Atualizar pacotes;
  1. Adicionar o repositório oficial do Docker;
  1. Instalar os pacotes docker-cedocker-ce-clicontainerd.io;
  1. Habilitar o serviço com systemctl.

🤖 1.22. Comando Inicial: docker run hello-world

Após instalar o Docker, o primeiro teste de validação universal é o comando:
bash CopiarEditar docker run hello-world

🔍 O Que Esse Comando Faz?

Esse comando executa o container "hello-world", uma imagem minimalista criada pela equipe do Docker para verificar se a instalação está funcional.

🚀 Etapas que acontecem nos bastidores:

  1. Busca local da imagem:
    1. O Docker verifica se a imagem hello-world já está presente localmente.
  1. Download da imagem (se necessário):
    1. Se a imagem não estiver presente, o Docker realiza o pull automático do repositório Docker Hub, o registro público padrão.
  1. Criação do container:
    1. Com a imagem em mãos, o Docker instancia um container temporário com base nela.
  1. Execução do código contido na imagem:
    1. O container executa um simples programa que imprime uma mensagem confirmando que o Docker está funcionando corretamente.
  1. Finalização automática:
    1. O container é encerrado assim que a execução termina, pois sua função é unicamente exibir a mensagem.

📦 Output Esperado:

bash CopiarEditar Hello from Docker! This message shows that your installation appears to be working correctly.
Se você recebeu essa mensagem, sua instalação está 100% funcional.

📘 1.23. Detalhamento Técnico do docker run

Vamos dissecar o comando:
bash CopiarEditar docker run hello-world

🔬 Componente por componente:

  • docker: chama o cliente da CLI;
  • run: comando que solicita ao Docker Engine que:
    • baixe a imagem (se necessário),
    • crie um container,
    • execute o processo padrão da imagem (definido no Dockerfile);
  • hello-world: nome da imagem que será utilizada como base.

🎯 1.24. Por que esse comando é importante?

  • Valida a instalação do Docker localmente;
  • Testa a comunicação entre cliente e daemon;
  • Confirma acesso ao Docker Hub (internet + autenticação se necessário);
  • Demonstra o ciclo completo: Pull → Create → Start → Execute → Exit.
🧠 Dica de diagnóstico: Se o docker run hello-world falhar, o problema pode estar na instalação, no daemon ou no acesso à internet (pull de imagem).

🔄 Fluxo Resumido: Primeira Execução com Docker

plaintext CopiarEditar [CLI] docker run hello-world ↓ [Cliente] Envia requisição → [Daemon] ↓ [Daemon] Verifica se a imagem existe localmente ↓ [Se não] → Puxa imagem do Docker Hub ↓ Cria container → Executa aplicação → Exibe mensagem → Container f
 

📘 1.25. Dockerfile: Construindo Imagens de Forma Declarativa

🧱 O Que é um Dockerfile?

Dockerfile é um arquivo de texto com instruções declarativas que define como uma imagem Docker deve ser construída.
Pense nele como o manual de montagem de um container. Ele contém etapas sequenciais, que são interpretadas pelo Docker para empacotar:
  • O sistema operacional base,
  • As bibliotecas,
  • O código da aplicação,
  • E os comandos padrão de execução.

📝 1.26. Exemplo Simples de Dockerfile

dockerfile CopiarEditar FROM alpine CMD ["echo", "simple echo output"]

🔍 Análise Linha a Linha

🔹 FROM alpine

  • Especifica a imagem base da qual a nova imagem será construída.
  • Neste caso, estamos utilizando a imagem oficial Alpine Linux — uma distribuição minimalista, extremamente leve (~5MB), ideal para containers enxutos e rápidos.
Fonte: Alpine no Docker Hub

🔹 CMD ["echo", "simple echo output"]

  • Define o comando padrão que será executado quando o container for iniciado.
  • O uso de sintaxe em forma de array JSON é preferido, pois evita invocação de um shell (sh -c) e oferece maior previsibilidade.
Ao executar o container, ele rodará:
bash CopiarEditar echo "simple echo output"

🏗️ 1.27. Construindo uma Imagem Docker com o Dockerfile

Para transformar esse Dockerfile em uma imagem, utilizamos o comando:
bash CopiarEditar docker build --tag test:0.1 .

🔍 Explicação dos parâmetros:

  • docker build: comando que constrói uma nova imagem Docker;
  • -tag test:0.1: define a tag (nome + versão) da imagem gerada. Nesse caso, o nome é test e a versão é 0.1;
  • . (ponto): indica que o Dockerfile está localizado no diretório atual.
Por convenção, imagens seguem o formato:
nome_da_imagem:tag
Exemplo: nginx:latestpython:3.11-slim

🚀 1.28. Executando a Imagem Criada

Uma vez construída a imagem, podemos executar um container baseado nela com:
bash CopiarEditar docker run test:0.1
Isso criará um novo container, baseado na imagem test:0.1, que executará:
bash CopiarEditar echo "simple echo output"
E imprimirá a saída no terminal:
bash CopiarEditar simple echo output

🔎 1.29. Explorando a Imagem e o Container Criado

📦 Listar Imagens Disponíveis

bash CopiarEditar docker images
Exibe todas as imagens disponíveis localmente, incluindo:
  • Nome (REPOSITORY)
  • Tag (TAG)
  • ID da imagem (IMAGE ID)
  • Data de criação
  • Tamanho

📋 Ver Containers em Execução

bash CopiarEditar docker container ls
Mostra apenas os containers ativos no momento.

🧟 Ver Todos os Containers (incluindo encerrados)

bash CopiarEditar docker container ls -a
Lista todos os containers, inclusive os que já foram finalizados (Exited).
Você verá que o container executado anteriormente estará em status Exited, pois o comando echo finaliza rapidamente.
O Docker atribui um nome aleatório ao container, como clever_babbage ou happy_torvalds, caso você não forneça um nome manualmente com --name.

🧠 Dica Profissional: Ciclo de Vida do Container

plaintext CopiarEditar docker build → cria imagem ↓ docker run → instancia container da imagem ↓ Container executa o comando ↓ Comando finaliza → Container entra em estado "Exited" ↓ Container pode ser reiniciado, removido, ou inspecionado

🧪 1.30. Boas Práticas com Dockerfile

  • ❗ Sempre comece com a menor imagem base possível (Alpine, Slim, etc.);
  • 🔁 Use múltiplos estágios de build (multi-stage builds) para otimizar imagens de produção;
  • 🧹 Remova dependências desnecessárias no final da build;
  • 🔒 Nunca inclua segredos, tokens ou credenciais dentro do Dockerfile;
  • 📂 Use .dockerignore para excluir arquivos inúteis da build (como .gitnode_modules, etc).
 

📘 1.31. Execução Interativa e Gerenciamento de Containers no Docker

🧪 Relembrando: Por que o container anterior desapareceu do docker container ls?

Containers criados a partir da imagem test:0.1 com echo são processos de execução única. Após executarem o comando (neste caso, echo), o processo termina e o container entra em estado Exited.

📌 Como visualizar containers encerrados?

bash CopiarEditar docker container ls -a
Esse comando lista todos os containers, inclusive os que já terminaram a execução.

🚀 Execução Interativa de Container com Shell

Para ter um container interativo, com terminal acessível, usamos:
bash CopiarEditar docker run --rm -it --name test_container test:0.1 /bin/sh

🔍 Análise Completa do Comando

Parâmetro
Significado Técnico
docker run
Cria e executa um container a partir de uma imagem
--rm
Remove automaticamente o container após sua finalização
-it
Combina dois parâmetros:• -i (stdin aberto para interação)• -t (aloca terminal virtual - TTY)
--name test_container
Define manualmente o nome do container (evita nomes aleatórios como sharp_minsky)
test:0.1
Imagem a ser usada como base
/bin/sh
Comando a ser executado dentro do container (shell do Alpine)
🧠 O comando sh é o shell padrão minimalista disponível em sistemas Alpine Linux.

✅ O Que Acontece Quando Você Executa Isso:

  1. O Docker cria um container com base na imagem test:0.1;
  1. Entra no modo interativo;
  1. Abre um shell (sh) dentro do container;
  1. Permite você usar comandos como lscdecho, etc;
  1. Ao digitar exit, o container termina;
  1. Como foi executado com -rm, o container é automaticamente removido.

🖥️ Exemplos de Uso Dentro do Container

Ao iniciar o shell interativo, você pode:
bash CopiarEditar ls # Listar arquivos cat /etc/os-release # Ver informações do Alpine Linux apk add curl # Instalar pacotes via gerenciador Alpine

🧹 Limpando Containers que Já Terminaram

Se você criou containers sem o flag --rm, eles permanecem em estado Exited, ocupando espaço e recursos no sistema.

📋 Ver containers finalizados:

bash CopiarEditar docker container ls -a
Você verá algo como:
plaintext CopiarEditar CONTAINER ID IMAGE COMMAND STATUS NAMES ed35a0fceeaa test:0.1 "echo simple echo ..." Exited (0) 2 minutes ago sharp_minsky

🗑️ Remover container usando ID (parcial):

bash CopiarEditar docker container rm ed35
Pode usar apenas os 4 primeiros dígitos do ID, se forem únicos.

🗑️ Remover usando nome:

bash CopiarEditar docker container rm sharp_minsky

🧠 Dica Profissional: Automatize a Limpeza

Para remover todos os containers finalizados de uma vez:
bash CopiarEditar docker container prune
⚠️ Cuidado: remove todos containers que estão em Exited, sem perguntar.

📜 Fluxo Completo: Criar, Explorar e Limpar

bash CopiarEditar docker build -t test:0.1 . # Cria imagem docker run test:0.1 # Executa (comando echo, sai rapidamente) docker container ls -a # Verifica container Exited docker run --rm -it --name test_container test:0.1 /bin/sh # Executa interativamente (exit) # Sai do container docker container ls # Nada aparece (foi removido com --rm) docker container rm <ID ou nome> # Remove containers residuais
 
 

📘 1.32. Persistência de Dados em Containers com Volumes

🧪 O Problema da Volatilidade de Containers

Por padrão, qualquer arquivo criado dentro de um container Docker é efêmero: assim que o container é encerrado e removido, todos os dados internos são perdidos.
Isso representa um problema real em aplicações que:
  • Geram logs,
  • Armazenam arquivos temporários,
  • Usam bancos de dados locais,
  • Fazem uploads de usuários.

💾 A Solução: Volumes

Volumes são espaços de armazenamento persistente criados e gerenciados pelo Docker, ou montados a partir do sistema de arquivos do host.
Eles permitem:
  • Compartilhar dados entre containers;
  • Manter dados intactos mesmo após a destruição do container;
  • Controlar de forma mais precisa a origem e o destino dos arquivos usados.

🧰 1.33. Tipos de Volumes no Docker

1. Bind Mounts (Montagens Diretas do Host)

Montam um diretório ou arquivo do host dentro do container.

🔧 Sintaxe:

bash CopiarEditar docker run -v <caminho_no_host>:<caminho_no_container> <imagem>

📌 Exemplo prático:

bash CopiarEditar docker run -v $(pwd)/data:/app/data alpine ls /app/data
Monta o diretório local ./data no caminho /app/data dentro do container Alpine, e lista os arquivos contidos.

2. Named Volumes (Volumes Gerenciados pelo Docker)

Criados e gerenciados internamente pelo Docker, armazenados em /var/lib/docker/volumes.

🔧 Sintaxe:

bash CopiarEditar docker volume create meu_volume docker run -v meu_volume:/app/data alpine
Docker irá automaticamente:
  • Criar o volume (se não existir),
  • Mapear o volume para o caminho dentro do container.

📂 1.34. Bind Mount vs Named Volume: Diferenças Estratégicas

Critério
Bind Mount
Named Volume
Localização
Caminho absoluto no host (/home/user/projeto)
Gerenciado pelo Docker (/var/lib/docker/volumes/)
Performance
Depende do sistema de arquivos do host
Mais rápido (acessado via driver nativo)
Backup/Portabilidade
Mais fácil (visível diretamente)
Requer docker volume export/import
Gerenciamento
Manual (controle externo)
Integrado ao Docker (docker volume lsinspect, etc.)
Casos de uso
Desenvolvimento, compartilhamento com IDEs
Produção, banco de dados, logs persistentes

🔐 1.35. Permissões e Propriedade de Arquivos

Por padrão, containers Docker são executados como o usuário root.
Isso significa que:
  • Qualquer arquivo criado em um volume montado (via v) será propriedade do root;
  • Pode causar problemas de permissões no host (ex: arquivos não-editáveis sem sudo);
  • Em macOS, o Docker Desktop faz o bind mount como o usuário que executou o comando.

🧠 Solução Profissional:

  • Use -user para mapear UID/GID manualmente;
  • Configure permissões no host;
  • Use volumes Docker gerenciados em produção para evitar conflitos.

📦 1.36. Criando e Gerenciando Named Volumes

✅ Criar um volume:

bash CopiarEditar docker volume create meu_volume

🔍 Listar volumes:

bash CopiarEditar docker volume ls

🔎 Inspecionar detalhes:

bash CopiarEditar docker volume inspect meu_volume

🧹 Remover volume:

bash CopiarEditar docker volume rm meu_volume

🔁 1.37. Exemplo Avançado: Usando Named Volume com MySQL

bash CopiarEditar docker volume create mysql_data docker run -d \ --name meu_mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -v mysql_data:/var/lib/mysql \ mysql:5.7
Isso cria um container do MySQL persistente com os dados gravados em um volume chamado mysql_data, que não será removido ao deletar o container.

🧪 1.38. Dica: Visualizando Conteúdo de Volumes

Como volumes são armazenados em /var/lib/docker/volumes, você pode acessá-los diretamente (com sudo) em sistemas Linux:
bash CopiarEditar sudo ls /var/lib/docker/volumes/meu_volume/_data

🧠 Conclusão Técnica: Quando Usar o Que?

Objetivo
Solução Recomendada
Compartilhar arquivos entre container e host em tempo real
Bind Mount
Persistir banco de dados entre execuções
Named Volume
Executar container de leitura de logs externos
Bind Mount com ro (somente leitura)
Container de produção com performance ideal
Named Volume

 

📘 1.39. Expondo Portas no Docker: Comunicação com o Mundo Externo

🌐 O Problema: Como tornar um serviço acessível fora do container?

Containers são, por padrão, isolados em sua própria rede interna Docker.
Se um serviço (ex: um servidor web, API, ou Jupyter) roda dentro do container, ele só estará acessível dentro da rede do container, a menos que você exponha explicitamente a porta que ele utiliza.

🔧 1.40. Duas Etapas para Expor uma Porta Docker

✅ 1. No Dockerfile: Definir a porta interna

Use a diretiva:
dockerfile CopiarEditar EXPOSE <porta_interna>
Esta instrução é documentacional — serve para registrar qual porta o container usa internamente.
Ela não mapeia automaticamente a porta para o host. Essa ação é feita no próximo passo.

✅ 2. No docker run: Mapear porta do container para o host

Use o parâmetro -p (de publish) para mapear uma porta do container para a máquina host:
bash CopiarEditar docker run -p <porta_host>:<porta_container> <imagem>
Isso cria um redirecionamento entre a porta pública no host e a porta interna usada pelo serviço no container.

🧠 Entendendo a Sintaxe do p

bash CopiarEditar -p 8080:80
Significa:
  • A porta 80 (interna ao container) será acessível externamente via porta 8080 no host.
  • Se você abrir http://localhost:8080, estará atingindo o serviço rodando na porta 80 do container.

📦 Exemplo Prático: Jupyter com TensorFlow + PyTorch

bash CopiarEditar docker run --rm \ -v $(pwd):/iti \ -p 8765:8888 \ infotrend/ctpo-jupyter-tensorflow_pytorch_opencv

🔍 Análise Detalhada:

Comando
Função
--rm
Remove o container após sua finalização
-v $(pwd):/iti
Monta o diretório atual do host como /iti dentro do container
-p 8765:8888
Expõe a porta 8888 (do container) como 8765 (no host)
infotrend/...
Nome da imagem utilizada

🧪 O que esse comando faz?

  • Roda um container que inicia um servidor Jupyter Lab escutando na porta 8888;
  • Monta o diretório atual para salvar os notebooks e arquivos usados;
  • Torna o Jupyter acessível via http://localhost:8765 no navegador do host;
  • Após encerramento do container (CTRL+C ou exit no Jupyter), ele é automaticamente removido.

🔐 Considerações de Segurança

  • Ao usar p, você está expondo um serviço local na rede externa. Em ambientes de produção, isso pode representar risco.
  • Use firewalls, reverse proxies (ex: Nginx) e autenticação JWT quando necessário.
  • Nunca exponha serviços sem autenticação em portas públicas da internet (ex: Redis, MySQL, APIs REST).

⚙️ EXPOSE vs -p: Diferenças Fundamentais

Ação
EXPOSE
-p
Função
Documentar a porta usada internamente
Publicar porta na rede externa
Local
Dockerfile
docker run
Efetividade
Sem efeito prático sozinho
Efetivo no roteamento
Finalidade
Informar uso de porta
Acessar container do host ou internet

🎯 Visualização do Fluxo de Rede

plaintext CopiarEditar [Internet ou Navegador Local] ↓ Host:Porta 8765 ↓ (Docker Engine faz NAT) ↓ Container:Porta 8888 (Jupyter)

🧠 Dica de Diagnóstico

  • Use docker container inspect <container> para verificar as portas expostas e mapeadas;
  • Use ss -tuln ou netstat -tuln no host para ver quais portas estão abertas;
  • Com Docker Desktop, você pode visualizar as portas ativas diretamente pela interface gráfica.

🔄 Exemplo de Dockerfile com EXPOSE

dockerfile CopiarEditar FROM python:3.11-slim RUN pip install jupyter WORKDIR /notebooks EXPOSE 8888 CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--allow-root", "--no-browser"]
Aqui, estamos criando uma imagem com Jupyter configurado e expondo a porta 8888, que depois pode ser publicada com -p.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Autor do artigo

Sou formado em Marketing Digital por uma das principais faculdades do Brasil, com carreira construída unindo tecnologia, automação e estratégia digital.
 
notion image
Apaixonado por inovação, me especializei em T.I. e automação de marketing com inteligência artificial, criando soluções que ajudam empresas a vender mais, automatizar processos e crescer com eficiência.
Atuo como empreendedor digital, desenvolvendo sistemas completos com foco em automação de vendas, atendimento inteligente via WhatsApp e integração de ferramentas modernas com IA.
Minha missão é transformar ideias em sistemas inteligentes que funcionam de forma autônoma, liberando tempo e energia para que você possa focar no que realmente importa: o crescimento do seu negócio.
AGENDE AGORA !AGENDE AGORA !