Docker für Entwickler: Images, Container und Compose
Du bist Entwickler und hast von Docker gehört. Vielleicht hast du es schon ausprobiert, aber die Konzepte von Images, Containern und Compose fühlen sich noch verschwommen an. Oder du hast genug von „Bei mir läuft's" und möchtest eine konsistente Umgebung. Dieser Leitfaden bringt Klarheit und vermittelt dir ein praktisches Verständnis der Docker-Kernkomponenten und wie du sie effektiv einsetzt.
Warum Docker für Entwickler?
Docker löst Inkonsistenzen in der Umgebung. Statt Abhängigkeiten direkt auf deinem Rechner zu installieren, packst du deine App und ihre Abhängigkeiten in einen Container. Container laufen überall gleich: auf deinem Laptop, dem deines Kollegen und in der Produktion. Das eliminiert Setup-Abweichungen und macht das Onboarding trivial.
Images: Die Blaupause
Ein Image ist eine schreibgeschützte Vorlage. Es enthält deinen Anwendungscode, die Laufzeitumgebung, Bibliotheken und Umgebungsvariablen. Du baust Images aus einem Dockerfile, einer Textdatei mit Anweisungen.
Hier ist ein einfaches Dockerfile für eine Node.js-App:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Jede Anweisung erzeugt eine Ebene (Layer). Layer werden zwischengespeichert, sodass Neuerstellungen schnell sind, wenn sich nur der Code ändert. Images werden in Registries wie Docker Hub oder einer privaten Registry gespeichert.
Container: Die laufende Instanz
Ein Container ist eine lauffähige Instanz eines Images. Er ist isoliert, teilt sich aber den Kernel des Host-Betriebssystems, was ihn leichtgewichtig macht. Du startest einen Container mit docker run.
docker run -p 3000:3000 -d my-app
Dies bildet Port 3000 auf dem Host auf Port 3000 im Container ab und führt ihn im Hintergrund aus. Container sind flüchtig: Änderungen gehen verloren, wenn sie entfernt werden, es sei denn, du verwendest Volumes.
Wichtige Befehle:
docker ps– laufende Container auflistendocker stop <container>– einen Container stoppendocker rm <container>– einen Container entfernendocker images– Images auflistendocker rmi <image>– ein Image entfernen
Docker Compose: Multi-Container-Apps
Echte Apps benötigen oft mehrere Dienste: einen Webserver, eine Datenbank, einen Cache. Docker Compose ermöglicht es dir, Multi-Container-Anwendungen mit einer einzigen YAML-Datei zu definieren und auszuführen.
Hier ist eine docker-compose.yml für eine Node.js-App mit PostgreSQL:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Führe docker compose up aus, um beide Dienste zu starten. Compose kümmert sich um das Netzwerk, sodass web db über den Dienstnamen erreichen kann.
Wann Docker Compose vs. reines Docker verwenden?
| Szenario | Verwenden |
|---|---|
| Einzelner Container | docker run |
| Mehrere Dienste (App + DB) | Docker Compose |
| Produktions-Orchestrierung | Kubernetes, Swarm |
Best Practices für Entwickler
- Verwende .dockerignore, um node_modules, .git usw. auszuschließen und Builds zu beschleunigen.
- Multi-Stage-Builds, um finale Images klein zu halten.
- Versionen pinnen in FROM-Anweisungen für Reproduzierbarkeit.
- Nicht als root ausführen in Produktions-Containern.
- Volumes verwenden für persistente Daten und für Live-Code-Neuladen während der Entwicklung.
Häufige Fallstricke
Portkonflikte: Wenn Port 3000 belegt ist, mappe auf einen anderen Host-Port: -p 3001:3000.
Datenverlust: Ohne Volumes verschwinden Datenbankdaten, wenn der Container entfernt wird.
Langsame Builds: Ordne die Dockerfile-Anweisungen von am seltensten zu am häufigsten geändert an, um den Cache zu nutzen.
FAQ
Was ist der Unterschied zwischen einem Image und einem Container?
Ein Image ist eine schreibgeschützte Vorlage; ein Container ist eine laufende Instanz dieses Images. Du kannst mehrere Container aus demselben Image ausführen.
Brauche ich Docker Compose für einen einzelnen Dienst?
Nein. Compose glänzt, wenn du mehrere Dienste hast. Für einen einzelnen Container ist docker run einfacher.
Wie speichere ich Daten in Docker dauerhaft?
Verwende Volumes. Definiere ein benanntes Volume in Compose oder verwende -v mit docker run, um ein Host-Verzeichnis oder ein benanntes Volume einzubinden.
Bereit, deinen Docker-Workflow zu optimieren? Schau dir unseren JSON Formatter an, um JSON-Konfigurationsdateien wie docker-compose.yml oder package.json schnell zu validieren und zu formatieren.