Docker ist ein mächtiges Werkzeug für die Containerisierung von Anwendungen. Oft besteht eine Anwendung jedoch aus mehreren Diensten, die jeweils in eigenen Containern laufen. Hier kommt Docker-Compose ins Spiel: Es ermöglicht das einfache Starten und Verwalten mehrerer Container in einer Anwendung. In diesem Tutorial zeige ich dir, wie du Docker-Compose verwendest, um Container-Orchestrierung zu erleichtern.
Inhalt
- Was ist Docker-Compose?
- Installation von Docker-Compose
- Aufbau der
docker-compose.yml
-Datei - Ein einfaches Beispiel mit Docker-Compose
- Nützliche Docker-Compose Befehle
- Komplexere Szenarien mit Docker-Compose
- Docker-Compose in der Praxis: Tipps und Tricks
1. Was ist Docker-Compose?
Docker-Compose ist ein Werkzeug, das es ermöglicht, Anwendungen, die aus mehreren Containern bestehen, zu definieren und zu verwalten. Anstatt jeden Container einzeln zu starten, erlaubt Docker-Compose die Definition mehrerer Dienste in einer einzigen YAML-Datei (meist docker-compose.yml
). Durch einen einzigen Befehl können dann alle Container, Netzwerke und Volumes gleichzeitig erstellt und verwaltet werden.
2. Installation von Docker-Compose
Docker-Compose ist in neueren Versionen von Docker Desktop bereits integriert. Wenn du Docker über eine andere Methode installiert hast, kannst du Docker-Compose manuell installieren. Hier ist ein Beispiel für Linux:
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep tag_name | cut -d '"' -f 4)/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Überprüfe nach der Installation, ob alles funktioniert, indem du folgenden Befehl ausführst:
docker-compose --version
3. Aufbau der docker-compose.yml
-Datei
Die docker-compose.yml
-Datei ist das Herzstück jeder Docker-Compose-Konfiguration. In dieser Datei definierst du alle Container (auch „Dienste“ genannt), Netzwerke und Volumes, die für deine Anwendung erforderlich sind.
Der grundsätzliche Aufbau sieht folgendermaßen aus:
version: '3' # Version der Compose-Spezifikation
services: # Hier werden die Dienste (Container) definiert
web:
image: nginx
ports:
- "8080:80"
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
In diesem Beispiel haben wir zwei Dienste definiert:
web
: Ein Nginx-Webserver, der auf Port 8080 zugänglich ist.db
: Ein MySQL-Datenbankdienst mit einem Volume für persistente Daten.
4. Ein einfaches Beispiel mit Docker-Compose
Lass uns ein einfaches Setup erstellen, bei dem wir einen Nginx-Webserver und eine MySQL-Datenbank verwenden. Wir erstellen dafür eine docker-compose.yml
-Datei:
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: supersecret
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
Speichere die Datei in einem Verzeichnis, z.B. myapp/
.
Nun kannst du die gesamte Anwendung (beide Dienste) mit einem einzigen Befehl starten:
docker-compose up -d
Dieser Befehl startet die Nginx-Webserver und MySQL-Datenbank im Hintergrund. Du kannst jetzt den Nginx-Webserver unter http://localhost:8080
aufrufen.
5. Nützliche Docker-Compose Befehle
Hier sind einige nützliche Docker-Compose Befehle, die du für das Verwalten deiner Container verwenden kannst:
- Container starten: bashKopierenBearbeiten
docker-compose up
Fügt das -d
-Flag hinzu, um die Container im Hintergrund (detached) zu starten:
docker-compose up -d
- Container stoppen:
docker-compose stop
- Container stoppen und entfernen:
docker-compose down
- Container-Protokolle anzeigen:
docker-compose logs
- Status aller Dienste anzeigen:
docker-compose ps
6. Komplexere Szenarien mit Docker-Compose
Docker-Compose kann auch in komplexeren Szenarien verwendet werden. Du kannst Umgebungsvariablen setzen, Netzwerke definieren, Container skalieren und vieles mehr.
Beispiel: Ein benutzerdefiniertes Netzwerk und skalierbare Container
Hier ein Beispiel für ein Setup, bei dem wir ein benutzerdefiniertes Netzwerk verwenden und die Anzahl der Webserver-Instanzen skalieren:
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
networks:
- frontend
deploy:
replicas: 3
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: supersecret
networks:
- backend
networks:
frontend:
backend:
In diesem Beispiel haben wir zwei Netzwerke (frontend
und backend
) erstellt. Der web
-Dienst ist im frontend
-Netzwerk und der db
-Dienst im backend
. Außerdem haben wir die Webserver-Instanzen auf drei Container skaliert.
Du kannst das Setup mit folgendem Befehl ausführen:
docker-compose up --scale web=3 -d
7. Docker-Compose in der Praxis: Tipps und Tricks
Umgebungsdateien (.env
)
Du kannst Umgebungsvariablen in einer .env
-Datei definieren, um Konfigurationswerte wie Datenbank-Passwörter oder Ports flexibel zu halten:
.env
-Datei:
MYSQL_ROOT_PASSWORD=mysecretpassword
WEB_PORT=8080
In der docker-compose.yml
kannst du dann diese Werte verwenden:
version: '3'
services:
web:
image: nginx
ports:
- "${WEB_PORT}:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
Mehrere Compose-Dateien
Du kannst mehrere Compose-Dateien für unterschiedliche Umgebungen (z.B. Entwicklung und Produktion) verwenden. Zum Beispiel kannst du eine docker-compose.yml
für die allgemeine Konfiguration und eine docker-compose.prod.yml
für Produktionsumgebungen erstellen.
Um beide zusammen zu verwenden:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Fazit
Docker-Compose ist ein unverzichtbares Werkzeug, um mehrere Container zu orchestrieren und als Teil einer Anwendung zusammenzuführen. Mit einer einzigen YAML-Datei kannst du Container, Netzwerke und Volumes konfigurieren und alle Dienste einfach starten und verwalten.
Ob du eine kleine Webanwendung mit zwei Containern oder eine komplexe Microservice-Architektur verwaltest – Docker-Compose macht die Verwaltung und Skalierung deiner Container deutlich einfacher.
Starte jetzt, indem du Docker-Compose in deinem nächsten Projekt verwendest und die Vorteile der einfachen Container-Orchestrierung genießt!