Dockerfile-Grundlagen: Definition und Aufbau containerisierter Apps
12:26, 29.05.2026
Docker ist eine Plattform, die zum Ausführen und – was noch wichtiger ist – zum Erstellen containerisierter Anwendungen benötigt wird. Mithilfe von Containern lassen sich Abhängigkeiten, Quellcode und Laufzeitumgebung bündeln. Dies kann über die Docker-Installation auf Ihrem Rechner oder über einen Kubernetes-Cluster als Infrastruktur erfolgen.
Wenn die Container gestartet werden, wird ein Container-Image benötigt. Die Images legen den Ausgangszustand der Dateisysteme der Container fest. Dies kann mit der Dockerfile-Datei erfolgen, und in diesem Artikel führen wir Sie durch den Prozess der Erstellung containerisierter Anwendungen und stellen Ihnen einige hilfreiche Vorgehensweisen vor.
Einführung in Dockerfile
Dockerfiles enthalten Anweisungen in Textform, die für die Erstellung des Container-Images benötigt werden. Um alle Anweisungen in der Datei für die Image-Erstellung zu verarbeiten, sollten Sie den folgenden Befehl verwenden:
docker build
Nach der Ausführung dieses Befehls werden alle Anweisungen nacheinander verarbeitet. Wenn eine Zeile mit # beginnt, handelt es sich nicht um einen Befehl, sondern um einen Kommentar oder eine Erläuterung zum Befehl. Die Argumente in den Zeilen können durch einen Backslash getrennt werden.
Wichtige Befehle in einer Dockerfile
Es gibt mehr als 15 Befehle, die in einer Dockerfile verwendet werden können, um Konfigurationen festzulegen und Inhalte hinzuzufügen. Hier ist eine Liste der beliebtesten:
- FROM steht normalerweise am Anfang der Datei und bildet die Grundlage für den Build.
- COPY wird benötigt, um Ordner/Dateien zum Dateisystem hinzuzufügen. Der Kopiervorgang findet zwischen dem Image und dem Docker-Host statt.
- ADD funktioniert ähnlich wie die oben genannte Anweisung, unterstützt jedoch zusätzlich das Entpacken von Archiven und Datei-URLs. Die Verwendung von ADD kann einige Aufgaben vereinfachen. Beispielsweise werden Archivdateien im Container extrahiert, anstatt sie nur zu kopieren.
- RUN wird für die Ausführung von Befehlen im Image verwendet. Das bedeutet, dass eine neue Image-Schicht mit den erforderlichen Änderungen erstellt wird. In der Regel ist dieser Befehl für die Konfiguration und Installation zusätzlicher Pakete erforderlich.
- ENV – ist für die Einstellung der Umgebung erforderlich.
Beispiel-Workflow: Schreiben und Anwenden einer Dockerfile
Nachdem Sie nun einige grundlegende Befehle verstanden haben, fahren wir mit dem eigentlichen Beispiel des Workflows fort.
Beginnen Sie mit der Erstellung eines neuen Verzeichnisses, indem Sie den folgenden Code verwenden und speichern:
import { v4 as uuid } from "uuid";
console.log("Hello World");
console.log(`Your ID is ${uuid()}`);
Fügen Sie dann das Paket wie folgt zu den Projekten hinzu:
$ npm install uuidIm nächsten Schritt fügen Sie die folgenden Anweisungen hinzu und speichern sie in der Dockerfile:
FROM node:16
WORKDIR /app
COPY package.json .
COPY package-lock.json .
RUN npm install
COPY main.js .
ENTRYPOINT ["node"]
CMD ["main.js"]
Versuchen wir, einige Details des Codes zu erklären:
- node:16 – das offizielle Image, das als Basis verwendet wird.
- WORKDIR – in diesem Teil wird das Verzeichnis auf /app geändert.
- COPY wird verwendet, um 2 Dateien aus dem Host-Verzeichnis in das Arbeitsverzeichnis des Containers zu kopieren.
- npm install – wird für die Installation im Dateisystem des Containers verwendet, um die Abhängigkeiten abzurufen.
- COPY main.js – der Quellcode wird in den Container kopiert.
Schritte zum Erstellen Ihrer Dockerfile
An dieser Stelle können Sie mit dem folgenden Befehl beginnen, ein Image aus der Dockerfile zu erstellen:
$ docker build -t demo-image:latest .
Sobald das Image erstellt ist, werden die Anweisungen im Terminal angezeigt.
Verfügbare Optionen während des Docker-Builds
Bei Verwendung des docker build Befehls geben Sie die Pfade an, auf die Sie in der Datei verweisen. Pfade außerhalb des Kontexts werden bei den meisten Anweisungen nicht berücksichtigt.
Docker überprüft Anweisungen automatisch anhand des Arbeitsverzeichnisses, es ist jedoch möglich, mit -f auf eine andere Datei zu verweisen, wie im folgenden Beispiel:
docker build -f dockerfiles/app.dockerfile -t demo-image:latest -t demo-image:v1.0 .
Ausführen und Verwenden des erstellten Images
Um das erstellte Image auszuführen, verwenden Sie Folgendes:
docker run demo-image:latest node main.js
Empfohlene Vorgehensweisen für Dockerfiles
Das Schreiben eines Dockerfiles gilt als relativ einfache Aufgabe, doch sollten einige Empfehlungen beachtet werden, um die Leistung, Benutzerfreundlichkeit und das Sicherheitsniveau zu verbessern.
1. Vermeiden Sie die Verwendung des Tags `latest` für Basis-Images
In der FROM-Anweisung sollten Sie die Verwendung von „latest“ vermeiden, da dies zu ungeplanten Änderungen führen kann. Die meisten Image-Autoren verwenden sofort die neueste Version. Beim Neuerstellen des Images könnte dies unbemerkt die Verwendung einer anderen Version auslösen und Probleme verursachen.
Deshalb ist es besser, genauer zu sein und „node:16“ anzugeben.
2. Wählen Sie Basis-Images nur aus vertrauenswürdigen Quellen
Die Verwendung einer vertrauenswürdigen Quelle für das Basis-Image ist äußerst wichtig, da sonst Sicherheitsrisiken entstehen können. Ein nicht vertrauenswürdiges Basis-Image kann Malware enthalten, die außerhalb der Container wirkt. Deshalb ist es besser, Images zu verwenden, die von verifizierten Benutzern veröffentlicht wurden oder offiziell sind.
3. Implementieren Sie HEALTHCHECK zur Überwachung des Container-Status
Es ist äußerst wichtig, den Container-Status zu überwachen. Dies kann mit Orchestratoren wie Kubernetes erfolgen, sodass problematische Container automatisch neu gestartet werden können.
HEALTHCHECK sollte zum Dockerfile hinzugefügt werden, damit der Befehl im Container ausgeführt wird und überprüft, ob alles ordnungsgemäß funktioniert:
HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost || exit 1
Der Status der Container kann mit dem Befehl ps überprüft werden.
4. ENTRYPOINT und CMD richtig konfigurieren
Die Anweisungen CMD und ENTRYPOINT sind in gewisser Weise ähnlich. CMD gibt Standardargumente vor, und ENTRYPOINT führt diesen Prozess aus. Die Argumente in CMD können angepasst werden, wenn Container mit docker run gestartet werden.
5. Speichern Sie Geheimnisse niemals direkt in Images
Aus Sicherheitsgründen wird davon abgeraten, API-Schlüssel oder Passwörter in den Images zu speichern. Denn jeder Benutzer mit Zugriff auf das Image kann diese Informationen einsehen und nutzen.
Außerdem ist es besser, Umgebungsvariablen zu verwenden und keine Standardwerte in der Dockerfile anzugeben. Dies hilft, einige Sicherheitsrisiken zu minimieren.
6. Fügen Sie Labels hinzu, um Ihre Images zu organisieren und zu verfolgen
Falls Ihr Team über viele Images verfügt, ist es besser, die LABEL-Anweisung zu verwenden. Das bedeutet, dass Sie für jedes Projekt wertvolle Informationen hinzufügen können. Labels werden basierend auf der Reverse-DNS-Syntax wie folgt gesetzt:
LABEL com.sample.team=backend
7. Container mit einem Nicht-Root-Benutzer ausführen
Standardmäßig laufen Container als Root-Benutzer. Dies kann Sicherheitsrisiken mit sich bringen, da Hacker in den Container eindringen und Befehle auf dem Host ausführen könnten.
Dies lässt sich durch Hinzufügen einer USER-Anweisung zum Dockerfile beheben. Die beste Empfehlung hierfür ist, für alle Dateien Nicht-Root-Benutzer zu verwenden.
USER demo-app
USER 1000
USER demo-app:demo-group
8. Verwenden Sie `.dockerignore`, um den Build-Prozess zu beschleunigen
Images werden in der Regel mit einem Arbeitsverzeichnis erstellt, das unnötige Verzeichnisse und Dateien enthalten kann. Um die Leistung zu verbessern, müssen die nicht benötigten Pfade ausgeschlossen werden. Dies trägt dazu bei, den Prozess zu beschleunigen, wenn Docker den Build-Kontext in der Anfangsphase des Build-Prozesses kopiert.
Verwenden Sie eine `dockerignore`-Datei im Verzeichnis, um unnötige Verzeichnisse/Dateien auszuschließen.
9. Optimieren Sie die Image-Größe, wann immer möglich
Die Images können extrem groß werden, was sich direkt auf die Build-Zeit auswirkt. Um die Image-Größe zu optimieren, ist es ratsam, nur die notwendigen Pakete zu verwenden und alles andere auszuschließen. Außerdem ist es besser, das kompakte Basis-Image zu verwenden, sofern dies möglich ist. Zum Beispiel Alpine Linux anstelle von Ubuntu.
10. Verwenden Sie Linter und Schwachstellenscanner für die Sicherheit
Dockerfiles können Fehler enthalten, die zu schwerwiegenden Problemen oder unerwartetem Verhalten führen können. Es ist möglich, Linter wie Hadolint zu verwenden, um mögliche Probleme zu überprüfen.
Um es auszuführen, verwenden Sie den folgenden Befehl:
$ docker run --rm -i hadolint/hadolint < Dockerfile
Außerdem wird empfohlen, Scanner wie Trivy zu verwenden, die dabei helfen, veraltete Pakete zu finden. Versuchen Sie, diese vor der Bereitstellung einzusetzen, um Risiken zu minimieren.
Zusammenfassung der wichtigsten Erkenntnisse
Docker ist eine äußerst beliebte Technologie, die durch den Einsatz von Containern, die in verschiedenen Umgebungen einwandfrei funktionieren, direkten Einfluss auf die Softwarebereitstellung hat. Für die korrekte Verwendung von Docker ist es notwendig, eine Dockerfile zu erstellen, die alle erforderlichen Anweisungen enthält. Die Anweisungen werden durch die OCI-Image-Spezifikation definiert und erzeugen Images, die für die OCI-kompatible Container-Laufzeitumgebung benötigt werden.