Docker hat sich als eine der führenden Plattformen zur Containerisierung etabliert. Es bietet Entwicklern eine effiziente Möglichkeit, Anwendungen und ihre Abhängigkeiten in Containern zu isolieren und auszuführen. Eine der häufigsten Herausforderungen besteht jedoch darin, mehrere Container für eine komplexe Anwendung zu verwalten. Hier kommt Docker Compose ins Spiel, eine leistungsstarke Tool-Erweiterung von Docker, die es ermöglicht, mehrere Container in einem Netzwerk zusammenzuführen und effizient zu verwalten.
In diesem Tutorial führen wir dich durch die Grundlagen von Docker Compose und erklären, wie du Services in einer docker-compose.yml-Datei definierst, um eine mehrschichtige Anwendung zu orchestrieren.
Was ist Docker Compose?
Docker Compose ist ein Tool, das es ermöglicht, Multi-Container-Docker-Anwendungen zu definieren und zu verwalten. Es erlaubt dir, die Dienste deiner Anwendung (wie Webserver, Datenbank, Caching-System usw.) in einer YAML-Datei zu konfigurieren. Mit nur einem einzigen Befehl kannst du dann alle Container dieser Anwendung starten, stoppen oder verwalten.
Vorteile von Docker Compose:
- Einfache Konfiguration: Alle Services und deren Konfigurationen werden in einer YAML-Datei verwaltet.
- Mehrere Umgebungen: Entwickle, teste und betreibe deine Anwendung in unterschiedlichen Umgebungen (z.B. Entwicklung, Staging, Produktion) mit einer einheitlichen Konfiguration.
- Netzwerkverwaltung: Docker Compose sorgt automatisch dafür, dass alle definierten Container in einem isolierten Netzwerk zusammenarbeiten.
Voraussetzungen
Um dieses Tutorial zu befolgen, solltest du folgende Punkte sicherstellen:
- Docker und Docker Compose sind auf deinem System installiert.
- Grundkenntnisse in Docker und Container-Konzepten.
- Ein Texteditor wie Visual Studio Code.
Schritt 1: Erstellen einer docker-compose.yml-Datei
In diesem Beispiel setzen wir eine einfache Webanwendung auf, die aus zwei Services besteht:
- Ein Webservice mit einem NGINX-Server.
- Ein Datenbank-Service mit einer MySQL-Datenbank.
Zuerst erstellen wir ein neues Verzeichnis für unser Projekt und eine docker-compose.yml-Datei darin:
mkdir mein-docker-compose-projekt
cd mein-docker-compose-projekt
touch docker-compose.yml
Öffne die docker-compose.yml-Datei in deinem bevorzugten Editor und füge den folgenden Inhalt hinzu:
version: '3'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: exampledb
MYSQL_USER: user
MYSQL_PASSWORD: userpass
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
Erläuterung der docker-compose.yml-Datei:
- Version: Die Version gibt die Docker-Compose-Datei-Syntax an. Hier verwenden wir Version 3.
- Services:
- Der
web-Service verwendet das neueste NGINX-Image und leitet den lokalen Port 8080 an den Container-Port 80 weiter, auf dem NGINX standardmäßig läuft. - Der
db-Service nutzt das MySQL-Image in der Version 5.7 und initialisiert eine Datenbank mit Umgebungsvariablen.
- Der
- Volumes: Hier definieren wir benannte Volumes, um persistenten Speicher für die MySQL-Datenbank zu gewährleisten.
Schritt 2: Starten der Anwendung mit Docker Compose
Nun, da unsere docker-compose.yml-Datei definiert ist, können wir unsere Multi-Container-Anwendung mit einem einfachen Befehl starten:
docker-compose up -d
Dieser Befehl:
- Lädt die notwendigen Docker-Images herunter (falls noch nicht vorhanden).
- Startet die Container im Hintergrund (
-dsteht für „detached mode“). - Verbindet die Services (Webserver und Datenbank) in einem gemeinsamen Netzwerk.
Mit dem Befehl docker ps kannst du prüfen, ob die Container laufen:
docker ps
Jetzt solltest du in deinem Browser http://localhost:8080 aufrufen können und die Standardseite von NGINX sehen.
Schritt 3: Verwalten der Container
Docker Compose bietet eine Vielzahl von nützlichen Befehlen, um deine Container zu verwalten. Hier sind einige der wichtigsten:
- Container stoppen: Um alle laufenden Container zu stoppen, benutze:
docker-compose down
Logs anzeigen: Um die Logs eines bestimmten Services anzuzeigen, verwende:
docker-compose logs web
Container neustarten: Falls du Änderungen an der Konfiguration vorgenommen hast, kannst du die Container einfach neu starten:
docker-compose restart
Status überprüfen: Der Befehl docker-compose ps zeigt den Status aller Dienste an.
docker-compose ps
Schritt 4: Arbeiten mit Umgebungen und Netzwerken
Ein großer Vorteil von Docker Compose ist die Möglichkeit, unterschiedliche Umgebungen (wie Entwicklung und Produktion) zu definieren. Oft möchtest du beispielsweise in der Entwicklungsumgebung andere Einstellungen verwenden als in der Produktionsumgebung.
Beispiel für Umgebungsvariablen:
Du kannst eine .env-Datei erstellen, um Umgebungsvariablen für dein Docker-Compose-Projekt zu definieren:
- Erstelle eine
.env-Datei:
touch .env
Füge folgende Variablen hinzu:
MYSQL_ROOT_PASSWORD=rootpass
MYSQL_DATABASE=exampledb
MYSQL_USER=user
MYSQL_PASSWORD=userpass
In deiner docker-compose.yml-Datei kannst du diese Variablen dann referenzieren:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
Netzwerke:
Docker Compose erstellt standardmäßig ein eigenes Netzwerk für die Services in der docker-compose.yml. Du kannst aber auch benutzerdefinierte Netzwerke anlegen:
networks:
front_end:
back_end:
services:
web:
networks:
- front_end
db:
networks:
- back_end
Dies trennt den Webserver und die Datenbank in zwei Netzwerke, sodass sie nur über explizit freigegebene Ports kommunizieren.
Fazit
Docker Compose ist ein extrem nützliches Tool für die Verwaltung von Multi-Container-Docker-Anwendungen. Mit einer klar strukturierten docker-compose.yml-Datei kannst du mehrere Services in einem Netzwerk orchestrieren und deine Anwendung sowohl in der Entwicklung als auch in der Produktion mühelos skalieren.
Durch die Möglichkeit, Umgebungen und Netzwerke zu konfigurieren, bietet Docker Compose eine flexible Lösung für eine Vielzahl von Anwendungsszenarien. Probiere es aus und optimiere deine Workflows!