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