Cheat Sheet do Docker Compose - Comandos mais úteis com exemplos
Por falar nisso, docker-compose é diferente de docker compose...
Aqui está uma Guia de referência do Docker Compose com exemplos anotados para ajudar você a dominar arquivos e comandos do Compose rapidamente.
Este guia faz parte de Ferramentas de Desenvolvimento: O Guia Completo para Fluxos de Trabalho Modernos.
Pré-requisitos
O Docker Engine deve estar instalado antes de usar o Compose. No Ubuntu, siga Instalar Docker no Ubuntu para escolher o método de instalação adequado e configurar o plugin docker compose.

Referência do Arquivo Compose: docker-compose.yml
Estrutura principal:
version: '3' # Versão do formato do arquivo Compose
services:
web:
image: nginx:latest
ports:
- "8080:80" # Porta do host 8080: Porta do container 80
db:
image: postgres
environment: # Variáveis de ambiente
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
networks: # Rede personalizada
appnet:
driver: bridge
volumes: # Volume nomeado
db_data:
- services: Cada container em seu aplicativo multi-container. No exemplo acima, temos dois serviços:
webedb. Para operações de container individual, consulte o Guia de Referência do Docker. - networks & volumes: Defina redes isoladas e armazenamento persistente - temos a rede
appnete o volumedb_dataaqui.
Exemplos
Serviço único com mapeamento de porta
services:
app:
build: .
ports:
- "8000:80" # Porta do host 8000: Porta do container 80
Expõe o aplicativo na porta 8000 do host e constrói a partir do Dockerfile no diretório atual.
Multi-serviço com volume compartilhado e rede personalizada
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- type: bind
source: ./app
target: /app
networks:
- mynet
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
networks:
- mynet
networks:
mynet:
volumes:
db_data:
Web e DB na mesma rede; DB usa volume nomeado persistente - db_data.
Usando contexto de build e caminho do Dockerfile
Você pode construir imagem docker sob demanda a partir do Dockerfile especificado no docker-compose.yml.
services:
app:
build:
context: .
dockerfile: docker/MyDockerfile
Compartilhando dados entre serviços
services:
web:
image: nginx
volumes:
- shared_data:/usr/share/nginx/html
worker:
image: myworker
volumes:
- shared_data:/usr/src/app/data
volumes:
shared_data:
Ambos os serviços acessam o mesmo volume (para arquivos estáticos ou trocas de dados) - shared_data.
Opções Avançadas do Arquivo Compose
- environment: Defina variáveis ENV para containers.
- depends_on: Controle a ordem de inicialização dos serviços.
- deploy.replicas: Escalone o serviço no modo Swarm.
Exemplo:
services:
web:
image: nginx
deploy:
replicas: 3
depends_on:
- db
Inicia 3 instâncias web; controla apenas a ordem de inicialização (não a prontidão).
Comandos Essenciais do Docker Compose
| Comando | Descrição | Uso Exemplo |
|---|---|---|
docker-compose up |
Cria e inicia containers | docker-compose up |
docker-compose up -d |
Executa em segundo plano | docker-compose up -d |
docker-compose exec |
Executa comando em container em execução | docker-compose exec web bash |
docker-compose build |
Constrói/reconstrói imagens | docker-compose build |
docker-compose down |
Para e remove containers, redes, volumes e imagens | docker-compose down |
docker-compose logs -f |
Visualiza e segue logs | docker-compose logs -f |
docker-compose ps |
Lista containers em execução | docker-compose ps |
docker-compose run |
Executa comandos únicos (ignora comando no arquivo Compose) | docker-compose run web python manage.py migrate |
docker-compose stop |
Para containers em execução (pode reiniciar com start) |
docker-compose stop |
docker-compose restart |
Reinicia serviços | docker-compose restart web |
docker-compose pull |
Baixa imagens de serviço | docker-compose pull |
docker-compose rm |
Remove containers de serviço parados | docker-compose rm web |
docker-compose config |
Valida e visualiza arquivo Compose | docker-compose config |
docker-compose up --scale web=3 |
Inicia múltiplas instâncias de um serviço | docker-compose up --scale web=3 |
Padrões Comuns do Compose
-
Bancos de dados com dados persistentes
services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: password volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:Os dados do DB persistem no volume
mysql_dataentre reinicializações de container. -
Montagem de bind de código para desenvolvimento
services: app: build: . volumes: - .:/appEdite código em tempo real no host, refletido automaticamente no container.
Flags Úteis
-d: Modo detach (executar em segundo plano).--build: Força reconstrução de imagens antes de iniciar.--force-recreate: Recria containers mesmo se não houver mudanças.--remove-orphans: Remove containers não definidos no arquivo Compose.
Definindo e Personalizando Serviços
Você pode definir e personalizar serviços, redes e volumes no Docker Compose aproveitando o arquivo docker-compose.yml, que centraliza todas as necessidades de configuração e orquestração do seu aplicativo.
- Serviços são definidos sob a chave
services. - Cada serviço representa uma configuração de container, onde você pode definir:
- Image: Selecione uma imagem do Docker Hub ou outro registro.
- Ports: Mapeie portas do container para portas do host.
- Environment variables: Passe valores de configuração.
- Volumes: Persista dados ou compartilhe arquivos/pastas com o host ou outros serviços.
- Networks: Controle quais redes o serviço pode acessar.
Exemplo:
services:
web:
image: nginx:latest
ports:
- "8080:80" # Porta do host 8080: Porta do container 80
environment:
- NGINX_HOST=localhost
volumes:
- web_data:/usr/share/nginx/html
networks:
- frontend
db:
image: postgres:13
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
- Aqui, o serviço
webusa a imagem nginx, define uma variável de ambiente, anexa um volume, abre a porta 80 como 8080 no host e conecta-se à redefrontend. O serviçodbfaz algo similar para o PostgreSQL.
Personalizando Redes
- Redes controlam quais serviços podem se comunicar. O Compose cria uma rede padrão, mas você pode definir mais, especificar drivers personalizados, definir opções e determinar qual serviço entra em qual rede para isolamento fino.
- Defina redes no nível superior sob
networks, e liste quais redes um serviço deve anexar com a chavenetworksno nível do serviço.
Exemplo:
networks:
frontend:
driver: bridge
backend:
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
- Anexe redes aos serviços:
services:
app:
networks:
- frontend
- backend
db:
networks:
- backend
- Esta configuração permite que o serviço
appacesse tanto usuários na redefrontendquanto nabackend, enquantodbé acessível apenas dentro dabackend.
Personalizando Volumes
- Volumes são definidos sob a chave de nível superior
volumes. Monte-os em containers usando a chavevolumessob um serviço. - Volumes podem ser nomeados, usar drivers personalizados e ser compartilhados entre múltiplos serviços para persistência e compartilhamento de dados.
Exemplo:
volumes:
web_data: # Volume nomeado para conteúdo web
db_data: # Volume nomeado para banco de dados
services:
web:
volumes:
- web_data:/usr/share/nginx/html
db:
volumes:
- db_data:/var/lib/postgresql/data
- Neste exemplo,
web_dataé persistente e disponível para qualquer container que o montar.db_datagarante que os dados do banco de dados nunca sejam perdidos na recriação do container. - Você pode definir bind-mounts com opções de driver personalizadas para casos avançados:
volumes:
db_data:
driver: local
driver_opts:
type: none
device: /data/db_data
o: bind
- Esta configuração define um bind-mount do caminho do host
/data/db_datapara o container.
Resumo das Melhores Práticas:
- Use o nome do serviço como nome de host DNS para comunicação entre serviços.
- Anexe serviços a múltiplas redes conforme necessário para controlar o acesso.
- Use volumes nomeados para armazenamento persistente e compartilhamento de dados.
- Defina tudo usando YAML, permitindo controle de versão e scripts de implantação fáceis.
- Para gerenciamento e visualização de containers, considere Instalar Portainer no Linux.
Múltiplos arquivos Compose
Para organizar configurações complexas multi-serviço no Docker Compose, você pode usar múltiplos arquivos Compose e arquivos de sobrescrita (override), permitindo configurações modulares, específicas por ambiente e escaláveis. Veja como isso funciona:
- Estrutura de Arquivo Base e de Sobrescrita
- Crie um arquivo base (
compose.yamloudocker-compose.yml) contendo todas as definições de serviço comuns e padrão. - Adicione arquivos de sobrescrita específicos do ambiente (por exemplo,
docker-compose.override.yml,docker-compose.dev.yml,docker-compose.prod.yml).
Exemplo de estrutura de arquivos:
/diretorio-do-projeto
|-- docker-compose.yml # Configuração base
|-- docker-compose.override.yml # Sobrescritas locais/dev (aplicadas automaticamente)
|-- docker-compose.prod.yml # Sobrescritas de produção
|-- docker-compose.test.yml # Sobrescritas de teste (se necessário)
A configuração base define serviços principais, enquanto cada sobrescrita personaliza configurações para um ambiente ou caso específico.
- Como as Sobrescritas de Arquivo Funcionam
- Mesclagem: Quando você executa
docker compose up, o Docker Compose mescla o base com quaisquer sobrescritas em ordem; arquivos subsequentes sobrescrevem, estendem ou adicionam configurações em arquivos anteriores. - Sobrescrevendo Campos: Se um serviço ou campo for definido em múltiplos arquivos, o valor do arquivo especificado por último é usado. Novos campos são adicionados.
Exemplo de mesclagem:
docker-compose.yml:services: web: image: myapp ports: - "8000:80"docker-compose.override.yml:services: web: environment: - DEBUG=true- Resultado: O serviço
webusa tanto a imagem e a porta base quanto a variável de ambienteDEBUGsobrescrita.
- Uso de Comandos para Múltiplos Arquivos
- Comportamento padrão: Se presente, o Docker Compose carrega automaticamente
docker-compose.override.ymljunto comdocker-compose.ymlquando você executa qualquer comando. - Especificando arquivos manualmente: Use flags
-fpara controlar quais arquivos são mesclados e em qual ordem:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d- Isso ignora a sobrescrita padrão e usa as configurações específicas de produção.
- Estratégias Práticas de Organização
- Separação de ambientes: Use uma sobrescrita por ambiente: dev, test, prod, etc.
- Microsserviços e equipes: Divida a configuração em arquivos separados para diferentes serviços ou equipes, e combine conforme necessário.
- Alternativas de recursos (Feature toggles): Arquivos adicionais podem introduzir ou remover serviços opcionais ou configurações para necessidades temporárias (por exemplo, um
compose.debug.ymlpara logs extras).
- Benefícios
- Clareza: Mantém arquivos individuais pequenos e focados.
- Escalabilidade: Adicione facilmente novos serviços, ambientes ou configurações.
- Manutenibilidade: Altere ou revise apenas seções relevantes para uma determinada implantação.
- Exemplo: Alternando Ambientes
Desenvolvimento:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
Produção:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Cada ambiente recebe apenas a configuração necessária para ele, com toda configuração compartilhada no arquivo base.
Organizar configurações Compose complexas com múltiplos arquivos - e aproveitar o sistema de sobrescrita/mesclagem - garante modularidade, personalização específica de ambiente e escalabilidade fácil para aplicativos Docker grandes e multi-serviço.
Para implantação em produção em um único host Linux — inicialização na partida, encerramento limpo, atualizações e rotação de logs — veja Executar Docker Compose como Serviço Linux com systemd.