3.1 Arquivo compose.yaml
O arquivo compose.yaml (ou um dos seguintes: docker-compose.yaml, docker-compose.yml, compose.yml) é o principal arquivo de configuração usado pelo Docker Compose pra definir e gerenciar aplicações com múltiplos containers. Ele descreve quais containers (serviços) devem ser iniciados, como eles interagem entre si e quais recursos precisam.
Pra manter consistência nesta aula, a gente vai usar o formato compose.yaml, já que ele é o recomendado pras versões modernas do Docker Compose.
Estrutura do arquivo compose.yaml
O arquivo compose.yaml é dividido em várias seções, cada uma descrevendo diferentes aspectos da configuração da aplicação. As seções principais incluem:
- version: indica a versão do arquivo Compose (por exemplo,
'3.9'). - services: descreve os containers (serviços), suas configurações e dependências.
- volumes: define volumes pra armazenar dados entre os containers e o host.
- networks: configura redes pelas quais os serviços se comunicam entre si.
3.2 Diretrizes principais
1. version
A diretiva version define a versão da sintaxe do Docker Compose usada no arquivo compose.yaml. No momento em que este texto foi escrito, a versão mais atual é a versão 3, principalmente suas atualizações, como 3.8 e 3.9.
version: '3.9'
2. services
A seção services define os containers que o Compose deve criar e executar. Cada serviço representa um container separado com uma configuração específica.
Exemplo:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
Neste exemplo, dois serviços são definidos: web e db. O serviço web usa a imagem nginx:latest e abre a porta 80. O serviço db usa a imagem mongo:latest e conecta um volume para armazenar dados.
3. volumes
A seção volumes é usada para definir volumes que podem ser conectados a containers para armazenamento de dados. Isso é útil para manter os dados ao reiniciar os containers.
Exemplo:
volumes:
mongo-data:
4. networks
A seção networks permite definir redes personalizadas nas quais os containers irão operar. Isso garante isolamento e configuração das conexões de rede. Se as redes não forem especificadas, o Docker Compose criará uma rede padrão, e todos os serviços estarão conectados a ela.
Exemplo:
networks:
front-end:
back-end:
3.3 Diretivas para configurar serviços
Principais diretivas pra configurar serviços:
1. image
A diretiva image especifica a imagem que vai ser usada pra criar o container.
Exemplo:
services:
web:
image: nginx:latest
2. build
A diretiva build é usada pra especificar o caminho pro Dockerfile que vai ser usado pra construir a imagem.
Exemplo:
services:
app:
build: ./app
3. ports
A diretiva ports define as portas que devem ser abertas e redirecionadas da máquina host pro container.
Exemplo:
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
A diretiva volumes monta volumes nos containers, permitindo que os dados sejam mantidos entre reinicializações dos containers.
Exemplo:
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
A diretiva environment define variáveis de ambiente pro container.
Exemplo:
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
A diretiva depends_on indica que este serviço depende de outros serviços e deve ser iniciado depois deles.
Importante! Quando você inicia seu serviço, não há 100% de garantia de que todos os serviços necessários já estarão completamente prontos. Eles serão iniciados — sim, mas o funcionamento completo não é garantido. Esse problema é resolvido com health-check, mas falaremos disso mais tarde.
Exemplo:
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
A diretiva command permite sobrescrever o comando que será executado ao iniciar o container.
Exemplo:
services:
app:
image: myapp:latest
command: python app.py
8. networks
A diretiva networks conecta o serviço a uma ou mais redes.
Exemplo:
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 Exemplo completo
Exemplo de arquivo completo compose.yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
Neste exemplo:
- São definidos três serviços:
web,appedb. -
webusa a imagem do Nginx, monta um arquivo de configuração e depende do serviçoapp. -
appé construído a partir de um Dockerfile local, monta o código-fonte da aplicação e usa variáveis de ambiente. -
dbutiliza a imagem do MongoDB e monta um volume para o armazenamento de dados. - São criados dois volumes e duas redes para isolamento e gerenciamento da interação dos serviços.
Nota: um volume é o mongo-data, e o outro é um diretório montado da máquina host (por exemplo, ./app).
GO TO FULL VERSION