7 Define, build, and modify container images

7.1 Dockerfile Grundlagen

Ein Dockerfile ist ein Textdokument, das alle Anweisungen enthält, die notwendig sind, um ein Docker-Image zu erstellen. In der Docker-Architektur verwendet der Build-Prozess das Basis-Image (angegeben mit dem FROM Befehl im Dockerfile) als read-only (ro) Layer. Alle weiteren Anweisungen im Dockerfile, wie RUN, COPY usw., führen zur Erstellung neuer read-write (rw) Layer oberhalb des Basis-Layers.

Wenn der Build-Prozess abgeschlossen ist, werden diese rw-Layer zu neuen read-only (ro) Layern “eingefroren” und bilden zusammen mit dem Basis-Layer das endgültige Image. Das ermöglicht auch die Wiederverwendung von Layern zwischen verschiedenen Images und Containern, was Speicherplatz spart und die Build- und Deploy-Zeiten beschleunigt.

Beispiel:

# Verwenden eines Basis-Images
FROM ubuntu:latest

# Installation von notwendigen Paketen
RUN apt-get update && apt-get install -y nginx

# Festlegen des Arbeitsverzeichnisses
WORKDIR /var/www/html

# Kopieren von Dateien ins Image
COPY ./html .

# Ausführen eines Befehls
CMD ["nginx", "-g", "daemon off;"]

7.2 Docker Build

Mit dem docker build Kommando wird das Dockerfile sequentiell ausgeführt und das neue Image erstellt.

Beispiel:

docker build -t my-nginx:latest .

7.3 Dockerfile Anweisungen

7.4 Modifizieren von Images

7.4.1 Erweitern eines vorhandenen Images

Mit dem FROM Befehl in einem Dockerfile können Sie von einem bestehenden Image ausgehen und weitere Anweisungen hinzufügen.

Beispiel:

FROM nginx:latest
COPY ./my-config.conf /etc/nginx/conf.d/default.conf

7.4.2 Erzeugen eines neuen Tags

docker tag mein-nginx-image:latest mein-nginx-image:v2

7.5 Auflisten lokal verfügbarer Images

Mit dem docker images oder docker image ls Befehl können Sie alle verfügbaren Images anzeigen.

docker images

7.6 Docker pull

Wenn Sie docker build oder docker run mit einem Image ausführen, das nicht lokal vorhanden ist, führt Docker implizit einen docker pull Befehl aus, um das fehlende Image herunterzuladen. Wenn kein Repository explizit angegeben ist, wird standardmäßig versucht, das Image aus dem Docker Hub (hub.docker.com) zu ziehen.

Beispiel:

docker run nginx:latest

In diesem Fall sucht Docker nach dem nginx:latest Image auf dem lokalen System. Wenn es nicht gefunden wird, wird es automatisch aus dem Docker Hub heruntergeladen.

Es ist wichtig zu beachten, dass Sie auch ein anderes Repository durch die Angabe der vollständigen Repository-URL verwenden können. Wenn Sie das tun, wird Docker das Image von diesem spezifischen Repository anstatt des Docker Hubs herunterladen.

7.7 Dockerfile Befehle

Befehl Beschreibung Beispiel
FROM Setzt das Basis-Image FROM ubuntu:latest
RUN Führt Befehle im neuen Layer aus und speichert das Ergebnis RUN apt-get update
CMD Gibt die auszuführenden Befehle beim Start des Containers an CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT Legt die ausführbare Datei fest, die beim Start des Containers ausgeführt wird ENTRYPOINT ["./app"]
WORKDIR Setzt das Arbeitsverzeichnis in einem Container WORKDIR /app
COPY Kopiert Dateien oder Verzeichnisse vom Host in das Image COPY ./html /var/www/html
ADD Kopiert Dateien und kann auch URLs und tar-Archive verarbeiten ADD https://example.com/app.tar.gz /app
EXPOSE Informiert Docker, dass der Container auf spezifischen Ports lauscht EXPOSE 8080
ENV Setzt Umgebungsvariablen ENV MY_VAR my_value
LABEL Fügt Metadaten zum Image hinzu LABEL version="1.0"
VOLUME Erstellt einen Mount-Point für externe Volumes oder andere Container VOLUME /data
USER Legt den Benutzer fest, der im Container ausgeführt wird USER nginx
ARG Definiert einen Build-Argument, das zur Build-Zeit verwendet wird ARG VERSION=latest
STOPSIGNAL Setzt das Systemaufrufsignal, das zum Stoppen des Containers verwendet wird STOPSIGNAL SIGTERM
HEALTHCHECK Überprüft den Gesundheitsstatus des Containers HEALTHCHECK CMD curl --fail http://localhost/ || exit 1
SHELL Ändert den Standard-Shell für folgende RUN-Anweisungen SHELL ["/bin/bash", "-c"]

Wenn ENTRYPOINT und CMD in Kombination im Dockerfile verwendet werden, dann können die Argumente des CMD als Standardparameter für das im ENTRYPOINT definierte Programm dienen. Die Werte in CMD werden an das ausführbare Programm in ENTRYPOINT angehängt.

Beispiel:

ENTRYPOINT ["/usr/bin/dumb-init"]
CMD ["--", "nginx", "-g", "daemon off;"]

In diesem Fall würde dumb-init mit den Parametern -- nginx -g daemon off; ausgeführt werden, wenn der Container gestartet wird.

Wenn Sie docker run mit zusätzlichen Argumenten ausführen, werden diese Argumente die Standardparameter im CMD Befehl des Dockerfiles überschreiben und an das im ENTRYPOINT festgelegte Programm angehängt.

docker run <IMAGE_ID> -- other-args

In diesem Fall würden die other-args die Standardparameter -- nginx -g daemon off; überschreiben. Das endgültige Kommando wäre dann /usr/bin/dumb-init other-args.

Ebenso kann ENTRYPOINT durch die Verwendung des --entrypoint Flags beim docker run Befehl überschrieben werden.

Beispiel:

docker run --entrypoint /bin/bash <IMAGE_ID>

In diesem Fall wird /bin/bash anstelle des im Dockerfile definierten ENTRYPOINT ausgeführt. Beachten Sie, dass wenn ENTRYPOINT überschrieben wird, die Werte in CMD nicht als Parameter verwendet werden. Eventuelle Parameter müssen dann direkt im docker run Befehl angegeben werden.

7.7.1 command und args mit kubectl

In einem Kubernetes Pod-Manifest können command und args in der spec verwendet werden, um ENTRYPOINT und CMD des Docker-Images zu überschreiben oder zu erweitern.

Beispiel:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    command: ["/usr/bin/dumb-init"]
    args: ["--", "nginx", "-g", "daemon off;"]

In diesem Beispiel:

Das Ergebnis wäre ähnlich, als ob Sie den Container mit dem Befehl docker run wie folgt gestartet hätten:

docker run my-image /usr/bin/dumb-init -- nginx -g daemon off;