Dockerfile-Anweisungen und Layer verstehen
Beginnen wir damit, ein Dockerfile zu erstellen, das verschiedene Anweisungen nutzt. Wir bauen ein Image für eine Python-Webanwendung auf Basis von Flask. Dabei untersuchen wir, wie jede Anweisung zu den Layern unseres Docker-Images beiträgt.
- Zuerst erstellen wir ein neues Verzeichnis für unser Projekt. Führen Sie im Terminal der WebIDE folgenden Befehl aus:
mkdir -p ~/project/advanced-dockerfile && cd ~/project/advanced-dockerfile
Dieser Befehl erstellt einen neuen Ordner namens advanced-dockerfile im Verzeichnis project und wechselt direkt dorthin.
-
Nun erstellen wir unsere Anwendungsdatei. Klicken Sie im Datei-Explorer der WebIDE (normalerweise links) mit der rechten Maustaste auf den Ordner advanced-dockerfile und wählen Sie "New File". Nennen Sie die Datei app.py.
-
Öffnen Sie app.py und fügen Sie den folgenden Python-Code ein:
from flask import Flask
import os
app = Flask(__name__)
@app.route('/')
def hello():
return f"Hello from {os.environ.get('ENVIRONMENT', 'unknown')} environment!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Dies ist eine einfache Flask-Anwendung, die eine Begrüßungsnachricht ausgibt und dabei anzeigt, in welcher Umgebung sie ausgeführt wird.
- Als Nächstes benötigen wir eine
requirements.txt, um unsere Python-Abhängigkeiten zu definieren. Erstellen Sie eine neue Datei namens requirements.txt im selben Verzeichnis mit folgendem Inhalt:
Flask==2.0.1
Werkzeug==2.0.1
Wir geben hier exakte Versionen für Flask und Werkzeug an, um die Kompatibilität sicherzustellen.
- Jetzt erstellen wir unser Dockerfile. Erstellen Sie eine neue Datei namens
Dockerfile (mit großem 'D') im selben Verzeichnis und fügen Sie diesen Inhalt hinzu:
## Use an official Python runtime as the base image
FROM python:3.9-slim
## Set the working directory in the container
WORKDIR /app
## Set an environment variable
ENV ENVIRONMENT=production
## Copy the requirements file into the container
COPY requirements.txt .
## Install the required packages
RUN pip install --no-cache-dir -r requirements.txt
## Copy the application code into the container
COPY app.py .
## Specify the command to run when the container starts
CMD ["python", "app.py"]
## Expose the port the app runs on
EXPOSE 5000
## Add labels for metadata
LABEL maintainer="Your Name <your.email@example.com>"
LABEL version="1.0"
LABEL description="Flask app demo for advanced Dockerfile techniques"
Lassen Sie uns diese Anweisungen analysieren und verstehen, wie sie die Layer unseres Images bilden:
FROM python:3.9-slim: Dies ist immer die erste Anweisung. Sie legt das Basis-Image fest. Dies erzeugt den ersten Layer unseres Images, der die Python-Laufzeitumgebung enthält.
WORKDIR /app: Legt das Arbeitsverzeichnis für alle folgenden Befehle fest. Es erzeugt keinen neuen Layer, beeinflusst aber das Verhalten der nachfolgenden Schritte.
ENV ENVIRONMENT=production: Setzt eine Umgebungsvariable. Diese erzeugen keine neuen Layer, werden aber in den Metadaten des Images gespeichert.
COPY requirements.txt .: Kopiert die Datei vom Host-Rechner in das Image. Dies erzeugt einen neuen Layer, der nur diese Datei enthält.
RUN pip install --no-cache-dir -r requirements.txt: Führt einen Befehl während des Build-Prozesses aus, um Abhängigkeiten zu installieren. Dies erzeugt einen neuen Layer mit allen installierten Paketen.
COPY app.py .: Kopiert den Anwendungscode und erzeugt einen weiteren Layer.
CMD ["python", "app.py"]: Legt den Standardbefehl beim Start des Containers fest. Erzeugt keinen Layer, sondern definiert das Standardverhalten.
EXPOSE 5000: Dient primär der Dokumentation. Es teilt Docker mit, dass der Container auf diesem Port lauscht, veröffentlicht ihn aber nicht automatisch. Erzeugt keinen Layer.
LABEL ...: Fügt Metadaten hinzu. Wie ENV-Anweisungen erzeugen sie keine Layer, sondern werden in den Metadaten gespeichert.
Jede RUN-, COPY- und ADD-Anweisung erzeugt einen neuen Layer. Layer sind ein Grundkonzept von Docker, das eine effiziente Speicherung und Übertragung ermöglicht. Wenn Sie Änderungen am Dockerfile vornehmen und das Image neu bauen, verwendet Docker unveränderte Layer aus dem Cache wieder, was den Prozess erheblich beschleunigt.
- Nachdem wir die Theorie verstanden haben, bauen wir das Image. Führen Sie im Terminal aus:
docker build -t advanced-flask-app .
Dieser Befehl erstellt ein Image mit dem Tag advanced-flask-app. Der Punkt . am Ende weist Docker an, das Dockerfile im aktuellen Verzeichnis zu suchen.
Sie sehen die Ausgabe für jeden Schritt. Achten Sie darauf, wie Docker bei wiederholten Builds "Using cache" anzeigt, wenn sich an einem Schritt nichts geändert hat.
- Sobald der Build fertig ist, starten wir einen Container basierend auf diesem Image:
docker run -d -p 5000:5000 --name flask-container advanced-flask-app
Erklärung der Parameter:
-d startet den Container im Hintergrund (Detached Mode).
-p 5000:5000 leitet den Port 5000 Ihres Hosts an den Port 5000 des Containers weiter.
--name flask-container gibt dem Container einen Namen.
advanced-flask-app ist das Image, das wir verwenden.
Prüfen Sie mit folgendem Befehl, ob der Container läuft:
docker ps
- Um die Anwendung zu testen, nutzen wir
curl:
curl http://localhost:5000
Sie sollten die Nachricht "Hello from production environment!" sehen.
Falls curl nicht funktioniert, können Sie auch einen neuen Browser-Tab öffnen und http://localhost:5000 aufrufen. Bei Problemen helfen die Container-Logs:
docker logs flask-container