Compose

Exemplo genérico

---
services:

  app_service:
    container_name: app_name
    image: bolha/app:v0.0.1
    restart: always
    environment:
      TZ: "America/Sao_Paulo"
    depends_on:
      - app_database
    volumes:
      - /opt/bolha/config:/config
    ports:
      - 8080:8080"
    networks:
      - app_network
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 1024M
        reservations:
          cpus: '2'
          memory: 256M

  app_database:
    container_name: app_database
    image: bolha/database:v0.0.1
    restart: always
    environment:
      TZ: "America/Sao_Paulo"
    volumes:
      - /opt/bolha/database:/var/lib/database
    networks:
      - app_network
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 1024M
        reservations:
          cpus: '2'
          memory: 256M

networks:
  app_network:

Definindo um host e servidores de DNS para o container

  extra_hosts:
    - "web.bolha.local=192.168.200.200"
  dns:
    - 192.168.222.12
    - 192.168.222.13
    - 192.168.222.14

Definindo limites para recursos

    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 1024M
        reservations:
          cpus: '2'
          memory: 256M

Configurando driver JSON para logs

logging:
  driver: "json-file"
  options:
    max-size: "100m"
    max-file: "2"

Configurando log syslog

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

Healthcheck em serviços usando wget

healthcheck:
  test: wget --no-verbose --tries=1 --spider http://localhost || exit 1
  interval: 60s
  retries: 5
  start_period: 20s
  timeout: 10s

Healthcheck em serviços usando curl

healthcheck:
  test: curl --fail http://localhost || exit 1
  interval: 60s
  retries: 5
  start_period: 20s
  timeout: 10s

Reutilizando bloco YAML em serviços

x-minio-common: &minio-common
  image: quay.io/minio/minio:RELEASE.2024-05-28T17-19-04Z-cpuv1
  restart: always
  expose:
    - "9000"
    - "9001"
  environment:
    TZ: "America/Sao_Paulo"
  healthcheck:
    test: ["CMD", "mc", "ready", "local"]
    interval: 5s
    timeout: 5s
    retries: 5

services:
  minio1:
    <<: *minio-common
    hostname: minio1
    volumes:
      - /opt/minio/storage/data1-1:/data1
      - /opt/minio/storage/data1-2:/data2

  minio2:
    <<: *minio-common
    hostname: minio2
    volumes:
      - /opt/minio/storage/data2-1:/data1
      - /opt/minio/storage/data2-2:/data2

  minio3:
    <<: *minio-common
    hostname: minio3
    volumes:
      - /opt/minio/storage/data3-1:/data1
      - /opt/minio/storage/data3-2:/data2

  minio4:
    <<: *minio-common
    hostname: minio4
    volumes:
      - /opt/minio/storage/data4-1:/data1
      - /opt/minio/storage/data4-2:/data2

Definindo IP dentro do service

services:
  frontend:
    image: example/webapp
    networks:
      front-tier:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10

networks:
  front-tier:
    ipam:
      driver: default
      config:
        - subnet: "172.16.238.0/24"
        - subnet: "2001:3984:3989::/64"

Configurando rede com detalhes usando IPAM

networks:
  mynet1:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16
          ip_range: 172.28.5.0/24
          gateway: 172.28.5.254
          aux_addresses:
            host1: 172.28.1.5
            host2: 172.28.1.6
            host3: 172.28.1.7
      options:
        foo: bar
        baz: "0"

Configurando volume tipo NFS

volumes:
  example:
    driver_opts:
      type: "nfs"
      o: "addr=10.40.0.199,nolock,soft,rw"
      device: ":/docker/example"

Configurando volume tipo BIND

services:
  postgresql:
    container_name: postgresql
    image: "postgres:${POSTGRESQL_VERSION}"
    env_file:
      - database.env
      - versions.env
    restart: always
    shm_size: 256mb
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'mastodon']
    volumes:
      - postgresql:/var/lib/postgresql/data
    networks:
      - internal_network
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 6144M
        reservations:
          cpus: '2'
          memory: 2048M

volumes:
  postgresql:
    driver_opts:
      type: none
      device: /opt/mastodon/data/database/postgresql
      o: bind

Reutilizando environments

services:
  first:
    image: my-image:latest
    environment: &env
      - CONFIG_KEY
      - EXAMPLE_KEY
      - DEMO_VAR
  second:
    image: another-image:latest
    environment: *env

Fazendo include de outros arquivos YAML

include:
  - commons.yaml
  - service2.yaml

services:
  webapp:
    depends_on:
      - included-service