Docker und JavaScript: Containerisierung von Anwendungen auf Node.js — vollständiger Leitfaden
In der modernen Webentwicklung ist Containerisierung nicht nur ein Trend, sondern eine Notwendigkeit. Docker ermöglicht es, eine JavaScript-Anwendung zusammen mit allen Abhängigkeiten, Konfigurationen und der Laufzeitumgebung in einen isolierten Container zu packen, der garantiert auf jedem System gleich funktioniert – vom Entwickler-Laptop bis zum Produktionsserver. In diesem Artikel werden wir den Prozess der Containerisierung von Node.js-Anwendungen von Grund auf durchgehen, Best Practices und typische Anwendungsszenarien betrachten.
Grundlagen von Docker für JavaScript-Entwickler
Bevor wir in die Details eintauchen, lassen Sie uns die wichtigsten Docker-Konzepte in Bezug auf das JavaScript-Ökosystem klären.
- Image — eine unveränderliche Vorlage, die Code, die Node.js-Laufzeitumgebung, Abhängigkeiten (node_modules) und Konfigurationen enthält. Images werden in einer Registry (z. B. Docker Hub) gespeichert.
- Container — eine ausgeführte Instanz eines Images. Jeder Container ist von anderen und vom Host-System isoliert.
- Dockerfile — die Anleitung zum Erstellen des Images. Für Node.js-Anwendungen ist dies die Hauptdatei, die wir erstellen werden.
- docker-compose — ein Werkzeug zum Definieren und Ausführen von Multi-Container-Anwendungen (z. B. Node.js + MongoDB + Redis).
Erstellen eines Dockerfiles für eine Node.js-Anwendung
Beginnen wir mit einer einfachen Express-Anwendung. Erstellen wir eine Datei Dockerfile im Stammverzeichnis des Projekts:
# Basis-Image Node.js 18 (Alpine — schlanke Version)FROM node:18-alpine
# Arbeitsverzeichnis im Container erstellenWORKDIR /usr/src/app
# package.json und package-lock.json (falls vorhanden) kopierenCOPY package*.json ./
# Produktionsabhängigkeiten installierenRUN npm ci --only=production
# Quellcode der Anwendung kopierenCOPY . .
# Port freigeben, den die Anwendung verwendetEXPOSE 3000
# Befehl zum Starten der AnwendungCMD ["node", "src/index.js"]Wichtige Nuancen für JavaScript-Projekte:
- Die Reihenfolge der Anweisungen ist wichtig. Das Kopieren von package.json vor dem Code ermöglicht es Docker, die Schicht mit der Installation der Abhängigkeiten zwischenzuspeichern. Wenn Sie nur den Code ändern, werden die Abhängigkeiten nicht neu installiert – das beschleunigt den Build.
- Verwenden Sie
npm cianstelle vonnpm install– das ist schneller und stellt sicher, dass die Versionen der Abhängigkeiten mit der Lock-Datei übereinstimmen. - Die Alpine-Version des Node.js-Images (~120 MB statt ~900 MB) reduziert die Größe des endgültigen Images erheblich.
Arbeiten mit docker-compose: Node.js mit einer Datenbank verbinden
Reale Anwendungen kommen selten mit einem einzigen Container aus. Mit docker-compose.yml können Sie Node.js, MongoDB und z. B. Redis mit einem Befehl starten:
version: '3.8'services: app: build: . ports: - "3000:3000" environment: - NODE_ENV=production - MONGODB_URI=mongodb://mongo:27017/myapp - REDIS_URL=redis://redis:6379 depends_on: - mongo - redis volumes: - ./logs:/usr/src/app/logs
mongo: image: mongo:6 volumes: - mongo_data:/data/db ports: - "27017:27017"
redis: image: redis:7-alpine ports: - "6379:6379"
volumes: mongo_data:Wie es funktioniert:
- Der Dienst
appwird aus unserem Dockerfile erstellt. - Die Dienste
mongoundredisverwenden vorgefertigte Images aus Docker Hub. - Die Umgebungsvariablen
MONGODB_URIundREDIS_URLwerden an die Anwendung übergeben – beachten Sie, dass wir die Dienstnamen als Hostnamen verwenden (Docker DNS löst sie automatisch in die IP-Adressen der Container auf). - Das Volume
mongo_d