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



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."

BASH
# 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.

100%
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

(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.

100%
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)
💡 Dica: Contêineres não substituem máquinas virtuais, mas são uma tecnologia complementar. Use máquinas virtuais para cenários que exigem isolamento completo de kernel e contêineres para isolamento em nível de aplicação.



5. Arquitetura do Docker

O Docker utiliza uma arquitetura cliente-servidor e consiste em três componentes principais.

100%
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:

📌 Ponto-chave: O padrão OCI significa que imagens construídas com Docker também podem ser executadas em outros runtimes de contêiner, como Podman e containerd.



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:

100%
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.

BASH
# Baixar e executar a imagem hello-world
docker run hello-world
💻 Saída:

TEXT 📖 Somente leitura
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.

BASH
# Exibir informações do Docker em todo o sistema
docker info
💻 Saída (trecho):

TEXT 📖 Somente leitura
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.

BASH
# Listar todos os comandos de gerenciamento do Docker
docker --help
💻 Saída (trecho):

TEXT 📖 Somente leitura
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.

BASH
# 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
💻 Saída:

TEXT 📖 Somente leitura
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: ⭐)

BASH
# Listar todos os contêineres em execução
docker ps

# Listar todos os contêineres (incluindo os parados)
docker ps -a
💻 Saída:

TEXT 📖 Somente leitura
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
⚠️ Nota: O contêiner 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

BASH
# 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

BASH
# ============================================
# 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")
💻 Saída (trecho):

TEXT 📖 Somente leitura
# 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-world no 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


📝 Exercícios

  1. 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.
  2. Exercício Avançado (Dificuldade: ⭐⭐): Execute docker info para 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.
  3. 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.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%