Docker für Entwickler: Images, Container und Compose

DevOps2026-10-10TryQuickToolBox

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 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?

SzenarioVerwenden
Einzelner Containerdocker run
Mehrere Dienste (App + DB)Docker Compose
Produktions-OrchestrierungKubernetes, Swarm

Best Practices für Entwickler

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.