noqqe » blog | sammelsurium | photos | projects | about

docker-compose

2021-01-14 @ docker, Software

Mit docker-compose lassen sich mehrere Docker Container in einem File spezifizieren und dadurch eine “Deployment Definition” erstellen.

Commands

docker-compose up -d
docker-compose down
docker-compose restart <servicename>

Struktur

3 Basis Sektionen. Services, Volumes, Networks.

version: '3'

services:
  tls:
    image: caddy:latest
    restart: always
    ports:
      - "80:80"

volumes:
  certs:
    driver: local

networks:
  mynetwork:
    driver: bridge

Builds einbetten

Wenn man sein Dockerfile mit im selben Repo ausliefert kann man statt der Definition eines Image auch einen Docker Buildstep definieren

version: '3'

services:
  srv:
    build:
      context: teamvault/

Anwenden dann so:

docker-compose build --no-cache
# or
docker-compose up -d --build

Volumes

Volumes können auf verschiedene Weisen deklariert werden

Bind Volume

Schönste Variante, da man weiss wo die Nutzdaten liegen und sie auch außerhalb vom Container nutzen kann.

version: '3'

services:
  tls:
    image: caddy:latest
    volumes:
      - 'certs:/root/.caddy/'

volumes:
  certs:
    driver: local
    driver_opts:
      type: none
      device: "$PWD/certs"
      o: bind

Direct Bind

hier ist es nicht nötig ein Bolume mit einem expliziten Ort zu verwenden

services:
  tls:
    image: caddy:latest
    volumes:
      - './tls/Caddyfile:/etc/caddy/Caddyfile'

Native Volume

Die (finde ich) beschissenste Variante. Die Nutzdaten hängen dann irgndwo hinter einem ID Volume unter /var/lib/docker/volumes herum… und man findet nichts nie wieder.

version: '3'

services:
  tls:
    image: caddy:latest
    volumes:
      - 'certs:/root/.caddy/'

volumes:
  certs:

Interaktion zwischen 2 Netzwerken

Docker Network zu anderen docker-compose Installationen auf der selben Instanz. Mittels externe Netzwerke für Beispielsweise einen HTTP Ingress Reverse Proxy

services:
  tls:
    image: caddy
    restart: unless-stopped
    networks:
      - retro
      - status
    ports:
      - "80:80"
      - "443:443"

networks:
  status:
    external:
      name: cachet-docker_cachet
  retro:
    external:
      name: retro-board_retro

Overrides

In deiner docker-compose.override.yaml können Values neu gesetzt werden. Dabei ist aber wichtig das Single Values überschrieben und Arrays gemerged werden. Details zum Verhalten bestimmter Felder: https://docs.docker.com/compose/extends/#adding-and-overriding-configuration