Docker für Entwickler: Images, Container und Compose
Sie haben wahrscheinlich schon von Docker gehört und davon, wie es Ihren Entwicklungs-Workflow vereinfachen kann. Aber wenn Sie neu bei Containern sind, können die Terminologie und die Befehle überwältigend sein. Dieser Leitfaden bringt Klarheit und vermittelt Ihnen ein praktisches Verständnis von Docker-Images, Containern und Compose – damit Sie sie noch heute effektiv einsetzen können.
Was ist Docker und warum sollten Sie sich darum kümmern?
Docker ist eine Plattform, die Ihre Anwendung und ihre Abhängigkeiten in eine standardisierte Einheit verpackt, die als Container bezeichnet wird. Container sind leichtgewichtig, portabel und voneinander isoliert, was bedeutet, dass Sie Ihre App konsistent auf Ihrem Laptop, dem Rechner eines Kollegen oder einem Produktionsserver ausführen können.
Der entscheidende Vorteil? „Es funktioniert auf meinem Rechner" gehört der Vergangenheit an. Docker stellt sicher, dass die Umgebung, in der Ihr Code läuft, überall identisch ist.
Images vs. Container: Die Bausteine
Bevor Sie beginnen, müssen Sie den Unterschied zwischen einem Image und einem Container verstehen.
- Image: Eine schreibgeschützte Vorlage, die Ihren Anwendungscode, die Laufzeitumgebung, Bibliotheken und Abhängigkeiten enthält. Betrachten Sie es als Snapshot oder Bauplan.
- Container: Eine ausführbare Instanz eines Images. Sie können Container starten, stoppen, verschieben und löschen. Mehrere Container können aus demselben Image ausgeführt werden.
Kurz gesagt: Ein Image ist das Rezept, und ein Container ist das Gericht, das Sie daraus kochen.
Wesentliche Docker-Befehle für Entwickler
Hier sind die Befehle, die Sie am häufigsten verwenden werden:
docker pull <image>– Ein Image aus einer Registry wie Docker Hub herunterladen.docker images– Alle lokalen Images auflisten.docker run <image>– Einen Container aus einem Image erstellen und starten.docker ps– Laufende Container auflisten. Fügen Sie-ahinzu, um alle Container anzuzeigen, einschließlich gestoppter.docker stop <container>– Einen laufenden Container ordnungsgemäß stoppen.docker rm <container>– Einen gestoppten Container entfernen.docker rmi <image>– Ein Image entfernen.docker exec -it <container> bash– Eine interaktive Shell in einem laufenden Container öffnen.
Um beispielsweise einen einfachen Nginx-Webserver auszuführen:
docker run -d -p 8080:80 nginx
Dies lädt das nginx-Image herunter (falls nicht bereits vorhanden), startet einen Container im Detached-Modus (-d) und mappt Port 8080 auf Ihrem Host auf Port 80 im Container (-p 8080:80).
Erstellen Sie Ihr eigenes Image mit einem Dockerfile
Um Ihre Anwendung zu verpacken, erstellen Sie ein Dockerfile – eine Textdatei mit Anweisungen. Hier ist ein einfaches Beispiel für eine Node.js-App:
# Use an official Node.js runtime as a parent image
FROM node:18-alpine
# Set the working directory
WORKDIR /usr/src/app
# Copy package.json and install dependencies
COPY package*.json ./
RUN npm install
# Copy the rest of the application code
COPY . .
# Expose the port the app runs on
EXPOSE 3000
# Define the command to run the app
CMD ["node", "app.js"]
Erstellen Sie das Image mit:
docker build -t my-node-app .
Dann führen Sie es aus:
docker run -p 3000:3000 my-node-app
Vereinfachen Sie Multi-Container-Apps mit Docker Compose
Reale Anwendungen benötigen oft mehrere Dienste: einen Webserver, eine Datenbank, einen Cache usw. Sie einzeln mit docker run zu verwalten, wird mühsam. Docker Compose ermöglicht es Ihnen, Multi-Container-Anwendungen mithilfe einer YAML-Datei zu definieren und auszuführen.
Erstellen Sie eine docker-compose.yml-Datei:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Dann starten Sie alles mit:
docker compose up -d
Compose übernimmt Netzwerk, Volumes und Abhängigkeiten für Sie. Um Container, Netzwerke und Volumes zu stoppen und zu entfernen, führen Sie docker compose down aus.
Best Practices für Docker in der Entwicklung
- Verwenden Sie .dockerignore: Schließen Sie unnötige Dateien (wie
node_modules) aus dem Build-Kontext aus, um Builds zu beschleunigen. - Nutzen Sie Multi-Stage-Builds: Halten Sie Ihr finales Image klein, indem Sie Build-Time-Abhängigkeiten von der Laufzeit trennen.
- Pinnen Sie Versionen: Geben Sie exakte Image-Tags an (z. B.
node:18.16.0-alpine) für Reproduzierbarkeit. - Als Nicht-Root ausführen: Erstellen Sie einen Benutzer in Ihrem Dockerfile und wechseln Sie mit
USERzu diesem, um die Sicherheit zu verbessern. - Verwenden Sie Volumes für persistente Daten: Datenbanken und andere zustandsbehaftete Dienste sollten Daten in Volumes speichern, nicht im Container.
Häufige Fallstricke und wie man sie vermeidet
- Aufgeblähte Images: Beginnen Sie mit einem minimalen Basis-Image (wie Alpine) und bereinigen Sie Paket-Caches.
- Portkonflikte: Stellen Sie sicher, dass Host-Ports nicht bereits belegt sind. Verwenden Sie
docker pszur Überprüfung. - Logs ignorieren: Verwenden Sie
docker logs <container>, um Probleme zu debuggen. - Compose nicht für die lokale Entwicklung nutzen: Auch einfache Apps profitieren von Compose's deklarativer Einrichtung.
FAQ
Was ist der Unterschied zwischen einem Docker-Image und einem Container?
Ein Image ist eine schreibgeschützte Vorlage, die die Anwendung und ihre Umgebung definiert. Ein Container ist eine laufende Instanz dieses Images. Sie können viele Container aus einem einzigen Image erstellen.
Brauche ich Docker Compose für eine Single-Container-App?
Nicht unbedingt. Für einfache Apps reicht docker run aus. Compose erleichtert jedoch die Verwaltung von Umgebungsvariablen, Volumes und Netzwerken, selbst für einen Dienst, und vereinfacht später die Skalierung.
Wie persistiere ich Daten in Docker?
Verwenden Sie Volumes. Volumes werden außerhalb des Dateisystems des Containers gespeichert und bleiben auch erhalten, wenn der Container gelöscht wird. Definieren Sie in Compose ein Volume und mounten Sie es an einen Pfad im Container (z. B. volumes: - mydata:/var/lib/data).
Bereit, Ihren Docker-Workflow zu optimieren? Wenn Sie Container-Logs analysieren müssen, probieren Sie unseren Nginx Log Analyzer aus, um Log-Daten schnell zu parsen und zu visualisieren – perfekt zum Debuggen von containerisierten Webservern.