Docker für Entwickler: Images, Container und Compose
Als Entwickler hast du wahrscheinlich schon die Frustration von Umgebungsinkonsistenzen erlebt: "Bei mir läuft es!" Docker löst dieses Problem, indem es Anwendungen in Container verpackt. Dieser Leitfaden erklärt Docker Images, Container und Compose, damit du Anwendungen konsistent erstellen, ausliefern und ausführen kannst.
Was ist Docker?
Docker ist eine Plattform zum Entwickeln, Ausliefern und Ausführen von Anwendungen in Containern. Container sind leichte, eigenständige, ausführbare Pakete, die alles enthalten, was zum Ausführen von Software benötigt wird: Code, Runtime, Systemtools, Bibliotheken und Einstellungen.
Images vs. Container
Ein Image ist eine schreibgeschützte Vorlage mit Anweisungen zum Erstellen eines Containers. Ein Container ist eine ausführbare Instanz eines Images. Du kannst mehrere Container aus demselben Image erstellen, jeder isoliert von den anderen.
Arbeiten mit Images
Images werden aus einem Dockerfile erstellt, einer Textdatei mit Anweisungen. Hier ist ein einfaches Node.js-Beispiel:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Erstelle das Image mit:
docker build -t my-app .
Images auflisten: docker images
Container ausführen
Starte einen Container aus einem Image:
docker run -d -p 3000:3000 --name my-container my-app
Dies führt den Container im Detached-Modus (-d) aus, mappt Port 3000 und benennt ihn my-container.
Laufende Container auflisten: docker ps
Container stoppen: docker stop my-container
Container entfernen: docker rm my-container
Warum Docker Compose verwenden?
Wenn deine Anwendung von mehreren Diensten abhängt (Datenbank, Cache usw.), wird die Verwaltung einzelner Container mühsam. Docker Compose ermöglicht es dir, Multi-Container-Anwendungen mithilfe einer YAML-Datei zu definieren und auszuführen.
Beispiel für eine Compose-Datei
Erstelle docker-compose.yml:
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:
Alle Dienste starten: docker compose up -d
Stoppen und entfernen: docker compose down
Best Practices für Entwickler
- Verwende .dockerignore: Schließe unnötige Dateien (node_modules, .git) aus, um Builds zu beschleunigen.
- Multi-Stage-Builds: Halte Produktions-Images klein, indem du Build- und Runtime-Phasen trennst.
- Nutze Caching: Ordne Dockerfile-Anweisungen von am wenigsten zu am häufigsten geänderten.
- Tagge Images richtig: Vermeide
latestin der Produktion; verwende semantische Versionierung. - Scanne auf Schwachstellen: Verwende
docker scan, um Images auf bekannte Probleme zu prüfen.
Übersicht der gängigen Befehle
| Befehl | Beschreibung |
|---|---|
docker build -t name . | Image aus Dockerfile erstellen |
docker run -p host:container image | Container ausführen und Ports mappen |
docker ps -a | Alle Container auflisten |
docker exec -it container bash | Eine Shell in einem laufenden Container öffnen |
docker compose up | Dienste aus der Compose-Datei starten |
docker compose logs -f | Logs aller Dienste verfolgen |
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. Du kannst viele Container aus einem Image erstellen.
Wann sollte ich Docker Compose verwenden?
Verwende Compose, wenn deine Anwendung mehrere Dienste erfordert (z. B. Webserver, Datenbank, Cache), die zusammen ausgeführt werden müssen. Es vereinfacht die Orchestrierung für Entwicklung und Tests.
Wie persistiere ich Daten in Docker?
Verwende Volumes oder Bind Mounts. Volumes werden von Docker verwaltet und in einem dedizierten Bereich gespeichert; Bind Mounts verlinken auf ein Host-Verzeichnis. Beide überleben Container-Neustarts.
Bereit, deinen Docker-Workflow zu optimieren? Probiere unseren Nginx Log Analyzer, um Container-Logs schnell zu debuggen.