Docker: O que é Docker?
O Docker garante que as aplicações sejam executadas exatamente da mesma forma em qualquer ambiente — ele empacota "código + dependências + configuração" em um contêiner portátil, acabando com o pesadelo do "funciona na minha máquina".
1. O Que Você Vai Aprender
- A Diferença Fundamental Entre Contêineres e Máquinas Virtuais
- Arquitetura de três camadas do Docker (Client / Daemon / Registry)
- O Relacionamento Entre Imagens e Contêineres
- Principais Casos de Uso do Docker
- O Processo de Inicialização do Contêiner
2. Uma História Real de uma Pessoa Desenvolvedora Backend
(1) Ponto de Dor: Desastres Causados por Ambientes Inconsistentes
Alice é desenvolvedora backend. Embora o projeto dela rode perfeitamente na máquina local, ela frequentemente encontra o problema do "funciona na minha máquina": os ambientes Ubuntu das pessoas colegas estão com dependências faltando, as versões das bibliotecas no servidor de testes CentOS estão incorretas e o ambiente de produção Red Hat exige recompilação. Cada deploy parece uma aposta — três ambientes, cinco rodadas de depuração e dois dias perdidos com "configuração de ambiente" em vez de escrever código.
(2) A Solução com Docker
Bob recomendou que ela usasse Docker: "Com apenas um comando, a aplicação vai rodar exatamente da mesma forma em qualquer sistema Linux."
# Compile uma vez, execute em qualquer lugar
docker build -t myapp:1.0 .
docker run -d -p 8080:80 myapp:1.0
(3) Benefício: Consistência Ambiental
Depois que Alice empacotou a aplicação em uma imagem Docker, a mesma imagem foi usada para executar a aplicação nos três ambientes — desenvolvimento, testes e produção — reduzindo o tempo de deploy de dois dias para 10 minutos e eliminando todos os problemas relacionados ao ambiente.
3. O Que É Conteinerização?
A conteinerização é uma tecnologia de virtualização leve que empacota uma aplicação com todas as suas dependências em um ambiente de execução isolado, garantindo execução consistente em qualquer infraestrutura.
graph TB
A["Deploy Tradicional<br/>App + SO + Hardware"] --> B["Virtualização<br/>App + SO Convidado + Hypervisor + SO Hospedeiro"]
B --> C["Conteinerização<br/>App + Motor de Contêiner + SO Hospedeiro"]
C --> D["Mais leve · Mais rápido · Mais consistente"]
(1) O Conceito Central da Conteinerização
- Build-and-Deploy: Aplicação + dependências + configuração = uma imagem; onde a imagem vai, a aplicação vai
- Isolamento não-virtual: Compartilha o kernel do hospedeiro; não emula um sistema operacional completo
- Compile uma vez, execute em qualquer lugar: Imagens compiladas no ambiente de desenvolvimento podem ser usadas diretamente no ambiente de produção
(2) Por Que São Chamados de "Contêineres"?
Pense nos contêineres da indústria de transporte: independentemente de estarem cheios de carros, roupas ou alimentos, os navios, trens e caminhões que os transportam não precisam saber — eles simplesmente transportam contêineres de tamanho padronizado. Os contêineres Docker são os contêineres do mundo do software:
| Dimensão | Contêiner de Transporte | Contêiner Docker |
|---|---|---|
| Padronização | Dimensões uniformes (20/40 pés) | Formato de imagem uniforme (padrão OCI) |
| Isolamento | Sem interferência entre cargas | Isolamento de processos/rede/sistema de arquivos |
| Portátil | Pode ser transportado por navio, trem ou caminhão | Roda em ambientes de desenvolvimento, testes e produção |
| Altamente Eficiente | Sem necessidade de desempacotar e trocar de veículo | Sem necessidade de reinstalar dependências |
4. Contêineres vs. Máquinas Virtuais
Tanto contêineres quanto máquinas virtuais fornecem ambientes isolados, mas são implementados de maneiras completamente diferentes.
graph TB
subgraph VM["Arquitetura de Máquina Virtual"]
VM_APP1["App 1"] --> VM_OS1["SO Convidado"]
VM_APP2["App 2"] --> VM_OS2["SO Convidado"]
VM_OS1 --> VM_H["Hypervisor"]
VM_OS2 --> VM_H
VM_H --> VM_HOST["SO Hospedeiro"]
VM_HOST --> VM_HW["Hardware"]
end
subgraph CT["Arquitetura de Contêiner"]
CT_APP1["App 1"] --> CT_APP2["App 2"]
CT_APP2 --> CT_CE["Motor de Contêiner<br/>Docker"]
CT_CE --> CT_KERNEL["Kernel do SO Hospedeiro"]
CT_KERNEL --> CT_HW["Hardware"]
end
(1) Comparação das Principais Diferenças
| Dimensão | Máquina Virtual (VM) | Contêiner |
|---|---|---|
| Nível de Isolamento | Isolamento em nível de hardware (kernel separado) | Isolamento em nível de processo (kernel compartilhado) |
| Velocidade de Inicialização | Minutos (para inicializar o SO completo) | Segundos (para iniciar um processo) |
| Uso de Recursos | Nível de GB (incluindo SO Convidado) | Nível de MB (apenas dependências da aplicação) |
| Tamanho da Imagem | 1–20 GB | 5–500 MB |
| Sobrecarga de Desempenho | 5–15% (sobrecarga de virtualização) | ≈0% (próximo do nativo) |
| Densidade | 5–10 VMs por máquina | 100–1.000 contêineres por máquina |
(2) Comparação de Casos de Uso
| Cenário | Máquina Virtual Recomendada | Contêiner Recomendado |
|---|---|---|
| Exige kernels de sistemas operacionais diferentes | ✅ (ex.: Windows e Linux rodando em paralelo) | ❌ |
| Microsserviços/Aplicações sem Estado | ❌ | ✅ (Leve, escalonamento rápido) |
| Requisitos de segurança com isolamento forte | ✅ (Isolamento em nível de kernel) | ⚠️ (Exige proteção adicional) |
| Ambiente de Build CI/CD | ❌ | ✅ (Inicia e encerra em segundos) |
| Consistência do Ambiente de Desenvolvimento | ❌ | ✅ (A imagem é o ambiente) |
| Executar aplicações GUI tradicionais | ✅ | ⚠️ (Exige configuração adicional) |
5. Arquitetura do Docker
O Docker utiliza uma arquitetura cliente-servidor e consiste em três componentes principais.
graph TB
CLI["Docker Client<br/>docker build/run/pull"]
CLI -->|REST API| D["Docker Daemon<br/>dockerd"]
D -->|pull/push| R["Docker Registry<br/>Docker Hub / Privado"]
D -->|create/start| C["Contêineres<br/>Instâncias em execução"]
D -->|build/cache| I["Imagens<br/>Modelos somente leitura"]
I -->|docker run| C
R -->|docker pull| I
(1) Explicação Detalhada da Arquitetura de Três Camadas
| Componente | Função | Comandos Comuns |
|---|---|---|
| Docker Client | A interface de linha de comando que as pessoas usuárias utilizam para interagir com o Docker | docker run / docker build / docker pull |
| Docker Daemon | Serviço em segundo plano que gerencia imagens, contêineres, redes e volumes | systemctl start docker / dockerd |
| Docker Registry | Um repositório para armazenar e distribuir imagens | docker pull / docker push |
(2) O Relacionamento Entre Imagens e Contêineres
Uma imagem é um modelo somente leitura, e um contêiner é uma instância em execução de uma imagem. Fazendo uma analogia com programação orientada a objetos:
| Conceito | Analogia com POO | Descrição |
|---|---|---|
| Imagem | Classe | Um modelo somente leitura que define tudo o que é necessário para executar a aplicação |
| Contêiner | Instância | O estado em execução de uma imagem; legível e gravável; possui um ciclo de vida |
| Dockerfile | Código Fonte | Arquivo de instruções para construir imagens |
(3) Padrão OCI
O Docker segue o padrão OCI (Open Container Initiative) para garantir a portabilidade dos contêineres:
- Especificações de Imagem: Define o formato e o layout da imagem
- Especificação de Runtime: Define o ambiente de execução do contêiner
- Especificação de Distribuição: Define o protocolo de distribuição da imagem
6. Principais Casos de Uso do Docker
(1) Visão Geral de Cenários
| Cenário | Descrição | Exemplo |
|---|---|---|
| Padronização do Ambiente de Desenvolvimento | Ambiente de desenvolvimento unificado para a equipe | Novas pessoas da equipe podem configurar toda a stack de desenvolvimento em 10 minutos |
| Deploy de Microsserviços | Cada serviço roda em seu próprio contêiner | API, BD e Cache são conteinerizados separadamente |
| Pipeline CI/CD | Ambiente de build consistente e reproduzível | GitHub Actions + Docker para deploy automatizado |
| Escalonamento Rápido | Instâncias iniciadas/encerradas em segundos | 1→10 réplicas durante picos de tráfego, 10→1 em horários de baixa |
| Conteinerização de Aplicações Legadas | Migrar aplicações legadas sem modificação | Empacotar um projeto PHP 5.4 de 2015 em um contêiner |
(2) O Processo de Inicialização do Contêiner
Quando você executa docker run hello-world, as seguintes etapas ocorrem internamente no Docker:
graph LR
A["docker run<br/>hello-world"] --> B{"Há uma imagem<br/>local?"}
B -->|Não| C["docker pull<br/>Baixar do Registry"]
B -->|Sim| D["Criar um Contêiner<br/>Camada gravável"]
C --> D
D --> E["Iniciar o contêiner<br/>Executar CMD"]
E --> F["Exibir Resultados<br/>Hello from Docker!"]
7. Experiência Prática com Docker
▶ Exemplo: Executando "hello-world" (Dificuldade: ⭐)
A Maneira Mais Simples de Testar o Docker — Verificar Se o Docker Está Instalado Corretamente.
# Baixar e executar a imagem hello-world
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
e6590344b1a5: Pull complete
Digest: sha256:7be1...2c2d
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
▶ Exemplo: Visualizando Informações de Configuração do Docker (Dificuldade: ⭐)
docker info Exibe a configuração completa do Docker daemon.
# Exibir informações do Docker em todo o sistema
docker info
Client: Docker Engine - Community
Version: 24.0.7
Context: default
Server:
Containers: 3
Running: 1
Paused: 0
Stopped: 2
Images: 5
Server Version: 24.0.7
Storage Driver: overlay2
Kernel Version: 5.15.0-91-generic
Operating System: Ubuntu 22.04
▶ Exemplo: Navegar pelas categorias de comandos Docker (Dificuldade: ⭐)
A CLI do Docker é categorizada por objetos de gerenciamento para facilitar a memorização.
# Listar todos os comandos de gerenciamento do Docker
docker --help
Management Commands:
builder Manage builds
container Manage containers
image Manage images
network Manage networks
volume Manage volumes
system Manage Docker
Commands:
run Create and run a new container
ps List containers
images List images
build Build an image from a Dockerfile
pull Pull an image from a registry
▶ Exemplo: Tente executar o servidor web Nginx (Dificuldade: ⭐⭐)
Inicie um servidor web com um único comando Docker — sem necessidade de instalar o Nginx.
# Executar Nginx em modo detached, mapear porta 8080 para a porta 80 do contêiner
docker run -d -p 8080:80 --name my-nginx nginx:latest
# Verificar se o contêiner está em execução
docker ps
CONTAINER ID IMAGE STATUS PORTS NAMES
a1b2c3d4e5f6 nginx:latest Up 10 seconds 0.0.0.0:8080->80/tcp my-nginx
Abra seu navegador e acesse http://localhost:8080 para ver a página de boas-vindas do Nginx.
▶ Exemplo: Ver a lista de contêineres em execução (Dificuldade: ⭐)
# Listar todos os contêineres em execução
docker ps
# Listar todos os contêineres (incluindo os parados)
docker ps -a
CONTAINER ID IMAGE STATUS PORTS NAMES
a1b2c3d4e5f6 nginx:latest Up 5 minutes 8080->80 my-nginx
f7e8d9c0b1a2 hello-world Exited (0) 3 minutes ago hungry_einstein
hello-world sai automaticamente após a execução (status: Exited). Isso não é um erro — é um contêiner de demonstração projetado para encerrar assim que termina de executar.
8. Verificando a Versão e Instalação do Docker
(1) Sistema de Versionamento do Docker
| Versão | Posicionamento | Frequência de Atualização | Casos de Uso |
|---|---|---|---|
| Docker Desktop | Edição Desktop para Desenvolvedores | Atualizações Trimestrais | Ambiente de Desenvolvimento Windows / Mac |
| Docker Engine | Edição para Servidores | Atualizações Trimestrais | Ambiente de Produção Linux |
| Docker CE | Edição Comunitária (Gratuita) | Atualização contínua | Indivíduos e equipes pequenas |
| Docker EE | Edição Empresarial (Paga) | Atualização Contínua | Grandes Empresas + Suporte Comercial |
(2) Verificar se a instalação foi bem-sucedida
# Verificar as versões do cliente e servidor Docker
docker version
# Verificação rápida: executar hello-world
docker run hello-world
Se docker version exibir informações tanto do Client quanto do Server, a instalação foi bem-sucedida.
9. Exemplo Completo: Um Guia Passo a Passo para Começar com Docker
# ============================================
# Passo a passo completo: Primeira experiência com Docker
# Abrange: verificação de versão, info, run, ps, limpeza
# ============================================
# 1. Verificar se o Docker está instalado e em execução
docker version
# 2. Visualizar informações do sistema Docker
docker info
# 3. Executar o contêiner hello-world (primeiro baixar, depois executar)
docker run hello-world
# 4. Executar um servidor web Nginx
docker run -d -p 8080:80 --name web nginx:latest
# 5. Listar contêineres em execução
docker ps
# 6. Parar e remover o contêiner Nginx
docker stop web
docker rm web
# 7. Visualizar todos os contêineres (incluindo parados)
docker ps -a
# 8. Limpar: remover o contêiner hello-world parado
docker rm $(docker ps -a -q --filter "ancestor=hello-world")
# docker version
Client: Docker Engine - Community
Version: 24.0.7
Server: Docker Engine - Community
Version: 24.0.7
# docker run hello-world
Hello from Docker!
# docker ps (enquanto Nginx está rodando)
CONTAINER ID IMAGE STATUS PORTS NAMES
a1b2c3d4e5f6 nginx:latest Up 10 seconds 0.0.0.0:8080->80/tcp web
❓ Perguntas Frequentes
P: Qual é a diferença entre Docker e VirtualBox? R: O VirtualBox emula um sistema operacional completo (incluindo o kernel), leva minutos para iniciar e consome gigabytes de recursos. O Docker compartilha o kernel do hospedeiro e isola apenas processos; ele inicia em segundos e consome megabytes de recursos. O Docker é mais leve e rápido, mas não suporta a execução de contêineres Windows em um host Linux (e vice-versa).
P: Um contêiner executa um sistema operacional? R: Não. Os contêineres compartilham o kernel do hospedeiro; eles não possuem kernel próprio. O "Ubuntu" dentro de um contêiner é meramente um conjunto de ferramentas de espaço de usuário (como bash e apt), não um sistema operacional completo. Esta é a razão fundamental pela qual os contêineres são mais leves que as máquinas virtuais.
P: O Docker só pode ser usado no Linux? R: Os contêineres Docker dependem de recursos do kernel Linux (namespaces/cgroups), portanto rodam nativamente no Linux. O Docker Desktop no Windows e Mac executa contêineres indiretamente por meio de máquinas virtuais Linux integradas (WSL2/Hypervisor), o que é transparente para a pessoa usuária.
P: Como instalo o Docker no Windows? R: Instale o Docker Desktop para Windows; ele usará automaticamente o WSL2 como backend. É necessário Windows 10 64-bit (versão 1903 ou superior) com WSL2 habilitado. Após a instalação, abra o Docker Desktop e execute
docker run hello-worldno terminal para verificar se funciona.
P: Os contêineres podem vazar dados do hospedeiro? R: Por padrão, não. Os contêineres usam namespaces do Linux para isolar sistemas de arquivos, redes e processos, portanto não podem acessar diretamente os arquivos do hospedeiro. A menos que um diretório do hospedeiro seja explicitamente montado (usando o parâmetro -v), os contêineres ficam isolados do hospedeiro. No entanto, executar um contêiner com a opção --privileged quebra esse isolamento; isso deve ser desabilitado em ambientes de produção.
P: Qual é a relação entre Docker e Kubernetes? R: O Docker é um runtime de contêiner (responsável por construir e executar contêineres individuais), enquanto o Kubernetes é uma plataforma de orquestração de contêineres (responsável por gerenciar o agendamento, escalonamento e autorrecuperação de centenas ou milhares de contêineres). O K8s usa o containerd (um runtime derivado do Docker) para executar contêineres e não depende mais diretamente do Docker.
P: Preciso saber Linux para aprender Docker? R: Você precisará de habilidades básicas de linha de comando Linux (ls, cd, mkdir, cat, grep), mas não precisa ser especialista em Linux. As operações principais do Docker são todas realizadas usando o comando
docker. Este tutorial começa do zero, e quaisquer conceitos necessários de Linux serão explicados à medida que avançamos.
📖 Resumo
- A conteinerização é uma tecnologia de virtualização leve que compartilha o kernel e fornece isolamento de processos; é mais leve e rápida que máquinas virtuais.
- Principais diferenças entre contêineres e máquinas virtuais: Contêineres compartilham o kernel do hospedeiro, iniciam em segundos e usam apenas alguns megabytes de memória
- Arquitetura de três camadas do Docker: Client (CLI) → Daemon (serviço em segundo plano) → Registry (repositório de imagens)
- Uma imagem é um modelo somente leitura, e um contêiner é uma instância em execução de uma imagem (analogia: classe vs. objeto)
- Principais Casos de Uso do Docker: Padronização de Ambiente, Deploy de Microsserviços, CI/CD, Escalonamento Rápido
docker run hello-worldé o primeiro passo para verificar a instalação do Docker
📝 Exercícios
- Exercício Básico (Dificuldade: ⭐): Instale o Docker Desktop e execute
docker run hello-world, depois tire uma captura de tela ou copie a saída. - Exercício Avançado (Dificuldade: ⭐⭐): Execute
docker infopara visualizar a configuração local do Docker e registre os valores dos três campos: Número de Contêineres, Storage Driver e Versão do Kernel. - Desafio (Dificuldade: ⭐⭐⭐): Liste três vantagens e três desvantagens de contêineres e máquinas virtuais, respectivamente, e explique em quais cenários você deve escolher contêineres e em quais cenários deve escolher máquinas virtuais.