Guia Rápido do Docker Compose – Os comandos mais úteis com exemplos
A propósito, o docker-compose é diferente do docker compose...
Aqui está um Docker Compose cheatsheet com exemplos anotados para ajudar você a dominar rapidamente arquivos e comandos do Compose.
Este guia faz parte de Developer Tools: The Complete Guide to Modern Development Workflows.
Pré-requisitos
O Docker Engine deve estar instalado antes de usar o Compose. No Ubuntu, siga Install Docker on 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 básica:
version: '3' # Versão do formato do arquivo Compose
services:
web:
image: nginx:latest
ports:
- "8080:80" # Porta do host 8080:Porta do contêiner 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 com nome
db_data:
- services: Cada contêiner no seu aplicativo multi-contêiner. No exemplo acima, temos dois serviços:
webedb. Para operações individuais de contêineres, veja o Docker Cheatsheet. - networks & volumes: Define redes isoladas e armazenamento persistente - aqui temos a rede
appnete o volumedb_data.
Exemplos
Serviço único com mapeamento de porta
services:
app:
build: .
ports:
- "8000:80" # Porta do host 8000:Porta do contêiner 80
Exibe 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 build docker image 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: Define variáveis ENV para contêineres.
- depends_on: Controla a ordem de inicialização dos serviços.
- deploy.replicas: Escala o serviço em 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 o estado de prontidão).
Comandos Essenciais do Docker Compose
| Comando | Descrição | Exemplo de Uso |
|---|---|---|
docker-compose up |
Cria e inicia contêineres | docker-compose up |
docker-compose up -d |
Executa em segundo plano | docker-compose up -d |
docker-compose exec |
Executa comando em contêiner 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 contêineres, redes, volumes e imagens | docker-compose down |
docker-compose logs -f |
Visualiza e segue logs | docker-compose logs -f |
docker-compose ps |
Lista contêineres em execução | docker-compose ps |
docker-compose run |
Executa comandos pontuais (ignora o comando no arquivo Compose) | docker-compose run web python manage.py migrate |
docker-compose stop |
Para contêineres 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 dos serviços | docker-compose pull |
docker-compose rm |
Remove contêineres de serviços parados | docker-compose rm web |
docker-compose config |
Valida e visualiza o 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 de 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 banco persistem no volume
mysql_dataentre reinicializações do contêiner. -
Montagem de bind do código para desenvolvimento
services: app: build: . volumes: - .:/appEdite o código ao vivo no host, refletido automaticamente no contêiner.
Flags Úteis
-d: Modo detach (executar em segundo plano).--build: Força a reconstrução das imagens antes de iniciar.--force-recreate: Recria contêineres mesmo se não houver mudanças.--remove-orphans: Remove contêineres 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 suas necessidades de configuração e orquestração da aplicação.
- Os Serviços são definidos sob a chave
services. - Cada serviço representa uma configuração de contêiner, onde você pode definir:
- Image: Selecione uma imagem do Docker Hub ou outro registro.
- Ports: Mapeie portas do contêiner 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 a quais redes o serviço pode acessar.
Exemplo:
services:
web:
image: nginx:latest
ports:
- "8080:80" # Porta do host 8080:Porta do contêiner 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 à redefrontend. O serviçodbfaz algo semelhante para PostgreSQL.
Personalizando Redes
- As Networks 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 se junta a qual rede para isolamento fino.
- Defina redes no nível superior sob
networkse liste quais redes um serviço deve anexar usando 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 nas redesfrontendebackend, enquantodbé acessível apenas dentro dabackend.
Personalizando Volumes
- Os Volumes são definidos sob a chave de nível superior
volumes. Monte-os em contêineres usando a chavevolumessob um serviço. - Volumes podem ter nomes, 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é persistido e disponível para qualquer contêiner que o monte.db_datagarante que os dados do banco de dados nunca sejam perdidos na recriação do contêiner. - 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 dentro do contêiner.
Resumo das Boas 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 contêineres, considere Install Portainer on Linux.
Vários arquivos compose
Para organizar configurações complexas multi-serviço no Docker Compose, você pode usar vários arquivos compose e arquivos de substituição, permitindo configurações modulares, específicas de ambiente e escaláveis. Veja como isso funciona:
- Estrutura de Arquivo Base e de Substituição
- Crie um arquivo base (
compose.yamloudocker-compose.yml) contendo todas as definições padrão comuns dos serviços. - Adicione arquivos de substituição específicos de 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 # Substituições locais/dev (aplicadas automaticamente)
|-- docker-compose.prod.yml # Substituições de produção
|-- docker-compose.test.yml # Substituições de teste (se necessário)
A configuração base define os serviços principais, enquanto cada substituição personaliza configurações para um ambiente ou caso específico.
- Como Funcionam as Substituições de Arquivos
- Mesclagem: Quando você executa
docker compose up, o Docker Compose mescla a base com qualquer substituição na ordem; arquivos subsequentes substituem, estendem ou adicionam configurações dos arquivos anteriores. - Substituição de Campos: Se um serviço ou campo for definido em múltiplos arquivos, o valor do arquivo especificado por último será 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 porta da base quanto a variável de ambienteDEBUGsubstituída.
- Uso de Comandos para Vários 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 que ordem:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d- Isso ignora a substituição 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 substituição 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.
- Interruptores de funcionalidade: Arquivos adicionais podem introduzir ou remover serviços ou configurações opcionais para necessidades temporárias (por exemplo, um
compose.debug.ymlpara logs extras).
- Benefícios
- Clareza: Mantém os arquivos individuais pequenos e focados.
- Escalabilidade: Fácil adicionar novos serviços, ambientes ou configurações.
- Manutabilidade: Altere ou revise apenas as 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 todas as configurações compartilhadas no arquivo base.
Organizar configurações complexas do Compose com múltiplos arquivos - e aproveitando o sistema de substituição/mesclagem - garante modularidade, personalização específica de ambiente e fácil escalabilidade para grandes aplicativos Docker multi-serviço.
Para implantação de produção em um único host Linux — inicialização na startup, desligamento limpo, atualizações e rotação de logs — veja Run Docker Compose as a Linux Service with systemd. Para uma comparação com Podman Quadlet, veja Podman Quadlet vs Docker Compose for Linux Services.