„Bei mir läuft's“ ist der Klassiker unter den Ausreden. Container packen deine App so ein, dass sie überall gleich läuft — auf deinem Laptop und in der Cloud. Das macht das Deployen dramatisch einfacher.
Die Idee
Ein Container ist eine Lunchbox für deine App. Darin liegt nicht nur die App, sondern alles, was sie zum Laufen braucht: die richtige Version von Node, alle Bibliotheken, die Einstellungen. Dieselbe Box öffnet sich überall gleich — kein „dir fehlt noch dies und das“.
Stell dir vor, das Instagram-Backend läuft auf tausend Servern. Ohne Container müsste jeder Server exakt gleich eingerichtet sein — ein Albtraum. Mit Container schickt man überall dieselbe Lunchbox, und überall läuft dasselbe.
So funktioniert es
- Docker ist das Werkzeug, das solche Lunchboxen baut und startet.
- Ein Dockerfile ist das Rezept: „Nimm diese Basis, leg meine App hinein, starte sie so.“
- Ein Image ist die fertig gepackte, eingefrorene Box (die Vorlage).
- Ein Container ist eine laufende Kopie dieses Images.
Ein vollständiges Dockerfile für das Instagram-Backend, Zeile für Zeile erklärt:
# Basis: schlankes Linux mit vorinstalliertem Node 20
FROM node:20-slim
# Arbeitsverzeichnis innerhalb der Box
WORKDIR /app
# zuerst nur die Abhängigkeitsliste kopieren (nutzt den Build-Cache)
COPY package*.json ./
# Abhängigkeiten installieren (ohne Dev-Werkzeuge, kleiner)
RUN npm ci --omit=dev
# dann den restlichen Code hineinlegen
COPY . .
# Cloud Run gibt den Port über die Variable PORT vor
ENV PORT=8080
EXPOSE 8080
# womit die App startet
CMD ["node", "server.js"]
flowchart LR
D[Dockerfile
Rezept] --> I[Image
gepackte Vorlage]
I --> C1[Container 1]
I --> C2[Container 2]
I --> C3[Container 3]
Aus einem Image startest du beliebig viele identische Container — genau das braucht Instagram, um bei viel Andrang zu skalieren.
So steuerst du es
Gute Praxis: kleine Basis-Images (-slim), Abhängigkeiten getrennt vom Code kopieren (damit der Cache greift), und keine Geheimnisse ins Image backen — sie stecken sonst dauerhaft in jeder Kopie.
Der wichtigste Stolperstein: Die App muss auf dem Port aus der Umgebungsvariable PORT lauschen. Sonst startet sie lokal, aber die Cloud erreicht sie nicht.
So sagst du es dem Agenten:
„Schreibe ein Dockerfile für dieses Node-Backend, das auf
process.env.PORTlauscht (Fallback 8080).“„Kopiere
package*.jsonvor dem restlichen Code, damit der Docker-Cache greift.“„Backe keine Geheimnisse ins Image; das DB-Passwort kommt später als Umgebungsvariable.“
Typische Fehler: App lauscht auf festem Port statt PORT; Geheimnisse ins Image kopiert; riesige Images, weil node_modules oder .git mit hineinkopiert wurden (dagegen hilft eine .dockerignore).
Kurz-Check
- Was steckt in einem Container zusätzlich zur App?
- Was ist der Unterschied zwischen Image und Container?
- Warum ist die
PORT-Umgebungsvariable wichtig für die Cloud?
Antworten anzeigen
- Alles zum Laufen: die richtige Laufzeit, Bibliotheken und Einstellungen.
- Image = eingefrorene Vorlage; Container = laufende Kopie davon (du kannst viele aus einem Image starten).
- Die Cloud gibt den Port vor; lauscht die App auf einem anderen, ist sie nicht erreichbar.