Dockerfile-Grundlagen: Definition und Aufbau containerisierter Apps

watch 7m, 2s
views 2

12:26, 29.05.2026

Artikel Inhalt
arrow

  • Einführung in Dockerfile 
  • Wichtige Befehle in einer Dockerfile 
  • Beispiel-Workflow: Schreiben und Anwenden einer Dockerfile
  • Schritte zum Erstellen Ihrer Dockerfile 
  • Verfügbare Optionen während des Docker-Builds 
  • Ausführen und Verwenden des erstellten Images 
  • Empfohlene Vorgehensweisen für Dockerfiles 
  • 1. Vermeiden Sie die Verwendung des Tags `latest` für Basis-Images 
  • 2. Wählen Sie Basis-Images nur aus vertrauenswürdigen Quellen 
  • 3. Implementieren Sie HEALTHCHECK zur Überwachung des Container-Status 
  • 4. ENTRYPOINT und CMD richtig konfigurieren 
  • 5. Speichern Sie Geheimnisse niemals direkt in Images 
  • 6. Fügen Sie Labels hinzu, um Ihre Images zu organisieren und zu verfolgen 
  • 7. Container mit einem Nicht-Root-Benutzer ausführen 
  • 8. Verwenden Sie `.dockerignore`, um den Build-Prozess zu beschleunigen 
  • 9. Optimieren Sie die Image-Größe, wann immer möglich 
  • 10. Verwenden Sie Linter und Schwachstellenscanner für die Sicherheit 
  • Zusammenfassung der wichtigsten Erkenntnisse

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 uuid

Im 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.

Teilen

War dieser Artikel für Sie hilfreich?

VPS beliebte Angebote

-20.4%

CPU
CPU
2 Xeon Cores
RAM
RAM
2 GB
Space
Space
30 GB SSD
Bandwidth
Bandwidth
300 GB
KVM-SSD 2048 HK Linux

18 /mo

/mo

Alle 12 Monate abgerechnet

-10%

CPU
CPU
4 Xeon Cores
RAM
RAM
2 GB
Space
Space
75 GB SSD
Bandwidth
Bandwidth
Unlimited
wKVM-SSD 2048 Windows

10.23 /mo

/mo

Alle 12 Monate abgerechnet

-20.5%

CPU
CPU
6 Xeon Cores
RAM
RAM
16 GB
Space
Space
150 GB SSD
Bandwidth
Bandwidth
10 TB
KVM-SSD 16384 Metered Linux

95 /mo

/mo

Alle 12 Monate abgerechnet

-10%

CPU
CPU
4 Xeon Cores
RAM
RAM
4 GB
Space
Space
50 GB SSD
Bandwidth
Bandwidth
Unlimited
KVM-SSD 4096 Linux

15.95 /mo

/mo

Alle 12 Monate abgerechnet

-10%

CPU
CPU
6 Epyc Cores
RAM
RAM
8 GB
Space
Space
100 GB NVMe
Bandwidth
Bandwidth
Unlimited
KVM-NVMe 8192 Linux

26.35 /mo

/mo

Alle 12 Monate abgerechnet

-10%

CPU
CPU
10 Epyc Cores
RAM
RAM
64 GB
Space
Space
400 GB NVMe
Bandwidth
Bandwidth
Unlimited
KVM-NVMe 65536 Linux

135.49 /mo

/mo

Alle 12 Monate abgerechnet

-8.9%

CPU
CPU
6 Xeon Cores
RAM
RAM
16 GB
Space
Space
400 GB HDD
Bandwidth
Bandwidth
Unlimited
wKVM-HDD 16384 Windows

56 /mo

/mo

Alle 12 Monate abgerechnet

-10%

CPU
CPU
4 Xeon Cores
RAM
RAM
8 GB
Space
Space
100 GB SSD
Bandwidth
Bandwidth
Unlimited
10Ge-KVM-SSD 8192 Linux

115.5 /mo

/mo

Alle 12 Monate abgerechnet

-9.3%

CPU
CPU
6 Xeon Cores
RAM
RAM
16 GB
Space
Space
150 GB SSD
Bandwidth
Bandwidth
Unlimited
wKVM-SSD 16384 Windows

53.99 /mo

/mo

Alle 12 Monate abgerechnet

-10%

CPU
CPU
4 Xeon Cores
RAM
RAM
2 GB
Space
Space
60 GB HDD
Bandwidth
Bandwidth
Unlimited
KVM-HDD 2048 Linux

7.7 /mo

/mo

Alle 12 Monate abgerechnet

Weitere Artikel zu diesem Thema

cookie

Cookies und Datenschutz akzeptieren?

Wir verwenden Cookies, um sicherzustellen, dass wir Ihnen die beste Erfahrung auf unserer Website bieten. Wenn Sie fortfahren, ohne Ihre Einstellungen zu ändern, gehen wir davon aus, dass Sie mit dem Empfang aller Cookies auf der HostZealot-Website einverstanden sind.