Dieser Artikel bietet eine umfassende Einführung in Docker für Python-Entwickler, die darauf abzielt, häufige Probleme bei der Anwendungsbereitstellung zu lösen. Er erklärt, wie Docker durch die Verpackung von Anwendungen und ihrer Laufzeitumgebungen in Container die "funktioniert auf meiner Maschine"-Problematik beseitigt und die Entwicklung vereinfacht. Der Leitfaden enthält praktische Schritte zum Containerisieren einer einfachen FastAPI-basierten Todo-API.
Wie Docker funktioniert und warum Sie es brauchen
Docker fungiert als "Versandcontainer" für Ihren Code. Es verpackt nicht nur den Quellcode, sondern auch die gesamte Laufzeitumgebung, einschließlich der spezifischen Python-Version, aller Abhängigkeiten, Systembibliotheken, Umgebungsvariablen und des erwarteten Betriebssystems. Dies gewährleistet, dass Ihre Anwendung auf jedem System, auf dem Docker installiert ist, identisch läuft.
- Containerisierung: Verpacken Sie Ihre App in ein portables Artefakt namens "Image".
- Container: Starten Sie laufende Instanzen von Images, um Ihre Anwendungen auszuführen.
Erstellung einer Python-Web-API mit FastAPI
Der Artikel demonstriert die Containerisierung anhand einer einfachen FastAPI-basierten Todo-API. Zuerst werden die notwendigen Abhängigkeiten in einer requirements.txt-Datei aufgeführt:
fastapi==0.116.1
uvicorn[standard]==0.35.0
pydantic==2.11.7
Anschließend wird die grundlegende Anwendungsstruktur mit Datenmodellen für die Todo-Elemente, einem Health-Check-Endpunkt und der Kernfunktionalität für das Auflisten, Erstellen und Löschen von Todos erstellt. Der Serverstart wird ebenfalls gezeigt.
Schreiben Ihrer ersten Dockerfile
Eine Dockerfile dient als Bauanleitung für ein Docker-Image. Sie definiert die Schritte zum Erstellen eines Images aus den Projektkomponenten:
# Starten mit einem Basis-Python-Image
FROM python:3.11-slim
# Umgebungsvariablen setzen
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
ENVIRONMENT=production \
PYTHON_VERSION=3.11
# Arbeitsverzeichnis einrichten
WORKDIR /app
# Abhängigkeiten installieren (Reihenfolge wichtig für Caching)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Anwendungscode kopieren
COPY . .
# Port freigeben und Startbefehl festlegen
EXPOSE 8000
CMD ["python", "app.py"]
Diese Dockerfile erstellt einen Container für die Python-Webanwendung, indem sie ein Basis-Image verwendet, Abhängigkeiten installiert, den Code kopiert und die Anwendung ausführt.
Erstellen und Ausführen Ihres ersten Containers
Nachdem die Dockerfile erstellt wurde, kann das Image mit docker build -t my-todo-app . gebaut und der Container mit docker run -p 8000:8000 my-todo-app ausgeführt werden. Der -p-Parameter ordnet den Port 8000 im Container dem Port 8000 auf dem Host zu.
Wichtige Docker-Befehle für den täglichen Gebrauch
- Image erstellen:
docker build -t myapp . - Container im Hintergrund ausführen:
docker run -d -p 8000:8000 --name myapp-container myapp - Laufende Container anzeigen:
docker ps - Container-Logs anzeigen:
docker logs myapp-container - Shell in einem laufenden Container erhalten:
docker exec -it myapp-container /bin/sh - Container stoppen und entfernen:
docker stop myapp-containerunddocker rm myapp-container - Nicht verwendete Ressourcen bereinigen:
docker system prune
Einige Docker-Best Practices, die wichtig sind
- Verwenden Sie immer spezifische Versionen für Basis-Images (z. B.
python:3.11.7-slim). - Erstellen Sie eine
.dockerignore-Datei, um unnötige Dateien auszuschließen. - Halten Sie Images schlank, indem Sie Paketmanager bereinigen.
- Führen Sie Container in der Produktion immer als Nicht-Root-Benutzer aus.
Zusammenfassung
Der Artikel gibt einen grundlegenden Überblick über Docker für Python-Entwickler und ermutigt zur weiteren Erkundung von Themen wie Container-Orchestrierung (Kubernetes), Sicherheitsfunktionen und CI/CD-Pipelines.