kb.erickguedes.com
Docker: Containers do Dev ao Deploy

Imagens e Containers

Aula 1 de 7

O que é Docker?

Docker empacota aplicações e dependências em containers isolados. Um container é um processo com namespace isolado, não uma VM.

VM: [App|Libs|Guest OS] | [Hypervisor] | [Host OS]
Container: [App|Libs] | [Docker Engine] | [Host OS]

Instalação

# Ubuntu
curl -fsSL https://get.docker.com | bash
sudo usermod -aG docker $USER  # logout/login

# Verificar
docker --version
docker info
docker run hello-world

Primeiros Comandos

# Run
docker run -d --name meu-nginx -p 80:80 nginx:alpine
docker run -it --rm ubuntu:24.04 bash

# Listar
docker ps          # rodando
docker ps -a       # todos
docker images      # imagens locais

# Gerenciar
docker stop meu-nginx
docker start meu-nginx
docker restart meu-nginx
docker rm meu-nginx -f
docker rmi nginx:alpine  # remover imagem

# Executar comando
docker exec -it meu-nginx bash
docker exec meu-nginx cat /etc/nginx/conf.d/default.conf

# Logs
docker logs meu-nginx
docker logs -f meu-nginx  # seguir
docker logs --tail 50 meu-nginx

Bind Mounts e Volumes

# Bind mount (path local)
docker run -d --name dev -v $(pwd)/app:/app node:20 node app.js

# Volume (gerenciado pelo Docker)
docker volume create app-data
docker run -d --name app -v app-data:/data nginx:alpine

# tmpfs (em memória, não persiste)
docker run --tmpfs /tmp alpine:latest

# Diferença
# Volume: gerenciado pelo Docker, isolado, backup fácil
# Bind: acesso direto ao filesystem do host

Port Mapping

# Mapear porta
docker run -p 8080:80 nginx:alpine
docker run -p 127.0.0.1:3000:3000 node:20
docker run -p 80:80 -p 443:443 nginx:alpine

# Network host (usar rede do host)
docker run --network host nginx:alpine

Lab: Servidor Web com Conteúdo Customizado

# Criar página
mkdir site
echo "<h1>Docker em ação</h1>" > site/index.html

# Rodar nginx com bind mount
docker run -d --name site \
  -p 8080:80 \
  -v $(pwd)/site:/usr/share/nginx/html:ro \
  nginx:alpine

# Testar
curl localhost:8080

# Parar e limpar
docker stop site && docker rm site

Container != VM. Containers compartilham o kernel do host. Use imagens oficiais e Alpine quando possível (menor tamanho). Sempre fixe versão das imagens.