Docker no Linux: Guia Completo para Iniciantes
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.listcriado 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 --versionretorna algo comoDocker 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 psmostra status Up). Acessarhttp://localhost:8080devolve 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
pgdatacriado 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
appnetlistada emdocker network ls.
Laboratório: Nginx com bind‑mount e logs persistentes
- Crie diretório
~/nginx-sitecom umindex.htmlcustomizado. - 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:8081mostra “BITTUX Lab”. Logs são armazenados no volumenginx-logse podem ser visualizados comdocker 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 $USERnão listadocker. - 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>verificaCmd. - Solução: Garantir que o
CMDexecute 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 delatest. - Política de reinício:
--restart unless-stoppedpara evitar loops de crash. - Privilégios mínimos: Use
--userpara não rodar comorootdentro do container. - Escaneamento de vulnerabilidades:
docker scan <imagem>ou ferramentas como Trivy. - Limitar recursos:
--cpus,--memorypara 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:
