Back

Ein Einsteiger-Leitfaden zu Docker Images und Containern

Ein Einsteiger-Leitfaden zu Docker Images und Containern

Sie sind gerade einem Frontend-Team beigetreten und alle sprechen davon, „Container hochzufahren” und „Images zu pullen”. Ihre React-App funktioniert auf Ihrem Rechner einwandfrei, aber das Deployment erscheint Ihnen wie ein Rätsel. Docker löst genau dieses Problem – und die Grundlagen von Docker Images zu verstehen ist einfacher, als Sie vielleicht denken.

Dieser Leitfaden behandelt, was Docker Images und Container tatsächlich sind, wie sie miteinander zusammenhängen und wie Sie sie in Ihrem Frontend-Workflow für lokale Entwicklung, Testing und einfache Deployments einsetzen können.

Die wichtigsten Erkenntnisse

  • Docker Images sind schreibgeschützte Baupläne, während Container laufende Instanzen dieser Images sind.
  • Verwenden Sie explizite Tags wie node:20-alpine anstelle von latest für vorhersehbare, reproduzierbare Builds.
  • Multi-Stage-Builds halten Ihre Produktions-Images klein und sicher.
  • Speichern Sie niemals persistente Daten innerhalb von Containern – verwenden Sie stattdessen Volumes.
  • Führen Sie Container als Nicht-Root-Benutzer aus und scannen Sie Images regelmäßig auf Schwachstellen.

Was sind Docker Images und Container?

Ein Docker Image ist ein schreibgeschütztes Paket, das alles enthält, was zum Ausführen einer Anwendung benötigt wird: Code, Runtime, Bibliotheken und Konfiguration. Stellen Sie es sich wie eine Klasse in der objektorientierten Programmierung vor – ein Bauplan, der die Struktur definiert, aber selbst nichts ausführt.

Ein Container ist eine laufende Instanz dieses Images. Wenn Sie docker run ausführen, erstellt Docker aus dem Image eine isolierte Umgebung, in der Ihre Anwendung tatsächlich läuft. Sie können mehrere Container aus demselben Image starten, die jeweils unabhängig voneinander arbeiten.

Diese Unterscheidung zwischen Docker Image und Container ist wichtig: Images sind statische Templates, die auf der Festplatte gespeichert werden, während Container laufende Prozesse mit eigenem Dateisystem und Netzwerk sind.

Docker Images folgen der OCI-Spezifikation (Open Container Initiative), was bedeutet, dass sie mit verschiedenen Container-Runtimes funktionieren – nicht nur mit Docker. Diese Standardisierung stellt sicher, dass Ihre Images portabel bleiben.

Registries und Tags verstehen

Images befinden sich in Registries – Docker Hub ist die gängigste öffentliche Registry. Wenn Sie ein Image wie node:20-alpine referenzieren, geben Sie ein Repository (node) und ein Tag (20-alpine) an.

Hier ist etwas, das Einsteiger oft verwirrt: Das latest-Tag ist nicht magisch. Es zeigt nicht automatisch auf die neueste Version. Es ist einfach ein Standard-Tag, das Image-Maintainer aktualisieren können oder auch nicht. Verwenden Sie immer explizite Tags wie node:20-alpine für vorhersehbare Builds.

Ihren ersten Container ausführen

Lassen Sie uns einen einfachen Container mit dem offiziellen Node.js-Image ausführen:

docker run -it --rm node:20-alpine node -e "console.log('Hello from Docker!')"

Die -it-Flags aktivieren den interaktiven Modus mit einem Terminal. Das --rm-Flag entfernt den Container automatisch, wenn er beendet wird.

Für ein praxisnäheres Beispiel können Sie einen Development-Server ausführen. Erstellen Sie zunächst ein Projektverzeichnis mit Ihrem Frontend-Code, dann:

docker run -d -p 3000:3000 -v $(pwd):/app -w /app node:20-alpine sh -c "npm install && npm run dev"

Das -d-Flag führt den Container im Hintergrund aus. Das -p 3000:3000 mappt Port 3000 innerhalb des Containers auf Port 3000 auf Ihrem Rechner. Das -v-Flag mountet Ihr aktuelles Verzeichnis in den Container, und -w setzt das Arbeitsverzeichnis.

Eigene Images mit Dockerfiles erstellen

Für echte Projekte erstellen Sie eigene Images. Hier ist ein Dockerfile für eine React-Anwendung:

FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80

Dies demonstriert einen Multi-Stage-Build – eine wichtige Docker-Best-Practice. Die erste Stage baut Ihre App; die zweite Stage kopiert nur die Produktionsdateien in ein minimales nginx-Image. Ihr finales Image bleibt klein und sicher.

Bauen und führen Sie es aus:

docker build -t my-frontend-app .
docker run -d -p 8080:80 my-frontend-app

Docker Volumes und Persistenz

Container sind ephemer – wenn sie stoppen, verschwinden alle darin geschriebenen Daten. Für die lokale Entwicklung verwenden Sie Bind-Mounts, um Ihren Quellcode zu synchronisieren:

docker run -v $(pwd)/src:/app/src -p 3000:3000 my-frontend-app

Für Daten, die persistent bleiben müssen (wie Datenbankdateien), verwenden Sie Named Volumes:

docker volume create app-data
docker run -v app-data:/data my-app

Docker Volumes und Persistenz zu verstehen ist essenziell: Speichern Sie niemals wichtige Daten ausschließlich im Dateisystem eines Containers.

Grundlagen der Docker-Sicherheit

Ein paar Praktiken machen Ihre Container sicherer:

Als Nicht-Root ausführen. Fügen Sie einen Benutzer in Ihrem Dockerfile hinzu:

RUN adduser -D appuser
USER appuser

Minimale Base-Images verwenden. Alpine-basierte Images haben weniger Schwachstellen als vollständige Distributionen.

Images regelmäßig scannen. Tools wie Docker Scout oder Trivy identifizieren bekannte Schwachstellen.

Niemals Secrets in Images einbacken. Umgebungsvariablen oder Secret-Management-Tools verwalten Zugangsdaten – sie hartzucodieren schafft Sicherheitsrisiken, die in Image-Layern bestehen bleiben.

Multi-Container-Setups mit Compose vereinfachen

Wenn Ihr Frontend lokal eine Backend-API und Datenbank benötigt, orchestriert Docker Compose alles:

services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
  api:
    build: ./api
    ports:
      - "4000:4000"

Führen Sie docker compose up aus und beide Services starten zusammen. Verwenden Sie docker compose down, um alle Container zu stoppen und zu entfernen.

Fazit

Docker Images sind Baupläne; Container sind laufende Instanzen. Halten Sie Images mit Multi-Stage-Builds klein, verwenden Sie explizite Tags anstelle von latest, trennen Sie State von Containern durch Volumes und bauen Sie Images regelmäßig neu, um Sicherheitsupdates zu erhalten. Diese Grundlagen werden Ihnen dienen, egal ob Sie eine Entwicklungsumgebung betreiben oder eine einfache Frontend-Anwendung deployen.

FAQs

Ein Docker Image ist ein schreibgeschütztes Template, das Ihren Anwendungscode, Abhängigkeiten und Konfiguration enthält. Ein Container ist eine laufende Instanz dieses Images. Sie können mehrere Container aus demselben Image erstellen, die jeweils unabhängig mit eigenem isoliertem Dateisystem und Netzwerk laufen.

Das latest-Tag wird nicht automatisch auf die neueste Version aktualisiert. Es ist nur ein Standard-Tag, das Maintainer aktuell halten können oder auch nicht. Die Verwendung expliziter Versions-Tags wie node:20-alpine stellt reproduzierbare Builds sicher und verhindert unerwartete Breaking Changes, wenn Images aktualisiert werden.

Verwenden Sie Docker Volumes, um Daten außerhalb des Container-Dateisystems zu persistieren. Named Volumes speichern Daten an einem von Docker verwalteten Ort, während Bind-Mounts auf bestimmte Verzeichnisse auf Ihrem Host-Rechner verlinken. Verlassen Sie sich niemals auf das interne Dateisystem eines Containers für wichtige Daten.

Multi-Stage-Builds ermöglichen es Ihnen, ein Image zum Bauen Ihrer Anwendung und ein anderes, kleineres Image zum Ausführen zu verwenden. Dies hält Ihre Produktions-Images schlank, indem Build-Tools und Abhängigkeiten ausgeschlossen werden, was sowohl die Image-Größe als auch potenzielle Sicherheitsschwachstellen reduziert.

Gain control over your UX

See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay