Docker und Containerization: Grundlegende Konzepte und Verwendung
Docker verpackt Anwendungen in Container für konsistente und portable Bereitstellung. Dieser Leitfaden behandelt Docker-Grundlagen, Dockerfile-Schreiben und Container-Management.
Aktualisiert:Was ist Docker?
Docker ist eine Plattform, die Anwendungen und ihre Abhängigkeiten in Container verpackt. Container sind leichtgewichtige, isolierte Laufzeitumgebungen.
VM vs Container: Virtuelle Maschinen führen ein vollständiges Betriebssystem aus (GBs). Container teilen den Host-OS-Kernel und belegen MBs.
Konsistenz: Löst das 'Funktioniert auf meinem Rechner'-Problem. Entwicklungs-, Test- und Produktionsumgebungen verwenden denselben Container.
Portabilität: Container laufen auf jeder Docker-unterstützten Plattform (Linux, Windows, Mac, Cloud).
Docker Kernkonzepte
Image: Vorlage für einen Container. Als Read-Only-Layer gespeichert. Aus Dockerfile gebaut.
Container: Laufende Instanz eines Images. Jeder Container läuft als isolierter Prozess.
Dockerfile: Textdatei, die definiert, wie ein Image gebaut wird. Enthält Anweisungen wie FROM, RUN, COPY, CMD.
Registry: Repository, das Images speichert und verteilt. Docker Hub ist die beliebteste öffentliche Registry.
Volume: Speicher zum persistenten Speichern von Container-Daten. Daten bleiben erhalten, auch wenn der Container gelöscht wird.
Dockerfile schreiben
FROM node:18-alpine: Node.js 18 (Alpine Linux) als Basis-Image verwenden. Alpine ist ein kleines Basis-Image.
WORKDIR /app: Arbeitsverzeichnis auf /app setzen. Alle nachfolgenden Befehle laufen in diesem Verzeichnis.
COPY package*.json ./: package.json und package-lock.json kopieren. Abhängigkeiten mit RUN npm install installieren.
COPY . .: Gesamten Quellcode kopieren. Production Build mit RUN npm run build erstellen.
EXPOSE 3000: Angeben, dass der Container auf Port 3000 lauscht. Befehl beim Container-Start mit CMD ["npm", "start"] definieren.
Grundlegende Docker-Befehle
docker build -t myapp:1.0 .: Image aus Dockerfile bauen. Image mit -t taggen (Name:Version).
docker run -p 3000:3000 myapp:1.0: Container ausführen. Host-Port mit -p auf Container-Port mappen.
docker ps: Laufende Container auflisten. docker ps -a: Alle Container auflisten (einschließlich gestoppter).
docker stop <container_id>: Container stoppen. docker rm <container_id>: Container entfernen.
docker images: Lokale Images auflisten. docker rmi <image_id>: Image entfernen.
Docker Compose
Docker Compose ist ein Werkzeug zum Definieren und Verwalten von Multi-Container-Anwendungen. Konfiguriert mit docker-compose.yml Datei.
Services: Jeder Service ist ein Container. Services wie web (Frontend), api (Backend), db (Datenbank) definieren.
Volumes: Volumes für Datenpersistenz definieren. networks: Netzwerke für Inter-Service-Kommunikation erstellen.
docker compose up: Alle Services starten. docker compose down: Alle Services stoppen und entfernen.
docker compose up -d: Im Hintergrund ausführen (detached mode). docker compose logs -f: Logs verfolgen.
Best Practices
Kleine Images: Alpine oder distroless Basis-Images verwenden. Build-Abhängigkeiten mit Multi-Stage Build aus finalem Image entfernen.
Layer Caching: Selten ändernde Layer (Abhängigkeiten) zuerst, häufig ändernde Layer (Code) später COPYen. Optimiert Build-Cache.
.dockerignore: Unnötige Dateien (node_modules, .git, logs) ignorieren. Reduziert Build-Context.
Security: Non-Root-User statt Root verwenden. Benutzer erstellen mit RUN adduser --disabled-password appuser.
Health Check: HEALTHCHECK Anweisung für Container-Gesundheitsprüfung verwenden. Docker startet unhealthy Container automatisch neu.