Docker Images und Container¶
Kurzüberblick¶
Docker ist eine Containerplattform, mit der Anwendungen zusammen mit allen benötigten Abhängigkeiten in Container verpackt werden können.
Das Grundprinzip besteht aus zwei zentralen Bausteinen:
| Begriff | Bedeutung |
|---|---|
| Docker Image | Eine unveränderliche Vorlage (Blueprint) für Container |
| Docker Container | Eine laufende Instanz eines Images |
Damit können Anwendungen identisch auf verschiedenen Systemen ausgeführt werden – unabhängig von Betriebssystem, Infrastruktur oder Umgebung.
Docker Images¶
Ein Docker Image ist eine read-only Vorlage, die alles enthält, was eine Anwendung zum Start benötigt:
- Anwendungscode
- Runtime (z. B. Java, Node, Python)
- Systembibliotheken
- Konfiguration
- Tools
Images sind unveränderlich (immutable).
Wenn sich etwas ändern soll, wird ein neues Image gebaut.
Aufbau eines Images¶
Images bestehen aus Layern.
Jeder Schritt im Buildprozess erzeugt einen neuen Layer.
graph TD
A[Base Image: Linux] --> B[Install Runtime]
B --> C[Install Dependencies]
C --> D[Add Application Code]
D --> E[Final Docker Image]
Vorteile dieses Layer-Prinzips:
- schneller Download (Layer werden wiederverwendet)
- effizientes Caching beim Build
- kleine Updates möglich
Dockerfile – Bauplan eines Images¶
Ein Dockerfile beschreibt, wie ein Image erstellt wird.
Beispiel:
FROM node:20-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
CMD ["node", "server.js"]
Erklärung:
| Befehl | Bedeutung |
|---|---|
FROM |
Basis-Image |
WORKDIR |
Arbeitsverzeichnis |
COPY |
Dateien in das Image kopieren |
RUN |
Befehle während des Builds ausführen |
CMD |
Standardstartbefehl des Containers |
Docker Container¶
Ein Docker Container ist eine laufende Instanz eines Images.
Eigenschaften:
- isolierte Umgebung
- eigenes Dateisystem
- eigene Prozesse
- eigene Netzwerkkonfiguration
Der Container nutzt jedoch den Kernel des Host-Betriebssystems.
graph TD
A[Host Betriebssystem] --> B[Docker Engine]
B --> C[Container 1]
B --> D[Container 2]
B --> E[Container 3]
C --> F[App + Dependencies]
D --> G[App + Dependencies]
E --> H[App + Dependencies]
Dadurch sind Container:
- leichtgewichtig
- schnell startbar
- ressourcensparend
Im Gegensatz zu virtuellen Maschinen, die ein vollständiges Betriebssystem enthalten.
Docker Registry¶
Docker Images werden typischerweise in einer Registry gespeichert.
Bekannte Registries:
| Registry | Beschreibung |
|---|---|
| Docker Hub | öffentliche Standard-Registry |
| GitHub Container Registry | Integration mit GitHub |
| GitLab Registry | Integration mit GitLab |
| Private Registry | interne Unternehmenslösungen |
Workflow:
graph LR
A[Dockerfile] --> B[docker build]
B --> C[Docker Image]
C --> D[docker push]
D --> E[Docker Registry]
E --> F[docker pull]
F --> G[Container Start]
Image-Varianten: Größe vs. Komfort¶
Viele Images existieren in verschiedenen Varianten.
Grundprinzip:
Je kleiner das Image → desto weniger Tools sind enthalten.
| Variante | Eigenschaften | Typischer Use Case |
|---|---|---|
| Full Version | vollständige Linux-Distribution | Entwicklung |
| Slim | reduzierte Pakete | Produktionscontainer |
| Alpine | extrem kleines Linux | Microservices |
Full Version¶
Beispiel:
python:3.12
Eigenschaften:
- viele Tools vorinstalliert
- einfacher zu debuggen
- größer (mehrere hundert MB)
Use Case:
- Entwicklung
- Debugging
- komplexe Builds
Slim Version¶
Beispiel:
python:3.12-slim
Eigenschaften:
- weniger Systempakete
- kleiner als Full-Version
- schneller Download
Use Case:
- Produktionscontainer
- Standard-Deployment
Alpine Version¶
Beispiel:
python:3.12-alpine
Eigenschaften:
- basiert auf Alpine Linux
- sehr klein (oft < 50 MB)
- minimale Tools
Use Case:
- Microservices
- Cloud Deployments
- CI/CD Pipelines
Nachteil:
- weniger kompatible Libraries
- manchmal komplizierter zu debuggen
Wichtige Docker Container Befehle¶
Image bauen¶
docker build -t myapp .
-t→ Image tag/name vergeben.→ aktuelles Verzeichnis als Build-Kontext
Container starten¶
docker run -d -p 8080:80 --name webserver nginx
Bedeutung:
| Teil | Erklärung |
|---|---|
docker run |
Container starten |
-d |
detached mode (Hintergrund) |
-p 8080:80 |
Portweiterleitung |
--name webserver |
Containername |
nginx |
verwendetes Image |
Laufende Container anzeigen¶
docker ps
Alle Container (auch gestoppte):
docker ps -a
Container stoppen¶
docker stop <container_id>
Container löschen¶
docker rm <container_id>
Image löschen¶
docker rmi <image_name>
Logs eines Containers anzeigen¶
docker logs <container_id>
Beispiel:
docker logs webserver
Befehl im Container ausführen¶
docker exec -it <container_id> bash
Parameter:
| Flag | Bedeutung |
|---|---|
-i |
interaktiver Modus |
-t |
Terminal (TTY) |
bash |
gestartete Shell |
Wichtige Flags bei docker run¶
| Flag | Bedeutung |
|---|---|
-t |
Pseudo-Terminal (TTY) |
-i |
Interaktiver Modus |
-d |
Detached Mode (Hintergrund) |
--name |
Containername vergeben |
-p |
Port Mapping (Host:Container) |
Beispiel:
docker run -it --name testcontainer ubuntu bash
Startet einen interaktiven Ubuntu-Container mit Shell.
Dateien zwischen Host und Container kopieren¶
Docker erlaubt es, Dateien zwischen dem Host-System und einem Container zu kopieren.
Datei vom Host in den Container kopieren¶
docker cp <local_path> <container_id>:<container_path>
Beispiel:
docker cp ./config.json myapp_container:/app/config.json
Erklärung:
| Teil | Bedeutung |
|---|---|
./config.json |
lokale Datei |
myapp_container |
Zielcontainer |
/app/config.json |
Zielpfad im Container |
Datei aus dem Container auf den Host kopieren¶
docker cp <container_id>:<container_path> <local_path>
Beispiel:
docker cp myapp_container:/app/logs.txt ./logs.txt
Erklärung:
| Teil | Bedeutung |
|---|---|
myapp_container |
Container |
/app/logs.txt |
Datei im Container |
./logs.txt |
Ziel auf dem Host |
Praktisches Beispiel¶
Schritt 1 – Image bauen¶
docker build -t myapp .
Schritt 2 – Container starten¶
docker run -d -p 3000:3000 myapp
Schritt 3 – Logs ansehen¶
docker logs <container_id>
Prüfungsrelevanz (IHK)¶
Typische Prüfungsfragen:
Unterschied Image vs Container¶
| Image | Container |
|---|---|
| Vorlage | laufende Instanz |
| unveränderlich | veränderlich |
| wird gebaut | wird gestartet |
Warum Docker verwenden?¶
- reproduzierbare Umgebung
- Portabilität
- schnelle Deploymentzeiten
- Isolation von Anwendungen
- effiziente Ressourcennutzung
Häufige Missverständnisse¶
Docker ist keine virtuelle Maschine¶
Docker nutzt keine vollständige VM, sondern:
- shared OS Kernel
- Namespaces zur Prozessisolierung
- cgroups zur Ressourcenverwaltung
Dadurch sind Container viel leichter als virtuelle Maschinen.
Container sind nicht dauerhaft¶
Standardmäßig sind Container ephemeral.
Das bedeutet:
- Container gelöscht → Daten verschwinden
Persistente Daten werden über Docker Volumes oder Bind Mounts gespeichert.
Merksatz¶
Image = Bauplan
Container = laufende Instanz des Bauplans
Oder:
Images werden gebaut – Container werden gestartet.