Bei mir läuft es doch
Jonas baut den Bestelldienst für einen Online-Shop. Auf seinem Laptop läuft er einwandfrei.
Auf dem Server stürzt er sofort ab. Dort ist eine ältere Python-Version installiert, und eine Bibliothek fehlt.
Teams haben mit diesem Problem ganze Tage verloren. Diese Lektion zeigt das Werkzeug, mit dem die meisten es heute vermeiden.
Am Ende dieser Lektion
Notiz
Ich kann erklären, was ein Container ist und warum Teams ihn einsetzen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Abhängigkeit | etwas, das Ihre App zum Laufen braucht | Python 3.12, eine Bibliothek |
| Container | eine App samt allem Nötigen, getrennt vom Rest des Rechners | |
| Image | das fertig gepackte Paket, aus dem ein Container startet | |
| Dockerfile | eine Textdatei mit Schritten, die ein Image baut | |
| Registry | ein gemeinsamer Speicher für Images | |
| Virtuelle Maschine | ein ganzer Scheinrechner mit eigenem Betriebssystem |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Container trägt, was die App braucht
Jede App hat Abhängigkeiten: die richtige Python-Version, einige Bibliotheken, einige Einstellungen.
Ein Container packt die App zusammen mit ihren Abhängigkeiten. Er läuft getrennt von allem anderen auf dem Rechner.
So findet die App überall dasselbe Python und dieselben Bibliotheken. Laptop und Server sind nicht mehr verschieden.
Dieselbe App an drei Orten
| Wo sie läuft | Gefundenes Python | Bibliothek gefunden | Ergebnis |
|---|---|---|---|
| Jonas’ Laptop | 3.12 | Ja | Läuft |
| Server ohne Container | 3.8 | Nein | Stürzt ab |
| Server mit Container | 3.12, aus dem Image | Ja, aus dem Image | Läuft |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, ein Container sei eine kleine virtuelle Maschine. Das stimmt nicht. Eine virtuelle Maschine bringt ein ganzes eigenes Betriebssystem mit. Ein Container nutzt das Betriebssystem des Rechners mit und packt nur die App und ihre Abhängigkeiten. Deshalb startet er meist in wenigen Sekunden.
Ein Image entsteht aus einem Dockerfile
Sie packen einen Container nicht von Hand. Sie schreiben ein Dockerfile: eine kurze Liste von Schritten.
Ein Werkzeug liest die Schritte der Reihe nach und baut daraus ein Image. Das Image ist das gepackte Ergebnis. Jeder Container aus diesem Image ist gleich.
Unten schreibt Bash ein echtes Dockerfile und liest es zurück. Lesen Sie jede Zeile und machen Sie dann die Änderung aus dem letzten Kommentar.
Ein Dockerfile schreiben und lesen
mkdir -p bestell-dienst && cd bestell-dienst
printf 'print("Bestelldienst läuft")\n' > app.py
printf 'flask==3.0.3\n' > requirements.txt
cat > Dockerfile <<'EOF'
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
CMD ["python", "app.py"]
EOF
# Jede Zeile des Rezepts mit Nummer anzeigen
cat -n Dockerfile
# Von welchem Basis-Image geht es aus?
grep FROM Dockerfile
# Ändern Sie oben python:3.12-slim in python:3.11-slim und drücken Sie erneut auf Ausführen.
Was jede Zeile tut
| Zeile | Was sie tut |
|---|---|
| FROM python:3.12-slim | Startet von einem Image, das Python 3.12 schon enthält |
| WORKDIR /app | Arbeitet im Ordner /app |
| COPY requirements.txt . | Kopiert die Liste der Bibliotheken hinein |
| RUN pip install -r requirements.txt | Installiert diese Bibliotheken ins Image |
| COPY app.py . | Kopiert den Code der App hinein |
| CMD ["python", "app.py"] | Legt fest, was beim Start eines Containers läuft |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Warum Teams Container einsetzen
Das Team baut das Image einmal. Es kommt in eine Registry, einen gemeinsamen Speicher für Images.
Test-Server und Live-Server holen dasselbe Image. Was die Tests bestanden hat, nutzen auch die Kundinnen und Kunden.
Ist der Shop stark besucht, startet das Team zehn Kopien statt einer. Jede Kopie läuft in wenigen Sekunden.
Was echte Docker-Befehle ausgeben
| Befehl | Ausgabe | Bedeutung |
|---|---|---|
| docker build -t bestellungen:1.4 . | naming to docker.io/library/bestellungen:1.4 done | Das Image ist gebaut und heißt bestellungen, Version 1.4 |
| docker push registry.example.com/bestellungen:1.4 | 1.4: digest: sha256:9f2c... | Das Image liegt jetzt in der Registry |
| docker run -d bestellungen:1.4 | 3b7e1c0a9d42f5e8... (lange Kennung, hier gekürzt) | Ein Container ist gestartet; das ist seine Kennung |
| docker ps | 3b7e1c0a9d42 bestellungen:1.4 Up 5 seconds | Ein Container läuft |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.