Orchestriere deine Docker-Anwendungen
Compose erleichtert die Skalierung und Bereitstellung von Anwendungen in Docker, indem es die Verwaltung von Containern automatisiert. In diesem Tutorial werfen wir einen detaillierten Blick auf die Einrichtung und Nutzung von Docker Compose, damit du es in deiner eigenen Produktionsumgebung anwenden kannst.
Was ist Docker Compose?
Docker Compose dient dem Management von Anwendungen und erhöht die Effizienz bei der Entwicklung von Containern. Konfigurationen werden in einer einzigen YAML-Datei festgelegt, wodurch Applikationen einfach zu erstellen und zu skalieren sind. Docker Compose wird häufig verwendet, um eine lokale Umgebung einzurichten. Es kann aber auch Teil eines Continuous Integration / Continuous Delivery (CI/CD) Workflows sein. Entwickler:innen können eine spezifische Version von Containern für Tests oder für eine bestimmte Phase der Pipeline definieren. Dies erleichtert die Identifizierung von Problemen und die Behebung von Fehlern, bevor sie online gehen.
Docker Compose: Das sind die Voraussetzungen
Für die Container-Orchestrierung benötigst du sowohl die Docker-Engine als auch Docker Compose. Du musst daher eine der folgenden Möglichkeiten auf deinem System eingerichtet haben:
- Docker Engine und Docker Compose: können als Standalone Binaries installiert werden
- Docker Desktop: Entwicklungsumgebung mit grafischer Benutzeroberfläche, die die Docker-Engine und Docker Compose bereits beinhaltet
Wie du Docker Compose auf verschiedenen Betriebssystemen installierst, erfährst du in unseren Tutorials:
Schritt-für-Schritt-Anleitung: So nutzt du Docker Compose
Im Folgenden demonstrieren wir die Konzepte von Docker Compose mit einer einfachen Python-Web-Applikation, deren Aufrufe in einem Hit-Counter gezählt werden. Dazu verwenden wir das Python Flask Framework und die In-Memory-Datenbank Redis. Du musst weder Python noch Redis installieren, da diese als Docker Images bereitgestellt werden.
Schritt 1: Projektdateien erstellen
Öffne das Terminal und lege einen neuen Ordner für das Projekt an.
$ mkdir composedemoshellWechsle daraufhin in das Verzeichnis.
$ cd composedemoshellErstelle in diesem Ordner die Datei app.py und füge ihr folgenden Code hinzu:
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I was here {} times.\n'.format(count)pythonWir verwenden als Hostname „Redis“ und den Standardport „6379“. Des Weiteren legen wir fest, dass die Funktion get_hit_count() mehrere Versuche unternehmen soll, sich mit dem Dienst zu verbinden. Dies ist empfehlenswert, da es sein kann, dass Redis beim Start der Anwendung noch nicht verfügbar ist oder es im Betrieb zu Verbindungsproblemen kommt.
Lege noch die Datei requirements.txt mit den Abhängigkeiten an:
flask
redisplaintextSchritt 2: Dockerfile einrichten
Das Dockerfile wird für das Docker Image benutzt. Hierin werden alle Abhängigkeiten angegeben, die die Python-Anwendung benötigt.
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]shellDocker wird damit angewiesen, das Python 3.7 Image zu verwenden. Zudem haben wir die Umgebungsvariablen für das Flask-Kommando festgelegt. Mit apk add installieren wir gcc und andere Abhängigkeiten. EXPOSE gibt an, dass der Container Port 5000 überwachen soll. Mit COPY wird der Inhalt des aktuellen Ordners in das Arbeitsverzeichnis /code kopiert. Als Standardbefehl für den Container wählen wir flask run.
Überprüfe, dass das Dockerfile ohne Dateiendung gespeichert wurde, da manche Editoren automatisch das Suffix .txt anhängen.
Schritt 3: YAML-Datei anlegen
In docker-compose.yml konfigurieren wir die Dienste „redis“ und „web“.
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"yamlDer Web-Dienst nutzt das Image, das vom Dockerfile erstellt wird. Es verknüpft den Container und den Host-Computer mit Port 8000, während der Flask-Webserver auf Port 5000 läuft. Das Redis-Image wird hingegen direkt aus dem offiziellen Docker Hub bezogen.
Schritt 4: Die Anwendung mit Compose ausführen
Starte die Applikation von deinem Projektordner aus.
docker compose upshellRufe ‘http://localhost:8000’ in deinem Browser auf. Du kannst auch ‘http://127.0.0.1:8000’ eingeben.
Dir sollte folgende Nachricht angezeigt werden:

Aktualisiere die Seite. Die Anzahl deiner Aufrufe sollte nun um 1 gestiegen sein.

Stoppe die Anwendung mit:
$ docker compose downshellDu kannst aber auch in dem Terminal, in dem du die Applikation gestartet hast, Ctrl + C drücken.
Schritt 5: Ein Bind Mount hinzufügen
Wenn du ein Bind Mount für den Web-Dienst hinzufügen möchtest, kannst du dies in docker-compose.yml vornehmen.
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
environment:
FLASK_DEBUG: "true"
redis:
image: "redis:alpine"yamlUnter Volumes geben wir an, dass der aktuelle Projektordner an das Verzeichnis /code innerhalb des Containers angebunden werden soll. Damit kannst du den Code ändern, ohne das Image neu erstellen zu müssen. Die Umgebungsvariable FLASK_DEBUG ordnet flask run dabei an, im Entwicklungsmodus ausgeführt zu werden.
Schritt 6: Applikation neu erstellen und ausführen
Gib folgenden Befehl in das Terminal ein, um die Compose-Datei neu aufzusetzen:
docker compose upshellSchritt 7: Die Anwendung aktualisieren
Da du jetzt einen Bind Mount für deine Applikation verwendest, kannst du deinen Code modifizieren und automatisch die Änderungen sehen, ohne das Image neu zu erstellen.
Schreibe einen neuen Begrüßungstest in app.py.
return 'Hello from Docker! I was here {} times.\n'.format(count)pythonAktualisiere den Browser, um zu testen, ob die Änderungen übernommen wurden.

Schritt 8: Weitere Kommandos
Die Option --help zeigt dir eine Liste an verfügbaren Kommandos für Docker Compose an:
docker compose --helpshellUm Docker Compose im Hintergrund laufen zu lassen, kannst du das Argument -d hinzufügen:
docker compose up -dshellMit down werden alle Container entfernt. Die Option --volumes löscht dabei auch die vom Redis-Container verwendeten Volumes.
docker compose down --volumesshell