Zum Inhalt

Docker Compose

Mit Docker Compose lassen sich mehrere Docker-Ressourcen zusammen verwalten.

Installation

Installiere Docker Compose entweder mit dem Paketmanager deines Vertrauens oder mit pipx.

Nutzung

Eine Einführung findet sich in der offiziellen Dokumentation.

Parallele Instanzen

Verschiedene Projekte

In Konfigurationsdateien für Docker Compose werden üblicherweise Ports freigegeben, damit man leicht auf die Dienste zugreifen kann. Wenn es bei diesen Ports Überschneidungen zwischen verschiedenen Projekten gibt kommt es zu Problemen beim gleichzeitigen Start beider Projekte:

ERROR: for example Cannot start service example: driver failed programming external connectivity on endpoint example_example_1 (a42fe5ca0353cfceb5094f1dc6466b348e02b55f0a88e44a2dc00eefc5f398b1): Bind for 0.0.0.0:1234 failed: port is already allocated

Um dieses Problem zu umgehen sollte man die Ports der Projekte an eine verschiedene IP-Adressen binden. Um diese Adressen zu konfigurierbar zu halten sollte man eine Variable (üblicherweise Namens COMPOSE_BIND) verwenden:

services:
    example:
        command: nc -l 0.0.0.0 1234
        image: alpine
        ports:
            - ${COMPOSE_BIND:-0.0.0.0}:1234:1234

Als IP-Adressen für COMPOSE_BIND eignet sich bestens welche aus dem Loopback-Block 127.0.0.0/8. Folglich lassen sich zwei wie oben konfigurierte Projekte wie folgt gleichzeitig starten.

cd /path/to/project/foo
COMPOSE_BIND=127.0.0.2 docker-compose start
cd /path/to/project/bar
COMPOSE_BIND=127.0.0.3 docker-compose start

Danach kann man auch die freigegebenen Ports über die entsprechenden IP-Adressen zugreifen (beispielsweise http://127.0.0.2).

Wenn man COMPOSE_BIND nicht jedes mal mit auf der Kommandozeile angeben will kann die Zuweisung auch jeweils in der Datei .env vornehmen:

COMPOSE_BIND=127.0.0.2

Sollte man die Übersicht über die vergebenen IP-Adressen verlieren, so kann man diesen in /etc/hosts auch einprägsame Namen zuweisen:

127.0.0.2 project-foo.localhost project-foo
127.0.0.3 project-bar.localhost project-bar

Dasselbe Projekt

Sollte man mehrere Instanzen desselben Projekts starten wollen muss man sich neben den überlappenden Ports (s.o.) noch um einen jeweils einzigartigen Namen für die Instanzen bemühen. Normalerweise leitet sich dieser aus dem Verzeichnisnamen des Projekts ab. Dieser ist beim selben Projekt aber natürlich der gleiche. Mit der Umgebungsvariable COMPOSE_PROJECT_NAME kann man jedoch verschiedene Namen beim Start der Instanzen angeben:

cd /path/to/project
COMPOSE_BIND=127.0.0.2 COMPOSE_PROJECT_NAME=instance-foo docker-compose start
COMPOSE_BIND=127.0.0.3 COMPOSE_PROJECT_NAME=instance-bar docker-compose start