docker-compose.yml

Die Konfigurationsdatei docker-compose.yml (auch compose.yml möglich) ist die Textdatei mit allen benötigten Anweisungen (Direktiven) für das Tool docker compose!

Erstes Beispiel compose.yml

Ein vollständiges Beispiel folgt in einem weiteren Kapitel. Mit dem folgenden Code wollen wir uns dem Thema weiter annähern.

docker-compose.yml (Hier: einfache Wordpress-Installation)
# Datei test/docker-compose.yml
# version: '3.7'

services:
  db:
    image: mariadb:latest
    volumes:
      - /var/dc-test-db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: geheim
    restart: always

  wordpress:
    image: wordpress:latest
    volumes:
      - /var/dc-test-www:/var/www/html
    ports:
      - "8082:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: geheim
    restart: always

Dieses Hello WordPress!-Beispiel zu docker compose zeigt die zusätzliche Intelligenz des docker compose-Tools gegenüber den Basistools Docker.

CLI docker compose

Kommando: docker compose … (Auszug)

  • config (Analyse)

  • up | down (up normalerweise kombiniert mit -d)

  • events

  • kill (falls stop|down nicht funzt)

  • logs

  • pause | unpause

  • ps

Compose Projektordner

Nach Bereitstellung eines Projektordners mit docker-compose.yml reicht der letzte Befehl aus der folgenden Liste:

cd test                    # hier befindet sich das docker-compose.yml
mkdir /var/dc-test-www     # Volume Wordpress HTML; kann man weglassen (!)
mkdir /var/dc-test-db      # Volume MariaDB Databases; kann man weglassen (!)

# der eigentliche Startbefehl für alle Container inkl. Netzwerk + Volumes
docker compose up -d

Test hier einfach wieder mit Browser (URL): localhost:8082

Danach kann man alles beenden und löschen:

# Alle Compose Container beenden und entfernen!
docker compose down                        # hier bleiben die Volumes erhalten!

rm -Rf /var/dc-test-db /var/dc-test-www    # Volumes werden in diesem Beispiel manuell gelöscht

Anm.: bei Nutzung von docker compose down --volumes werden die volumes auch mit entfernt!

Compose Netzwerke und Volumes

Netzwerke für docker-compose.yml

services:
  web:
    ...
    networks:
      - mynet

# auf Top-Level die Netzwerke definieren
networks:
  mynet:
    external:
      name: host

Bei der letzten Konfiguration ist das Docker-eigene Host-Netzwerk gemeint (siehe docker network ls).

Netzwerkports

ports:
  - "8080:80"
  - "8443:443"

Auf die Hierarchie-Ebene für Definitionen achten.

Volumes

# Docker docker-compose.yml in Ordner testing
version: '3.7'
services:
  nginx:
    volumes:
      - webdata:/var/www/html
    ...
volumes:
  webdata:

Docker erstellt selbst ein Volume: /var/lib/docker/volumes/testing_webdata/_data

Mit einem weiteren docker-compose Beispiel (Joomla-Installation) können wir die Nutzung von Docker Volumes sehen:

Beispiel mit CMS Joomla und Volume webdata:

docker-compose.yml (Joomla-Installation) mit Volume
# Datei: joomla/docker-compose.yml
# version: '3.1'
services:
  joomla:
    image: joomla:apache-php7
    ports:
      - 8080:80
    volumes:
      - webdata:/var/www/html
    environment:
      JOOMLA_DB_HOST: mariadb
      JOOMLA_DB_NAME: dockerbuch
      JOOMLA_DB_USER: dockerbuch
      JOOMLA_DB_PASSWORD: johroo2zaeQu
  mariadb:
    image: mariadb:10
    environment:
      MYSQL_ROOT_PASSWORD: eengi7suXeut
      MYSQL_DATABASE: dockerbuch
      MYSQL_USER: dockerbuch
      MYSQL_PASSWORD: johroo2zaeQu
volumes:
  webdata:

Testen der Persistierten Speicherung von Webdaten und Diskussion die Volumes in eigene Datenstrukturen zu binden.

Compose restart

Für viele Dienste wollen und können wir die automatisierten Starts bzw. Neustarts der Container definieren. Hierfür hat Compose die Direktive restart.

Eine kurze Erläuterung aus GitHub Compose Specs - restart:

restart definiert die Richtlinie, die die Plattform bei der Beendigung eines Containers anwendet.

  • no: Die Standard-Neustart-Richtlinie. Sie startet den Container unter keinen Umständen neu.

  • always: Die Richtlinie startet den Container immer wieder neu, bis er entfernt wird.

  • on-failure: Die Richtlinie startet den Container neu, wenn der Exitcode einen Fehler anzeigt.

  • unless-stopped: Die Richtlinie startet den Container unabhängig vom Exitcode neu, stoppt das Neustarten jedoch, wenn der Dienst gestoppt oder entfernt wird.

Insofern kann man sich fragen, ob in vielen Beispielcodes nicht vielleicht start restart: always doch besser ein restart: unless-stopped genutzt werden sollte.