Docker - Dockerfile: Ein Anfängerleitfaden

Hallo da draußen, zukünftige Docker-Zauberer! Ich freue mich sehr, Ihr Guide auf dieser aufregenden Reise in die Welt der Dockerfiles zu sein. Als jemand, der seit Jahren Informatik unterrichtet, habe ich unzählige Schüler seen, die vor Begeisterung strahlen, wenn sie die Macht der Containerisierung begreifen. Also, lasst uns die Ärmel hochkrempeln und eintauchen!

Docker - Dockerfile

Was ist ein Dockerfile?

Bevor wir mit dem Bau beginnen, lassen Sie uns verstehen, mit was wir es zu tun haben. Ein Dockerfile ist wie ein Rezept für die Erstellung von Docker-Images. Genau wie ein Koch ein Rezept befolgt, um ein köstliches Gericht zuzubereiten, verwendet Docker ein Dockerfile, um ein benutzerdefiniertes Image zu "kochen". Dieses Image enthält alles, was Ihre Anwendung zum Laufen braucht, sauber verpackt in einem portablen Container.

Wichtige Anweisungen in einem Dockerfile

Nun schauen wir uns die Schlüsselzutaten in unserem Dockerfile-Rezept an. Diese Anweisungen sind die Bausteine unseres Images.

Anweisung Beschreibung
FROM Gibt das Basis-Image an
RUN Führt Befehle in einer neuen Ebene aus
CMD Bietet Vorgaben für einen ausführenden Container
EXPOSE Informiert Docker, dass der Container auf bestimmten Netzwerkports horcht
ENV Setzt Umgebungsvariablen
ADD Kopiert neue Dateien, Verzeichnisse oder ferne Datei-URLs
COPY Kopiert neue Dateien oder Verzeichnisse
ENTRYPOINT Konfiguriert einen Container, der als ausführbares Programm läuft
VOLUME Erzeugt einen Mount-Punkt für extern montierte Volumes
USER Setzt den Benutzernamen für folgende RUN / CMD / ENTRYPOINT Befehle
WORKDIR Setzt das Arbeitsverzeichnis
ARG Definiert eine Variable, die Benutzer zur Bauzeit übergeben können
ONBUILD Fügt eine Triggeranweisung hinzu, wenn das Image als Basis für einen anderen Bau verwendet wird

Lassen Sie uns diese mit einigen Beispielen durchgehen:

FROM

FROM ubuntu:20.04

Diese Zeile sagt Docker, dass wir das Ubuntu 20.04-Image als unseren Ausgangspunkt verwenden möchten. Es ist, als ob man sagt: "Ich möchte mein Haus auf diesem spezifischen Grundstück bauen."

RUN

RUN apt-get update && apt-get install -y python3

Dieser Befehl aktualisiert die Paketlisten und installiert Python 3. Es ist ähnlich wie das Gehen zum Baumarkt und das Kaufen der Werkzeuge, die man für sein Haus braucht.

CMD

CMD ["python3", "app.py"]

Dies setzt den Standardbefehl, der beim Start des Containers ausgeführt wird. Es ist, als ob man eine Willkommensmatte vor seiner Haustür auslegt.

Best Practices für Dockerfile

Nun, da wir die Zutaten kennen, lassen Sie uns darüber sprechen, wie man sie effektiv einsetzt:

  1. Halten Sie es schlank: Verwenden Sie so weit wie möglich minimale Basis-Images. Alpine Linux ist eine beliebte Wahl aufgrund seiner kleinen Größe.

  2. Schichten weise kombinieren: Kombinieren Sie RUN-Befehle, um Schichten zu reduzieren. Zum Beispiel:

RUN apt-get update && \
apt-get install -y python3 && \
apt-get clean
  1. Verwenden Sie .dockerignore: Wie .gitignore hilft diese Datei dabei, unnötige Dateien von Ihrem Build-Kontext auszuschließen.

  2. Nutzen Sie den Build-Cache: Ordnen Sie Ihre Anweisungen von am wenigsten bis am häufigsten ändernd, um Bauzeiten zu optimieren.

  3. Verwenden Sie spezifische Tags: Anstatt FROM ubuntu zu verwenden, verwenden Sie FROM ubuntu:20.04, um Konsistenz zu gewährleisten.

Dockerfile - Beispiel

Lassen Sie uns alles mit einer einfachen Python-Webanwendung zusammenbringen:

# Verwenden Sie ein offizielles Python-Laufzeit-Image als Eltern-Image
FROM python:3.9-slim

# Setzen des Arbeitsverzeichnisses im Container
WORKDIR /app

# Kopieren der aktuellen Verzeichnisinhalte in den Container im Verzeichnis /app
COPY . /app

# Installieren aller benötigten Pakete, die in requirements.txt angegeben sind
RUN pip install --no-cache-dir -r requirements.txt

# Machen Sie Port 80 für die Welt außerhalb dieses Containers zugänglich
EXPOSE 80

# Definieren einer Umgebungsvariablen
ENV NAME World

# Führen Sie app.py aus, wenn der Container startet
CMD ["python", "app.py"]

Dieses Dockerfile richtet eine Python-Umgebung ein, kopiert unsere Anwendung in den Container, installiert Abhängigkeiten, öffnet einen Port, setzt eine Umgebungsvariable und gibt den Befehl an, um unsere App auszuführen.

Wie funktioniert es?

Wenn Sie docker build ausführen, liest Docker das Dockerfile Zeile für Zeile, führt jede Anweisung in der richtigen Reihenfolge aus. Jede Anweisung erstellt eine neue Ebene im Image. Diese Ebenen werden zwischengespeichert, was bedeutet, dass wenn Sie Änderungen an Ihrer Anwendung vornehmen, aber das Dockerfile nicht ändern, Docker die unveränderten Ebenen wiederverwenden kann, was den Build-Prozess beschleunigt.

Es ist wie das Bauen eines Schichtkuchens. Jede Anweisung fügt eine neue Schicht hinzu, und wenn Sie die unteren Schichten nicht ändern, können Sie neue Schichten oben drauf setzen, ohne den ganzen Kuchen neu zu backen.

Fazit

Glückwunsch! Sie haben Ihre ersten Schritte in die Welt der Dockerfiles unternommen. Denken Sie daran, dass wie jede Fähigkeit, das Beherrschen von Dockerfiles Übung erfordert. Haben Sie keine Angst vor Experimenten und Fehlern - das ist, wie wir lernen!

Während Sie Ihre Docker-Reise fortsetzen, werden Sie entdecken, dass Dockerfiles äußerst leistungsfähige Werkzeuge zur Erstellung reproduzierbarer Umgebungen und Deployments sind. Sie sind das Geheimrezept, das Docker so lecker für Entwickler und Operations-Teams macht.

FAQ

Q: Kann ich mehrere FROM-Anweisungen in einem Dockerfile verwenden?

A: Ja, das nennt man einen mehrstufigen Build. Es ist nützlich, um kleinere endgültige Images zu erstellen, indem Build-Abhängigkeiten hinterlassen werden.

Q: Was ist der Unterschied zwischen CMD und ENTRYPOINT?

A: CMD bietet Standardargumente, die überschrieben werden können, während ENTRYPOINT den Hauptbefehl des Containers angibt, der schwerer zu überschreiben ist.

Q: Wie kann ich mein Dockerfile für schnellere Builds optimieren?

A: Verwenden Sie eine .dockerignore-Datei, nutzen Sie den Build-Cache durch kluge Anweisungsreihenfolge und kombinieren Sie RUN-Befehle, um Schichten zu reduzieren.

Q: Kann ich Umgebungsvariablen in meinem Dockerfile verwenden?

A: Absolut! Verwenden Sie die ENV-Anweisung, um Umgebungsvariablen zu setzen, die Ihrer Anwendung zur Laufzeit verfügbar sind.

Weitersuchen, weiterbauen und vor allem: Viel Spaß mit Docker! Denken Sie daran, jeder Meister war einmal ein Anfänger. Frohes Dockern!

Credits: Image by storyset