Minimanual do Docker Compose – Comandos mais úteis com exemplos
A propósito, o docker-compose é diferente do docker compose...
Aqui está um minimamente de Docker Compose com exemplos anotados para ajudá-lo a dominar rapidamente arquivos e comandos Compose.
Este guia faz parte do Ferramentas de Desenvolvedor: O Guia Completo para Fluxos de Trabalho de Desenvolvimento Moderno.

Referência do Arquivo Compose: docker-compose.yml
Estrutura central:
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: exemplo
volumes:
- db_data:/var/lib/postgresql/data
networks: # Rede personalizada
appnet:
driver: bridge
volumes: # Volume nomeado
db_data:
- services: Cada container em seu aplicativo de múltiplos containers. No exemplo acima, temos dois serviços:
webedb. Para operações de container individuais, consulte o Minimamente Docker. - networks & volumes: Definem 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.
Múltiplos serviços 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 em 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 de Arquivo Compose
- environment: Define variáveis ENV para containers.
- depends_on: Controla a ordem de inicialização dos serviços.
- deploy.replicas: Escala 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 |
Executar 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 pontuais (contorna o 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 |
Puxa imagens de serviço | docker-compose pull |
docker-compose rm |
Remove containers de serviços 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 de Compose
-
Bancos de dados com dados persistentes
services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: senha volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:Os dados do DB persistem no volume
mysql_dataatravés de reinicializações de container. -
Montagem de vínculo de código para desenvolvimento
services: app: build: . volumes: - .:/appEdite código em vivo no host, refletido automaticamente no container.
Flags Úteis
-d: Modo desanexado (executar em segundo plano).--build: Força reconstrução de imagens antes de iniciar.--force-recreate: Recria containers mesmo se não alterados.--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 suas necessidades de configuração e orquestração de aplicativos.
- Serviços são definidos sob a chave
services. - Cada serviço representa uma configuração de container, onde você pode definir:
- Image: Seleciona uma imagem do Docker Hub ou outro registro.
- Ports: Mapeia portas de container para portas do host.
- Variáveis de ambiente: Passa valores de configuração.
- Volumes: Persiste dados ou compartilha arquivos/pastas com o host ou outros serviços.
- Redes: Controla 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 semelhante para 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 se une a qual rede para isolamento granular.
- Defina redes no nível superior sob
networkse 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 ambos os usuários nas redesfrontendebackend, enquantodbé acessível apenas dentro dobackend.
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é persistido e disponível para qualquer container que o monte.db_datagarante que os dados do banco de dados nunca sejam perdidos na recriação do container. - Você pode definir montagens de vínculo 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 configura uma montagem de vínculo 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 de múltiplos serviços no Docker Compose, você pode usar múltiplos 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 de serviço comuns e padrão. - 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 serviços principais, enquanto cada substituição personaliza configurações para um ambiente ou caso específico.
- Como Funcionam as Substituições de Arquivo
- Mesclagem: Quando você executa
docker compose up, o Docker Compose mescla a base com quaisquer substituições em ordem; arquivos subsequentes substituem, estendem ou adicionam configurações em 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 base e a porta quanto a variável de ambienteDEBUGsubstituída.
- Uso de Comando 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 substituição padrão e usa as configurações específicas de produção.
- Estratégias Práticas de Organização
- Separação de ambiente: 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.
- Alternadores de recursos: Arquivos adicionais podem introduzir ou remover serviços ou configurações opcionais para necessidades temporárias (por exemplo, um
compose.debug.ymlpara log extra).
- 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 implantação dada.
- 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 a configuração compartilhada no arquivo base.
Organizar configurações complexas de Compose com múltiplos arquivos - e aproveitar o sistema de substituição/mesclagem - garante modularidade, personalização específica de ambiente e escalabilidade fácil para grandes aplicativos Docker de múltiplos serviços.