CodeGym /Cursos /Docker SELF /Criando docker-compose.yml

Criando docker-compose.yml

Docker SELF
Nível 15 , Lição 2
Disponível

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:

  1. version: indica a versão do arquivo Compose (por exemplo, '3.9').
  2. services: descreve os containers (serviços), suas configurações e dependências.
  3. volumes: define volumes pra armazenar dados entre os containers e o host.
  4. 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.

Yaml

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:

Yaml

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:

Yaml

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:

Yaml

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:

Yaml

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:

Yaml

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:

Yaml

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:

Yaml

services:
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

5. environment

A diretiva environment define variáveis de ambiente pro container.

Exemplo:

Yaml

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:

Yaml

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:

Yaml

services:
  app:
    image: myapp:latest
    command: python app.py

8. networks

A diretiva networks conecta o serviço a uma ou mais redes.

Exemplo:

Yaml

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

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, app e db.
  • web usa a imagem do Nginx, monta um arquivo de configuração e depende do serviço app.
  • app é construído a partir de um Dockerfile local, monta o código-fonte da aplicação e usa variáveis de ambiente.
  • db utiliza 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).

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION