Docker für Entwickler: Images, Container und Compose
Sie haben wahrscheinlich schon von Docker gehört und wie es Ihren Entwicklungsworkflow vereinfachen kann. Aber wenn Sie zum ersten Mal auf Begriffe wie Images, Container und Docker Compose stoßen, kann das überwältigend wirken. Dieser Leitfaden bringt Klarheit und zeigt Ihnen genau, wie Sie Docker effektiv in Ihren Projekten einsetzen.
Was ist Docker und warum sollten Sie sich dafür interessieren?
Docker ist eine Plattform, die Ihre Anwendung und ihre Abhängigkeiten in eine standardisierte Einheit namens Container verpackt. Container sind leichtgewichtig, portabel und voneinander isoliert. Sie lösen das klassische Problem „Es funktioniert auf meiner Maschine“, indem sie sicherstellen, dass Ihre App überall gleich läuft.
Im Gegensatz zu virtuellen Maschinen teilen Container den Kernel des Host-Betriebssystems, was sie schneller starten und effizienter macht. Deshalb ist Docker zu einem festen Bestandteil moderner Entwicklungs- und Deployment-Pipelines geworden.
Images vs. Container: Die Bausteine
Ein Image ist eine schreibgeschützte Vorlage, die Ihren Anwendungscode, die Laufzeitumgebung, Bibliotheken und Einstellungen enthält. Ein Container ist eine laufende Instanz eines Images. Stellen Sie sich ein Image als Klasse und einen Container als Objekt vor.
Sie erstellen Images mit einem Dockerfile. Hier ist ein einfaches Beispiel 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 Zeile im Dockerfile erzeugt eine Ebene. Ebenen werden zwischengespeichert, sodass Neuerstellungen schneller sind, wenn sich nur spätere Schritte ändern.
Häufige Docker-Befehle
docker build -t my-app .— ein Image aus dem aktuellen Verzeichnis erstellendocker run -p 3000:3000 my-app— einen Container ausführen und Ports zuordnendocker ps— laufende Container auflistendocker stop <container_id>— einen Container stoppendocker rmi <image_id>— ein Image entfernen
Docker Compose: Verwaltung von Multi-Container-Apps
Reale Apps benötigen oft mehr als einen Dienst: einen Webserver, eine Datenbank, einen Cache. Mit Docker Compose können Sie Multi-Container-Anwendungen mit einer einzigen YAML-Datei definieren und ausführen.
Hier ist eine docker-compose.yml für eine Node.js-App mit PostgreSQL und Redis:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
cache:
image: redis:7
volumes:
pgdata:
Führen Sie docker compose up aus und alle Dienste starten zusammen. Das depends_on stellt sicher, dass Datenbank und Cache vor dem Web-Service starten.
Wichtige Compose-Befehle
docker compose up -d— alle Dienste im Hintergrund startendocker compose down— Container und Netzwerke stoppen und entfernendocker compose logs -f web— Logs eines bestimmten Dienstes verfolgendocker compose exec web sh— eine Shell in einem laufenden Container öffnen
Best Practices für die Entwicklung
- Verwenden Sie .dockerignore, um node_modules, .git und andere unnötige Dateien aus dem Build-Kontext auszuschließen.
- Halten Sie Images klein, indem Sie Alpine-basierte Images und Multi-Stage-Builds verwenden.
- Nicht als root ausführen — erstellen Sie aus Sicherheitsgründen einen Nicht-root-Benutzer in Ihrem Dockerfile.
- Verwenden Sie Volumes für persistente Daten und Bind Mounts für Live-Code-Neuladen während der Entwicklung.
- Versionen festnageln in Ihrem Dockerfile und Compose-File, um unerwartete Updates zu vermeiden.
Wann Docker verwenden (und wann nicht)
Docker glänzt, wenn Sie konsistente Umgebungen über Teams hinweg, einfache Abhängigkeitsverwaltung oder Microservices benötigen. Für einfache statische Websites oder Skripte könnte es übertrieben sein. Bewerten Sie basierend auf der Komplexität Ihres Projekts und den Deployment-Anforderungen.
FAQ
Was ist der Unterschied zwischen einem Image und einem Container?
Ein Image ist eine statische Vorlage; ein Container ist eine laufende Instanz dieses Images. Sie können mehrere Container aus demselben Image ausführen.
Brauche ich Docker Compose für einen einzelnen Container?
Nein, für einen einzelnen Container können Sie docker run verwenden. Compose ist nützlich, wenn Sie mehrere Dienste haben, die kommunizieren müssen.
Wie persistiere ich Daten in Docker?
Verwenden Sie Volumes oder Bind Mounts. Volumes werden von Docker verwaltet und sind ideal für Datenbanken; Bind Mounts mappen ein Host-Verzeichnis in den Container, nützlich für die Entwicklung.
Bereit, Ihre Docker-basierten Apps zu optimieren? Wenn Sie mit Nginx-Logs in Containern arbeiten, probieren Sie unseren Nginx Log Analyzer, um Logs schnell zu parsen und zu analysieren.