Aufbau und Verwaltung von Docker-Images

Docker hat sich in den letzten Jahren als eine der beliebtesten Technologien zur Containerisierung etabliert. Es vereinfacht die Bereitstellung, Skalierung und Verteilung von Anwendungen drastisch. Doch im Zentrum der Docker-Welt steht ein zentrales Konzept: das Docker-Image.

In diesem Blogpost schauen wir uns an, wie Docker-Images aufgebaut sind, wie man sie effizient erstellt, verwaltet und in der Praxis einsetzt. Perfekt für Entwickler:innen, DevOps oder alle, die Containerisierung verstehen und meistern wollen.

Aufbau und Verwaltung von Docker-Images

🔍 Was ist ein Docker-Image?

Ein Docker-Image ist eine schreibgeschützte Vorlage, die alle notwendigen Informationen enthält, um einen Container zu erstellen und auszuführen. Man kann sich ein Image als Schnappschuss einer Anwendung inklusive Betriebssystembestandteilen, Programmbibliotheken, Konfigurationen und dem Anwendungscode vorstellen.

Ein Image ist wie ein Rezept, aus dem beliebig viele Container (Gerichte) zubereitet werden können.


🧱 Aufbau eines Docker-Images

Ein Docker-Image besteht aus mehreren Schichten (Layers). Diese Layer sind übereinander gestapelt und basieren aufeinander. Jede Schicht stellt eine Änderung dar – beispielsweise das Installieren eines Pakets oder das Kopieren einer Datei.

Hier ein Beispiel für die Layer-Struktur eines Images:

FROM ubuntu:20.04        # Basis-Image
RUN apt update           # 1. Layer: Paketliste aktualisieren
RUN apt install -y curl  # 2. Layer: curl installieren
COPY . /app              # 3. Layer: Projektdateien kopieren
CMD ["./app/start.sh"]   # 4. Layer: Startbefehl

Jede Anweisung im Dockerfile erzeugt einen neuen Layer. Vorteil: Docker cached diese Layer, sodass bei Änderungen nicht das komplette Image neu gebaut werden muss. Das spart Zeit und Ressourcen.


🛠 Dockerfile: Das Herzstück eines Docker-Images

Ein Dockerfile ist eine Textdatei mit Befehlen, die definieren, wie das Docker-Image aufgebaut wird.

Beispiel: Einfaches Node.js-Image

# Basis-Image
FROM node:18

# Arbeitsverzeichnis im Container
WORKDIR /usr/src/app

# Abhängigkeiten kopieren und installieren
COPY package*.json ./
RUN npm install

# Anwendungsdateien kopieren
COPY . .

# Container-Port freigeben
EXPOSE 3000

# Startbefehl
CMD ["node", "index.js"]

Wichtige Dockerfile-Anweisungen:

BefehlFunktion
FROMBasis-Image definieren
RUNBefehl zur Image-Erstellung ausführen
COPYDateien vom Host ins Image kopieren
WORKDIRArbeitsverzeichnis im Container setzen
EXPOSEPort für Kommunikation öffnen
CMDStandardstartbefehl beim Containerstart

🧪 Image bauen: docker build

Sobald du ein Dockerfile hast, kannst du dein Image mit folgendem Befehl bauen:

docker build -t mein-app-image .

Parameter-Erklärung:

  • -t mein-app-image: Gibt dem Image einen Namen.
  • .: Pfad zum Kontext (normalerweise das Verzeichnis mit dem Dockerfile).

Image überprüfen:

docker images

🔁 Image aktualisieren

Wenn sich deine App ändert, musst du das Image neu bauen:

docker build -t mein-app-image:v2 .

Versioniere deine Images mit Tags (:v1, :v2, :latest), um den Überblick zu behalten.


☁️ Docker-Images teilen

Du kannst Images über die Docker Registry (z. B. Docker Hub) mit anderen teilen:

1. Bei Docker Hub anmelden:

https://hub.docker.com

2. Image taggen:

docker tag mein-app-image benutzername/mein-app:latest

Image hochladen:

docker push benutzername/mein-app:latest

🧹 Docker-Image verwalten

Mit der Zeit sammeln sich viele Images an. Hier ein paar praktische Befehle zur Verwaltung:

Auflisten aller lokalen Images:

docker images

Entfernen eines Images:

docker rmi image_id

Unbenutzte Images löschen:

docker image prune

Optional mit -a um alle ungenutzten Images zu löschen:

docker image prune -a

🏗 Best Practices für den Aufbau von Docker-Images

  • Minimale Basis-Images verwenden (z. B. alpine) → kleinere Images, weniger Angriffsfläche.
  • Multistage Builds nutzen → trennt Build- und Runtime-Umgebung.
  • Layer effizient strukturieren → selten veränderliche Befehle zuerst.
  • Keine Secrets ins Image einbauen → keine .env, API-Keys o. Ä. im Dockerfile.
  • Regelmäßig bereinigenrm -rf, apt clean, etc.

Beispiel für ein Multistage Build:

# Build-Stage
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

# Production-Stage
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html

📦 Fazit

Docker-Images sind das Fundament für portable, wiederholbare und skalierbare Anwendungen. Ein gutes Verständnis über ihren Aufbau und ihre Verwaltung ist essenziell für jede Person, die mit Containern arbeitet.

Mit den richtigen Werkzeugen und etwas Disziplin kann man nicht nur saubere und sichere Images bauen, sondern auch den gesamten Entwicklungs- und Deployment-Prozess deutlich effizienter gestalten.

Links

Docker Hub

Docker Container

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert