Skip to main content

Neun Profi-Tipps für Docker für Node.js-Entwickler

Artikel von
blog feature snyk container custom base recommendations

11. April 2024

0 Min. Lesezeit
9 Docker Pro Tips that will LEVEL UP your Skills

Wenn Sie viel Zeit auf der Kommandozeile verbringen und lokal mit Docker-Images und -Containern arbeiten, um sie zu erstellen und zu testen, sind Sie vielleicht an einigen Docker-Befehlen für Fortgeschrittene interessiert.

Wir überspringen die Grundlagen und widmen uns direkt den weniger bekannten, aber äußerst effektiven Befehlen, mit denen Sie Ihre Docker-Erfahrung deutlich verbessern können.

Machen Sie sich Gedanken um die Sicherheit Ihrer Docker-Container? Bevor wir uns mit den Details der Docker-Befehle befassen, sollten wir die Bedeutung der Container-Sicherheit hervorheben. Hier kommt Snyk ins Spiel. Snyk bietet leistungsstarke Sicherheitslösungen speziell für containerisierte Anwendungen. Damit können Sie Schwachstellen in Ihren Containern und deren Abhängigkeiten erkennen und beheben. Integrieren Sie Snyk in Ihren Workflow, um Ihre Sicherheit zu erhöhen.

Wie gelangen Sie zur Shell eines Docker-Containers?

Oft ist es notwendig, Probleme im Container zu debuggen, etwa indem Sie Protokolle oder die Dateisystemstruktur überprüfen oder andere Anforderungen erfüllen, um eine bestimmte Annahme zu validieren oder zu bestätigen. Manchmal möchten Sie vielleicht auch den Inhalt eines Docker-Images erkunden, das Sie lokal erstellt haben.

Dazu verwenden Sie die Befehlszeilenargumente von Docker, um einen Container mit einer interaktiven Shell zu starten. Zunächst müssen Sie einen Container starten, eine Shell ausführen und Ihre Terminaleingaben damit verbinden.

So öffnen Sie mit dem Docker-Befehl run eine Shell für ein Node.js-Docker-Image:

$ docker run -it --rm [docker-image-name-goes-here] /bin/bash

Das funktioniert, sofern in der `Dockerfile` für das Docker-Image kein `ENTRYPOINT` angegeben ist.

Wie finden Sie die Node.js-Version eines Docker-Images heraus?

Mit diesem praktischen Trick finden Sie heraus, welche Node.js-Runtime-Version in Ihrem Docker-Image installiert ist. Dieses Wissen ist entscheidend für Kompatibilitätsprüfungen und das Debugging sowie für ein konsistentes Verhalten in unterschiedlichen Umgebungen.

Führen Sie den folgenden Befehl aus (vorausgesetzt, Sie haben das JSON-Parsing-Programm `jq` installiert):

$ docker image inspect [image-name] | jq '.[0].Config.Env'

Der Befehl gibt die Umgebungsvariablen des Docker-Images aus, einschließlich der Node.js-Version. Zum Beispiel sehen Sie möglicherweise Folgendes:

[
  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  "NODE_VERSION=18.2.0",
  "YARN_VERSION=1.22.19"
]

Wie lassen sich für Apple M1 optimierte Docker-Images verwenden?

Docker unterstützt inzwischen die ARM-Architektur, auf der der M1-Chip basiert, und bietet spezielle Container-Images, die für diese Architektur optimiert sind. Diese Images gewährleisten eine bessere Kompatibilität und schnellere Leistung auf M1-Geräten. Das ist besonders hilfreich, da viele Entwickler inzwischen mit Apple-Laptops arbeiten.

Zunächst sollten Sie die Image-Architektur überprüfen. Vergewissern Sie sich vor dem Starten eines Containers, dass dessen Architektur kompatibel ist. Mit diesem Befehl können Sie prüfen, ob Sie ein für M1 optimiertes Image verwenden:

docker image inspect --format '{{ .Architecture }}' <image_name>

Wenn Sie Images aus der Docker-Hub-Registry abrufen, sollten Sie sicherstellen, dass Sie für M1 optimierte Images verwenden:

docker pull --platform linux/arm64/v8 node:lts-bullseye-slim

Wenn Sie außerdem zu einem Team gehören, das Docker-Images erstellt und in eine private oder öffentliche Registry überträgt, sollten Sie darauf achten, M1-spezifische Container-Images zu erstellen. So funktionieren sie nahtlos auf unterschiedlichen CPU-Architekturen und bieten eine breitere Kompatibilität:

docker buildx build --platform linux/amd64,linux/arm64 -t <your_username>/<image_name>:<tag> .

Änderungen an einem Container mit Docker diff erkennen

Der Befehl `docker diff` zeigt die Änderungen am Dateisystem eines Docker-Containers seit dessen Erstellung. Er macht hinzugefügte, geänderte oder gelöschte Dateien und Verzeichnisse sichtbar.

So sieht der Befehl aus:

docker diff <container_id>

Dieser Befehl gibt eine Liste der Änderungen am Docker-Container zurück. Für jede Änderung gibt Docker an, ob die Datei oder das Verzeichnis hinzugefügt (A), geändert (C) oder gelöscht (D) wurde.

Der Befehl `docker diff` kann bei einem Node.js-Docker-Container hilfreich sein, wenn Sie beispielsweise Abhängigkeiten in Ihrer `package.json` aktualisiert haben und überprüfen möchten, was sich genau im Verzeichnis `node_modules` geändert hat. Mit `docker diff` können Sie die Änderungen ermitteln.

Mit `docker diff` Sicherheitslücken erkennen

Auch in Ihrem Sicherheits-Toolkit kann der Befehl `docker diff` ein leistungsstarkes Werkzeug sein. Er bietet einen schnellen Überblick über Änderungen am Dateisystem eines Docker-Containers und kann so unbefugte Änderungen oder verdächtige Aktivitäten aufdecken.

Wenn Ihnen beispielsweise unerwartete Änderungen an den Dateien Ihrer Node.js-Anwendung auffallen, könnte dies auf eine Sicherheitsverletzung oder den Missbrauch einer Schwachstelle hindeuten. Wenn Sie `docker diff` in Ihre regelmäßigen Prüfungen oder sogar in Ihren CI/CD-Prozess integrieren, können Sie die Anwendungssicherheit verbessern und sicherstellen, dass Ihre Docker-Container wie erwartet funktionieren.

Daher empfiehlt es sich, mit dem Befehl `docker diff` ein Sicherheitsaudit Ihrer Docker-Container durchzuführen. Vergleichen Sie den aktuellen Zustand des Containers mit dem ursprünglichen Image, um Abweichungen zu erkennen, die ein Sicherheitsrisiko darstellen könnten.

Docker-Container-Images auf Schwachstellen und SBOMs prüfen

Snyk ist eine Sicherheitsplattform mit einem dauerhaft kostenlosen Tarif, die Entwickler bei der Anwendungssicherheit unterstützt. Im Zusammenhang mit Docker kann Snyk Ihre Docker-Images auf Schwachstellen prüfen und Ihnen einen umfassenden Bericht mit konkreten Empfehlungen zur Behebung liefern.

Um ein Docker-Image eines Node.js-Projekts zu prüfen, installieren Sie zunächst die Snyk CLI (Befehlszeilenschnittstelle). Falls sie noch nicht installiert ist, können Sie sie mit npm installieren. Führen Sie dazu Folgendes aus:

npm install -g snyk

Nehmen wir nun an, das Docker-Image Ihrer Node.js-Anwendung heißt `my-nodejs-app`. Mit dem folgenden Befehl können Sie es mit Snyk prüfen:

snyk container test my-nodejs-app

Mit diesem Befehl weisen Sie Snyk an, das Docker-Image `my-nodejs-app` auf bekannte Schwachstellen zu prüfen. Nach dem Scan zeigt Snyk eine nach Schweregrad sortierte Liste der im Docker-Image gefundenen Schwachstellen an:

✗ High severity vulnerability found in lodash
  Description: Prototype Pollution
  Info: https://snyk.io/vuln/SNYK-JS-LODASH-567746
  Introduced through: lodash@4.17.15
  From: lodash@4.17.15

Eine weitere nützliche Funktion von Snyk ist die Erstellung einer Software-Stückliste (SBOM) für Ihr Docker-Image. Eine SBOM listet alle Komponenten Ihres Docker-Images auf, einschließlich sämtlicher Abhängigkeiten und ihrer Versionen. Das ist äußerst nützlich, um den Inhalt Ihres Docker-Images nachzuverfolgen und potenzielle Schwachstellen zu erkennen.

So erstellen Sie mit Snyk eine SBOM für Ihr Docker-Image:

snyk container test <image-name> --json | jq .packageManager

Wie ermitteln Sie die SHA-ID eines Docker-Images?

Die SHA-ID eines Docker-Images ist entscheidend, wenn Sie Ihre Docker-Images eindeutig referenzieren möchten – insbesondere in automatisierten Skripten oder um die Konsistenz über verschiedene Umgebungen hinweg sicherzustellen. Diese Kennung ist für jedes Image und jede Version einzigartig und präziser als Tags.

Dieser Befehl listet alle Ihre Docker-Images mit ihren vollständigen SHA256-Digests auf. Die SHA-ID wird in der Spalte „IMAGE ID“ angezeigt:

docker images --no-trunc

Anwendungsfall: Ein Image in Docker Compose fixieren

Wenn Sie in einer Docker-Compose-Datei ein Image angeben, können Sie statt des Tags die SHA-ID verwenden, um das Image auf eine bestimmte Version festzulegen. So verwenden Sie immer genau die Image-Version, mit der Sie Ihre Anwendung getestet haben, und vermeiden unerwartete Änderungen, falls der Image-Tag aktualisiert wird.

services:
  your_service:
    image: your_image@sha256:<SHA_ID>

Die Verwendung der SHA-ID in Docker-Befehlen sorgt für Konsistenz und Zuverlässigkeit – wichtige Voraussetzungen für Produktionsumgebungen und CI/CD-Pipelines.

Wie finden Sie die IP-Adresse eines Docker-Containers?

Wenn Sie Node.js-Anwendungen mit Frameworks wie NestJS, Express oder Fastify in Docker-Containern ausführen, müssen Sie oft die IP-Adresse des Containers kennen.

Diese Information kann für das Debugging, die Protokollanalyse oder die Verbindung zum Webserver im Container entscheidend sein.

docker inspect --format '{{ .NetworkSettings.IPAddress }}' [container_name_or_id]

Wie lassen sich Node.js-Unterprozesse in einem Docker-Container untersuchen?

Wie können Node.js-Entwickler tiefere Einblicke in ihre containerisierten Anwendungen gewinnen, um sie effektiver zu überwachen und Fehler zu beheben – etwa wenn sie herausfinden möchten, ob ein Prozess mehr Arbeitsspeicher oder CPU-Ressourcen als erwartet verbraucht?

Verwenden Sie diesen Docker-Befehl:

docker top node

Bei der Arbeit mit Node.js-Anwendungen in Docker-Containern ist es wichtig, die untergeordneten Prozesse überprüfen zu können – insbesondere, wenn die Anwendung solche Prozesse nutzt. Das kommt häufig bei Anwendungen mit Clustern oder Workern sowie beim Starten von Unterprozessen für bestimmte Aufgaben vor und ist für das Debugging und die Überwachung unerlässlich.

Metadaten von Node.js-Container-Images über die Docker Registry API abrufen

Manchmal benötigen Sie detaillierte Informationen zum Node.js-Container-Image. Eine direkte Abfrage der Docker Hub API ist dafür eine effektive Methode.

So erhalten Sie umfassende Metadaten zum Image, die entscheidend sein können, um Versionsdetails, Abhängigkeiten und weitere wichtige Eigenschaften zu verstehen.

Verwenden Sie den folgenden Befehl. Er nutzt das Programm `curl`, um die HTTP-Anfrage zu stellen, und `jq`, um die Antwort übersichtlich als JSON zu formatieren:

curl https://hub.docker.com/v2/repositories/library/node/tags/latest | jq

Das können Sie in der Antwort erwarten:

  • Image-Details: Informationen wie Image-Größe, Digest, Architektur und mehr.

  • Layer-Informationen: Erfahren Sie, wie das Image aufgebaut ist.

  • Tag-Details: Spezifische Daten zum Tag „latest“.

Nützlich ist das beispielsweise für automatisierte Skripte, die diesen Befehl in CI/CD-Pipelines für automatische Prüfungen und Updates integrieren, sowie für die Versionsverwaltung. So stellen Sie sicher, dass Sie die richtige Node.js-Image-Version für die Anforderungen Ihres Projekts verwenden.

Damit sind Sie am Ende angekommen!

Wir haben uns mit verschiedenen Szenarien beschäftigt: von der Behebung uneinheitlicher Versionen und von Leistungseinbußen bis hin zur Optimierung alltäglicher Abläufe in Ihrem Docker-Ökosystem.

Zum Abschluss sollte Ihnen dieser Beitrag eine Reihe fortgeschrittener Docker-Befehle an die Hand geben, die über die üblichen Befehle docker run und docker ps hinausgehen. Diese Profi-Tipps für DevOps- und Entwicklungsprofis sollen Ihre Fehlerbehebung, Ihr Debugging und die Verwaltung Ihrer Container vereinfachen.

Wenn Sie diese Erkenntnisse und Befehle in Ihren Workflow integrieren, denken Sie daran: Docker zu meistern, ist ein fortlaufender Prozess. Als Node.js-Entwickler können Sie mit diesen 10 Best Practices für die Containerisierung von Node.js-Webanwendungen mit Docker weiterlernen. Wenn Sie Java-Entwickler sind, empfehlen wir Ihnen Brian Vermeers 10 Best Practices zum Erstellen von Java-Containern mit Docker.

Container-Sicherheit mit Fokus auf Entwickler

Snyk findet und behebt automatisch Schwachstellen in Container-Images und Kubernetes-Workloads.