6. docker-compose

Jetzt wollen wir die Bereitstellungen von Containern verbessern.

Mit docker run geht das zwar relativ einfach, aber wir wollen die Anweisungen zentral organisieren.

6.1. YAML

Die Konfiguration wird in der Textdatei docker-compose.yml bereitgestellt. Es handelt sich also um ein YAML gestylte Konfigurationsdatei.

Infoseiten zu YAML:

Für die Konformität der *.yml-Dateien kann wieder ein ordentlicher Editor (siehe VS Code) mit entsprechender Unterstützung sorgen.

Hinweis

Die Einrückungen (mit Leerzeichen) müssen genau passen - sie bestimmen die Gliederungen!

Kurzanleitung:

  • Abschnitt mit —

  • Kommentar mit #

  • Liste mit Bindestrich - oder in [eins, zwei, drei]

  • Hash mit key: wert oder {name: Joe, nachname: Brandes}

  • Textblock (mit Zeilenumbrüche) mit |

  • Textblock (ohne Zeilenumbrüche) mit >

Beispiel:

Beispiel YAML
# Datei sample.yaml
data:
  list:
    - item1
    - item2
  key1: >
    Dieser Text ist dem
    Schlüssel 'data.key1' zugeordnet.
  key2: |
    code line 1
    code line 2

YAML-Tool: shyaml (ein Python-Script)

openSUSE: sudo pip install shyaml

Beispielaufruf: shyaml get-value data.key1 < sample.yaml

6.2. Technik

Technischer Hintergrund…

In aktueller Docker-Technik kann man die docker-compose Techniken auch mit docker stack deploy Techniken - also: Swarm Services - ausführen und arbeitet quasi mit einem Minimal-Swarm von einer Docker-Instanz!

Hinweis

Das docker-compose Python-Skript kann Problemchen bereiten (Python!)

Wir beschränken uns - an dieser Stelle - auf docker-compose und behalten uns die Swarm-Techniken für später auf.

Webportal zu docker-compose: Docker Compose

Releases / Downloads GitHub: docker-compose Releases

Einfacher Download bzw. Installation:

curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m`
        -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose        # Originalanleitung mit /usr/local/bin - siehe $PATH

6.3. docker-compose.yml

Was für die Docker Standardtechniken (docker run) das Dockerfile darstellt ist nun die Konfigurationsdatei docker-compose.yml für unser Tool docker-compose!

docker-compose.yml (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.

cd test                    # hier ist 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 (!)
docker-compose up -d

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

Danach kann man alles beenden und löschen:

docker-compose down                        # es bleiben nur die Volumes!
rm -Rf /var/dc-test-db /var/dc-test-www    # Volumes müssen manuell gelöscht werden

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.

docker-compose <commands>

  • config (Analyse)

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

  • events

  • kill (falls stop|down nicht funzt)

  • logs

  • pause | unpause

  • ps

6.4. Volumes

Volumes lassen sich unter Docker als Mounts technisch nutzen und können unterschiedlich erstellt/gebunden sein.

  • Bind Mounts (z.B. durch -v /var/dc-test-www:/var/www/html)

  • Docker Volumes (mit docker volume create .. manuell erzeugen oder s.o. als Direktiven in docker-compose.yml oder Dockerfile)

Nur echte Volumes lassen sich mit docker volume ls auflisten.

Die Volumes lassen sich genauer mit docker volume inspect ... analysieren.

6.5. Mini-Swarm

An dieser Stelle nur zum reinschnuppern

Mit docker stack deploy einen Cluster mit nur einem Docker-Mitglied nutzen.

Hinweis

Übungen mit docker-compose (s.o.) inkl. Volumes vorher aufräumen/löschen!

Docker-Schwarm initieren: docker swarm init

docker swarm init                                      # Docker Swarm initieren
cd test                                                # hier ist das docker-compose.yml
mkdir /var/dc-test-www                                 # Volume Wordpress HTML
mkdir /var/dc-test-db                                  # Volume MariaDB Databases
docker stack deploy -c docker-compose.yml stacktest    # und los geht es...

docker stack rm stacktest                              # alles (bis auf Volumes) löschen!

Das Beispiel zeigt ganz schön die zusätzliche Abstraktionsebene beim Testen der Docker-Technik.

Testen der WordPress-Installation im Browser (URL): 172.20.0.2:8082

Also: die Portumsetzung quasi eine Netzwerk-Ebene weiter (siehe GW-Netzwerk)! Die richtige IP (hier im Beispiel: 172.20.0.2) analysieren Sie über docker network Analyse (oder einfach mit ip a s auf Docker Host: siehe GW-Bridge).

Der Docker läuft weiterhin im Swarm-Modus!

Beenden mit: docker swarm leave --force

Für Docker Swarm dann auch weitere Deploy-Einstellungen (später mehr bei Swarm):

  • deploy.mode

  • deploy.placement.constraint ; Regeln: node.id, node.hostname, node.role

Wenn später mehrere Node (Docker Host Swarm Mitglieder) gejoint werden (docker swarm join ...) müssen weitere Vorbereitungen und Konfigurationen beachtet werden: insbesondere die Nutzung von Zeitservice NTP, damit die Nodes genau gleich „ticken“.