Docker é uma daquelas ferramentas que parecem exagero até você fazer deploy em produção pela primeira vez sem ele — e aí você nunca mais volta atrás. No fundo, Docker simplesmente empacota sua aplicação e seu ambiente em uma unidade portátil chamada container. Mesmo código, mesmas dependências, mesmo comportamento, seja rodando no seu notebook, no seu pipeline de CI ou num servidor em Frankfurt.
O modelo mental é simples: imagens são os blueprints, containers são instâncias em execução desses blueprints. Você constrói uma imagem uma vez e depois cria quantos containers precisar a partir dela. Volumes persistem dados além do ciclo de vida de um container, e networks permitem que containers se comuniquem entre si. Docker Compose une tudo quando você precisa de múltiplos serviços trabalhando em conjunto.
Organizamos tudo pelos recursos com os quais você trabalha — imagens, containers, volumes, networks — e Docker Compose tem sua própria seção porque praticamente já é uma ferramenta à parte. Comece por Imagens e Containers se você está começando. Quando esses conceitos ficarem naturais, volumes e networks vão fazer sentido rapidamente. E se você está rodando qualquer coisa com mais de um serviço, Compose é onde você vai morar.
Uma regra de ouro: não coloque dados que você valoriza dentro de um container sem um volume. Containers são efêmeros por design. Quando eles se vão, tudo dentro deles se vai também. Volumes são sua tábua de salvação.
Imagens
docker build -t <name> .
Construir uma imagem a partir do Dockerfile no diretório atualdocker build -t <name>:<tag> .
Construir e taguear uma imagem com uma versão específicadocker build --no-cache -t <name> .
Construir do zero, ignorando camadas em cachedocker pull <image>
Baixar uma imagem de um registry (Docker Hub por padrão)docker push <image>
Enviar uma imagem para um registrydocker images
Listar todas as imagens armazenadas localmentedocker images -q
Listar apenas os IDs das imagens (útil para scripts)docker tag <image> <new:tag>
Criar uma nova tag apontando para uma imagem existentedocker rmi <image>
Remover uma imagemdocker rmi $(docker images -q -f dangling=true)
Remover todas as imagens pendentes (sem tag)docker image prune
Remover imagens não utilizadas (pendentes)docker image prune -a
Remover todas as imagens não usadas por nenhum containerdocker history <image>
Mostrar o histórico de camadas de uma imagemdocker inspect <image>
Mostrar metadados detalhados sobre uma imagem em JSON
Containers
docker run <image>
Criar e iniciar um container a partir de uma imagemdocker run -d <image>
Rodar um container em segundo plano (modo detached)docker run -it <image> sh
Rodar interativamente com um shell (ótimo para debug)docker run -p 8080:80 <image>
Mapear a porta 8080 do host para a porta 80 do containerdocker run --name <name> <image>
Rodar um container com um nome amigáveldocker run --rm <image>
Remover automaticamente o container quando ele parardocker run -e KEY=value <image>
Passar uma variável de ambiente para o containerdocker run --env-file .env <image>
Carregar variáveis de ambiente a partir de um arquivodocker ps
Listar containers em execuçãodocker ps -a
Listar todos os containers, incluindo os paradosdocker start <container>
Iniciar um container paradodocker stop <container>
Parar um container em execução de forma graciosa (SIGTERM, depois SIGKILL)docker kill <container>
Matar imediatamente um container em execução (SIGKILL)docker restart <container>
Parar e iniciar um containerdocker exec -it <container> sh
Abrir um shell dentro de um container em execuçãodocker exec <container> <cmd>
Executar um comando único dentro de um container em execuçãodocker logs <container>
Mostrar stdout/stderr de um containerdocker logs -f <container>
Acompanhar logs em tempo real (como tail -f)docker logs --tail 100 <container>
Mostrar as últimas 100 linhas de logsdocker rm <container>
Remover um container paradodocker rm -f <container>
Forçar remoção de um container, mesmo em execuçãodocker rm $(docker ps -aq)
Remover todos os containers paradosdocker cp <container>:/path /local
Copiar arquivos de um container para o seu hostdocker inspect <container>
Mostrar metadados detalhados do container em JSONdocker stats
Stream ao vivo de uso de CPU, memória e rede para todos os containers
Volumes
docker volume create <name>
Criar um volume nomeadodocker run -v <vol>:/data <image>
Montar um volume nomeado em /data dentro do containerdocker run -v $(pwd):/app <image>
Montar o diretório atual (bind-mount) dentro do containerdocker run -v $(pwd):/app:ro <image>
Montar como somente leitura (container não pode escrever)docker volume ls
Listar todos os volumesdocker volume inspect <name>
Mostrar detalhes sobre um volume (ponto de montagem, driver, etc.)docker volume rm <name>
Remover um volumedocker volume prune
Remover todos os volumes não usados por nenhum container
Networks
docker network create <name>
Criar uma network bridge definida pelo usuáriodocker network create --driver overlay <name>
Criar uma network overlay (para Swarm / multi-host)docker run --network <name> <image>
Rodar um container conectado a uma network específicadocker network connect <net> <container>
Conectar um container em execução a uma networkdocker network disconnect <net> <container>
Desconectar um container de uma networkdocker network ls
Listar todas as networksdocker network inspect <name>
Mostrar detalhes da network incluindo containers conectadosdocker network rm <name>
Remover uma networkdocker network prune
Remover todas as networks não utilizadas
Docker Compose
docker compose up
Criar e iniciar todos os serviços definidos no compose.yamldocker compose up -d
Iniciar serviços em segundo planodocker compose up --build
Reconstruir imagens antes de iniciar os serviçosdocker compose up <service>
Iniciar apenas um serviço específico (e suas dependências)docker compose down
Parar e remover containers e networks criados pelo updocker compose down -v
Mesmo que down, mas também remove volumes nomeadosdocker compose down --rmi all
Parar tudo e remover as imagens tambémdocker compose build
Construir ou reconstruir todas as imagens dos serviçosdocker compose build --no-cache
Reconstruir todas as imagens do zerodocker compose logs
Mostrar logs de todos os serviçosdocker compose logs -f <service>
Acompanhar logs de um serviço específicodocker compose ps
Listar containers gerenciados pelo Composedocker compose exec <service> sh
Abrir um shell em um container de serviço em execuçãodocker compose run <service> <cmd>
Executar um comando único em um novo container para aquele serviçodocker compose pull
Baixar as imagens mais recentes para todos os serviçosdocker compose restart <service>
Reiniciar um serviço específicodocker compose config
Validar e exibir a configuração resolvida do Compose
Sistema e Limpeza
docker system df
Mostrar uso de disco por imagens, containers e volumesdocker system prune
Remover containers parados, networks não usadas e imagens pendentesdocker system prune -a --volumes
A opção nuclear — recuperar todo o espaço não utilizadodocker info
Mostrar configuração e estatísticas do Docker em todo o sistemadocker version
Mostrar versões do cliente e servidor Docker
Use docker run --rm para containers descartáveis. Sem isso, containers parados se acumulam silenciosamente. Execute docker ps -a algum dia — você pode se surpreender com quantos zumbis estão à espreita.
Adicione um arquivo .dockerignore ao seu projeto. Funciona como o .gitignore, mas para builds. Excluir node_modules, .git e arquivos de configuração local pode reduzir seu contexto de build de gigabytes para kilobytes e acelerar builds drasticamente.
Ordene as instruções do seu Dockerfile das menos para as mais alteradas frequentemente. Docker cacheia camadas de cima para baixo, então colocar COPY package.json e RUN npm install antes de COPY . . significa que você só reinstala dependências quando elas realmente mudam — não a cada edição de código.
Use docker compose up --build durante o desenvolvimento em vez de fazer build e up separados. Ele reconstrói apenas o que mudou e te poupa daquele clássico quebra-cabeça de "por que minha alteração não está aparecendo".
Execute docker system prune regularmente. Docker é surpreendentemente bom em acumular espaço em disco. Adicione -a --volumes se quiser terra arrasada, mas cuidado — isso remove tudo que não está ativamente em uso, incluindo volumes nomeados com dados.
Prefira docker compose exec em vez de docker exec quando estiver usando Compose. Você pode referenciar serviços pelo nome em vez de caçar IDs de containers. docker compose exec db psql -U postgres ganha de copiar um hash de 12 caracteres toda vez.
Use multi-stage builds para manter imagens de produção enxutas. Construa sua aplicação em um estágio com todas as dependências de desenvolvimento, depois copie apenas o output compilado para uma imagem base mínima. Sua imagem Node de 1.2 GB vira 150 MB.