Docker no Linux: Guia Completo para Iniciantes

setembro 1, 2026 · 8 min de leitura · Luiz Seabra

Docker no Linux: Guia Completo para Iniciantes

Introdução

Docker revolucionou a forma como desenvolvemos, empacotamos e executamos aplicações. No Linux, ele se integra ao kernel através de cgroups e namespaces, permitindo isolamento leve e portátil. Este artigo é direcionado a profissionais de infraestrutura, DevOps e entusiastas de homelab que ainda não dominam Docker. Você descobrirá por que Docker é importante, quais problemas ele resolve e o que será ensinado ao longo deste guia.

O que você vai aprender

  • Conceitos fundamentais: containers, imagens, Docker Engine, registries.
  • Diferença entre containers e máquinas virtuais.
  • Instalação segura do Docker no Ubuntu.
  • Principais comandos (docker run, docker ps, docker exec, etc.).
  • Criação e estrutura de um Dockerfile.
  • Gerenciamento de volumes (named vs bind mount).
  • Configuração de redes Docker.
  • Laboratório prático com Nginx.
  • Boas práticas e segurança.

Pré‑requisitos

  • Sistema operacional: Ubuntu 22.04 LTS (ou derivado).
  • Acesso a um usuário com privilégios sudo.
  • Conexão à internet para download de pacotes.
  • Noções básicas de linha de comando Linux.

Conceitos fundamentais

Conceito Definição Quando usar
Container Instância em execução de uma imagem, isolada por namespaces e cgroups. Execução de processos leves e escaláveis.
Imagem Blueprint imutável contendo camadas de filesystem e metadados. Distribuição e versionamento de ambientes.
Docker Engine Daemon dockerd + CLI docker; expõe API REST. Gerenciamento de todo o ciclo de vida dos containers.
Registry Servidor que armazena imagens (Docker Hub, registries privados). Compartilhamento de imagens entre equipes/máquinas.

Container vs Máquina Virtual

Aspecto Container Máquina Virtual
Peso Alguns MB, compartilha kernel host. GBs, kernel próprio.
Startup Milissegundos. Segundos a minutos.
Isolamento Namespaces, cgroups. Hypervisor (hardware).
Uso de recursos Alto, próximo ao host. Overhead do hypervisor.
Portabilidade Depende do kernel do host. Independente do host.

Preparação do ambiente

1. Remover versões antigas do Docker

sudo apt-get remove -y docker docker-engine docker.io containerd runc

Resultado esperado: Nenhum pacote docker* instalado; mensagens de remoção concluída.

2. Configurar repositório oficial

sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Resultado esperado: Arquivo /etc/apt/sources.list.d/docker.list criado apontando para o repositório oficial.

3. Instalar o Docker Engine

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Resultado esperado: docker --version retorna algo como Docker version 24.0.7, build abcdefg.

4. Verificar a instalação

sudo docker version
sudo docker info

Resultado esperado: Saída com detalhes da versão, driver de storage, e informações de cgroup.

Tutorial passo a passo

Etapa 1 – Executar um container simples

Objetivo: Verificar que o Docker está funcionando.

sudo docker run --rm hello-world

Resultado esperado: Mensagem “Hello from Docker!” indicando que o daemon está operando.

Etapa 2 – Executar Nginx com mapeamento de porta

Objetivo: Expor serviço web na porta 8080.

sudo docker run -d --name nginx-demo -p 8080:80 nginx:latest

Resultado esperado: Container em execução (docker ps mostra status Up). Acessar http://localhost:8080 devolve página padrão do Nginx.

Etapa 3 – Inspecionar logs

sudo docker logs nginx-demo

Resultado esperado: Output dos logs de acesso e erro do Nginx.

Etapa 4 – Execução interativa

sudo docker exec -it nginx-demo bash

Resultado esperado: Prompt dentro do container (root@<id>:/#).

Etapa 5 – Parar, reiniciar e remover

sudo docker stop nginx-demo   # para o container
sudo docker start nginx-demo  # reinicia
sudo docker rm -f nginx-demo  # remove definitivamente

Resultado esperado: Container desaparece de docker ps -a.

Dockerfile – Construindo sua própria imagem

# syntax=docker/dockerfile:1.4
FROM ubuntu:22.04 AS builder
RUN apt-get update && apt-get install -y ca-certificates
WORKDIR /app
COPY . /app
RUN make build

FROM ubuntu:22.04
COPY --from=builder /app/bin/app /usr/local/bin/app
EXPOSE 8080
CMD ["app"]
  • FROM: Base da imagem.
  • RUN: Executa comandos durante o build.
  • WORKDIR: Define diretório de trabalho.
  • COPY: Copia arquivos do contexto.
  • EXPOSE: Declara porta usada (não publica).
  • CMD: Comando padrão ao iniciar o container.

.dockerignore

.git
node_modules
Dockerfile
.dockerignore

Evita copiar arquivos desnecessários para a camada de build.

Volumes

Tipo Definição Quando usar
Named volume Gerenciado pelo Docker (docker volume create). Dados persistentes independentes do caminho do host.
Bind mount Monta diretório real do host (-v /host/path:/container/path). Desenvolvimento (código fonte editável).

Exemplo de volume nomeado

sudo docker run -d --name db -v pgdata:/var/lib/postgresql/data postgres:15

Resultado esperado: Volume pgdata criado e usado pelo Postgres.

Redes Docker

  • bridge (padrão): Isolamento simples.
  • host: Compartilha stack de rede do host (não recomendado para produção).
  • overlay: Para Swarm/Cluster.
  • Custom bridge: Permite controle de sub‑redes e DNS interno.

Criar rede personalizada

sudo docker network create appnet

Resultado esperado: Rede appnet listada em docker network ls.

Laboratório: Nginx com bind‑mount e logs persistentes

  1. Crie diretório ~/nginx-site com um index.html customizado.
  2. Execute o container:
mkdir -p ~/nginx-site && echo "<h1>BITTUX Lab</h1>" > ~/nginx-site/index.html
sudo docker run -d \
  --name nginx-lab \
  -p 8081:80 \
  -v $HOME/nginx-site:/usr/share/nginx/html:ro \
  -v nginx-logs:/var/log/nginx \
  nginx:latest

Resultado esperado: Página http://localhost:8081 mostra “BITTUX Lab”. Logs são armazenados no volume nginx-logs e podem ser visualizados com docker logs.

Troubleshooting: problemas comuns e como resolver

1. Sintoma – Cannot connect to the Docker daemon at unix:///var/run/docker.sock.

  • Possível causa: Usuário não está no grupo docker.
  • Diagnóstico: groups $USER não lista docker.
  • Solução: sudo usermod -aG docker $USER && newgrp docker.
  • Prevenção: Adicione usuários ao grupo durante a instalação.

2. Sintoma – Porta 80 já está em uso.

  • Possível causa: Outro serviço (Apache, Nginx) ocupando a porta.
  • Diagnóstico: sudo lsof -i :80.
  • Solução: Parar o serviço conflitante ou alterar a porta (-p 8080:80).
  • Prevenção: Verificar portas antes de iniciar containers.

3. Sintoma – Container sai imediatamente (Exited (0)).

  • Possível causa: Falta de processo em CMD/ENTRYPOINT.
  • Diagnóstico: docker inspect <id> verifica Cmd.
  • Solução: Garantir que o CMD execute um processo de longa duração (ex.: nginx -g 'daemon off;').
  • Prevenção: Testar a imagem localmente antes de publicar.

Segurança

  • Pinagem de versões: Sempre especifique tags imutáveis (nginx:1.25.3) ao invés de latest.
  • Política de reinício: --restart unless-stopped para evitar loops de crash.
  • Privilégios mínimos: Use --user para não rodar como root dentro do container.
  • Escaneamento de vulnerabilidades: docker scan <imagem> ou ferramentas como Trivy.
  • Limitar recursos: --cpus, --memory para evitar DoS interno.

Boas práticas

Prática Racional
Imagens pequenas (Alpine, distroless) Reduz superfície de ataque e acelera pulls.
Multi‑stage builds Gera artefatos de runtime enxutos, removendo camadas de build.
Não usar latest Garante reprodutibilidade.
Healthchecks Detecta containers falhos e permite auto‑recuperação.
Separar dados e aplicação Volumes garantem persistência independente da imagem.
Logs centralizados Envie logs para ELK/Promtail ao invés de depender de docker logs.

Comparação de ferramentas (Container vs VM)

Critério Docker VirtualBox / KVM
Peso da camada < 200 MB > 1 GB
Tempo de boot < 1 s > 10 s
Isolamento Namespaces + cgroups Hipervisor completo
Uso de CPU Próximo ao nativo Overhead de virtualização
Persistência Volumes, bind mounts Discos virtuais (.vdi, .qcow2)

Conclusão

Docker trouxe um novo paradigma de empacotamento e deploy que, no Linux, se aproveita ao máximo das capacidades do kernel. Compreender os conceitos fundamentais, dominar a CLI e seguir boas práticas de segurança e otimização permite criar infraestruturas leves, portáveis e fáceis de escalar.

Perguntas frequentes

Q1: Posso usar Docker no Debian sem mudar o repositório?
A: É possível, porém os pacotes nos repositórios da distribuição costumam estar desatualizados e podem conter bugs críticos. Recomendamos o repositório oficial do Docker.

Q2: O que acontece se eu usar docker compose ao invés de docker-compose?
A: A partir da versão 2.x o comando docker compose é a implementação oficial integrada ao Docker Engine, substituindo o binário separado docker-compose.

Próximo passo

Agora que você domina Docker No Linux, o próximo passo lógico da nossa trilha de aprendizado é continuar desenvolvendo suas habilidades.

→ Continue: Docker Compose na Prática

Artigos relacionados

Estes artigos complementam o conteúdo apresentado:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima