Wie man den docker compose push Befehl zum Pushen von Service-Images verwendet

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie den Befehl docker compose push verwenden, um Service-Images, die in einer docker-compose.yaml-Datei definiert sind, in eine Registry (Container-Registry) zu pushen. Sie beginnen mit der Vorbereitung einer docker-compose.yaml-Datei mit Service-Images, bauen diese Images anschließend und üben schließlich das Pushen der Service-Images in eine Registry. Dabei lernen Sie auch, wie Sie potenzielle Fehler während des Push-Vorgangs behandeln können.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/tag("Tag an Image") docker/ImageOperationsGroup -.-> docker/push("Push Image to Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/pull -.-> lab-555088{{"Wie man den docker compose push Befehl zum Pushen von Service-Images verwendet"}} docker/tag -.-> lab-555088{{"Wie man den docker compose push Befehl zum Pushen von Service-Images verwendet"}} docker/push -.-> lab-555088{{"Wie man den docker compose push Befehl zum Pushen von Service-Images verwendet"}} docker/images -.-> lab-555088{{"Wie man den docker compose push Befehl zum Pushen von Service-Images verwendet"}} docker/build -.-> lab-555088{{"Wie man den docker compose push Befehl zum Pushen von Service-Images verwendet"}} end

Vorbereiten einer docker-compose.yaml-Datei mit Service-Images

In diesem Schritt lernen Sie, wie Sie eine docker-compose.yaml-Datei erstellen, um Multi-Container-Docker-Anwendungen zu definieren und zu verwalten. Docker Compose ist ein Tool, mit dem Sie Multi-Container-Docker-Anwendungen definieren und ausführen können. Mit Compose verwenden Sie eine YAML-Datei, um die Services Ihrer Anwendung zu konfigurieren. Anschließend können Sie mit einem einzigen Befehl alle Services aus Ihrer Konfiguration erstellen und starten.

Navigieren Sie zunächst zum Projektverzeichnis:

cd ~/project

Erstellen Sie nun eine docker-compose.yaml-Datei mit dem nano-Editor. Diese Datei definiert zwei Services: einen Web-Service und einen Datenbank-Service.

nano docker-compose.yaml

Fügen Sie folgenden Inhalt in die docker-compose.yaml-Datei ein:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: mysecretpassword

Hier die Erklärung der Datei:

  • version: '3.8' gibt die Version des Docker Compose-Dateiformats an.
  • services: definiert die verschiedenen Services, aus denen Ihre Anwendung besteht.
  • web: definiert einen Service namens web.
  • image: nginx:latest legt fest, dass der web-Service das nginx:latest-Docker-Image verwendet. Falls das Image lokal nicht verfügbar ist, lädt Docker es von Docker Hub.
  • ports: verbindet Port 80 auf dem Host-Rechner mit Port 80 im Container.
  • db: definiert einen Service namens db.
  • image: postgres:latest legt fest, dass der db-Service das postgres:latest-Docker-Image verwendet.
  • environment: setzt Umgebungsvariablen im Container. Hier setzen wir das POSTGRES_PASSWORD für die PostgreSQL-Datenbank.

Speichern Sie die Datei mit Strg + X, dann Y und Enter.

Sie können den Inhalt der erstellten Datei mit dem cat-Befehl anzeigen:

cat docker-compose.yaml

Dieser Befehl zeigt den Inhalt der soeben erstellten docker-compose.yaml-Datei an, sodass Sie ihn überprüfen können.

Service-Images erstellen

Im vorherigen Schritt haben Sie Ihre Services mit vorhandenen Docker-Images in der docker-compose.yaml-Datei definiert. In diesem Schritt lernen Sie, wie Sie benutzerdefinierte Docker-Images für Ihre Services mit Dockerfiles erstellen und diese in Ihre docker-compose.yaml-Datei integrieren.

Erstellen Sie zunächst ein einfaches Verzeichnis für unseren Web-Service und ein Dockerfile darin. Navigieren Sie zum Projektverzeichnis, falls Sie sich nicht bereits dort befinden:

cd ~/project

Erstellen Sie ein Verzeichnis namens web und wechseln Sie hinein:

mkdir web
cd web

Erstellen Sie nun mit dem nano-Editor ein Dockerfile namens Dockerfile im web-Verzeichnis:

nano Dockerfile

Fügen Sie folgenden Inhalt in das Dockerfile ein:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Dieses Dockerfile bewirkt folgendes:

  • FROM ubuntu:latest: Verwendet das neueste Ubuntu-Basis-Image.
  • RUN apt-get update && apt-get install -y nginx: Aktualisiert die Paketliste und installiert Nginx.
  • COPY index.html /var/www/html/: Kopiert eine index.html-Datei (die wir als nächstes erstellen) in das Nginx-Webroot-Verzeichnis.
  • EXPOSE 80: Öffnet Port 80 im Container.
  • CMD ["nginx", "-g", "daemon off;"]: Gibt den Befehl an, der beim Start des Containers ausgeführt wird, um Nginx im Vordergrund zu starten.

Speichern Sie das Dockerfile mit Strg + X, dann Y und Enter.

Erstellen Sie nun die index.html-Datei, die das Dockerfile kopiert. Bleiben Sie im Verzeichnis ~/project/web und erstellen Sie die Datei:

nano index.html

Fügen Sie folgenden einfachen HTML-Inhalt in index.html ein:

<!doctype html>
<html>
  <head>
    <title>Hello from Docker!</title>
  </head>
  <body>
    <h1>Welcome to my Dockerized Nginx!</h1>
    <p>This page is served from a custom Docker image.</p>
  </body>
</html>

Speichern Sie die index.html-Datei mit Strg + X, dann Y und Enter.

Navigieren Sie zurück zum Projektstammverzeichnis, wo sich Ihre docker-compose.yaml-Datei befindet:

cd ~/project

Wir müssen die docker-compose.yaml-Datei anpassen, um den web-Service aus dem erstellten Dockerfile zu bauen, anstatt ein vorgefertigtes Image zu verwenden. Öffnen Sie die docker-compose.yaml-Datei zur Bearbeitung:

nano docker-compose.yaml

Ändern Sie die Definition des web-Services, um die build-Anweisung anstelle von image zu verwenden:

version: "3.8"
services:
  web:
    build: ./web
    ports:
      - "80:80"
  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: mysecretpassword

Hier gibt build: ./web an, dass Docker Compose das Image für den web-Service mit dem Dockerfile im Verzeichnis ./web (relativ zur docker-compose.yaml-Datei) erstellen soll.

Speichern Sie die geänderte docker-compose.yaml-Datei mit Strg + X, dann Y und Enter.

Nun können Sie die in Ihrer docker-compose.yaml-Datei definierten Images mit dem Befehl docker-compose build erstellen. Da Docker Compose nicht vorinstalliert ist, müssen Sie es zuerst installieren.

sudo apt-get update
sudo apt-get install docker-compose-plugin -y

Nach der Installation des Docker Compose-Plugins können Sie den Befehl docker compose verwenden (beachten Sie das Leerzeichen statt eines Bindestrichs in neueren Versionen).

docker compose build

Dieser Befehl liest Ihre docker-compose.yaml-Datei und erstellt das Image für den web-Service basierend auf dem Dockerfile im ./web-Verzeichnis. Er lädt außerdem das postgres:latest-Image für den db-Service, falls es noch nicht vorhanden ist. Sie sehen eine Ausgabe, die den Build-Prozess für das web-Image anzeigt.

Nach Abschluss des Builds können Sie die Docker-Images auf Ihrem System auflisten, um das neu erstellte Image zu sehen.

docker images

Sie sollten ein Image mit einem Namen sehen, der mit Ihrem Projektverzeichnis und dem Service-Namen verknüpft ist (z.B. project-web) sowie das postgres-Image.

Service-Images in eine Registry pushen

Im vorherigen Schritt haben Sie ein benutzerdefiniertes Docker-Image für Ihren Web-Service erstellt. Nun lernen Sie, wie Sie diese Images in eine Docker-Registry pushen können. Eine Docker-Registry ist ein Speicher- und Verteilungssystem für Docker-Images. Docker Hub ist eine öffentliche Registry, Sie können aber auch private Registries betreiben. Durch das Pushen von Images in eine Registry können Sie diese mit anderen teilen oder auf verschiedenen Maschinen deployen.

Vor dem Pushen müssen Sie Ihre Images typischerweise mit der Registry-Adresse, Ihrem Benutzernamen und dem Image-Namen taggen. Für dieses Lab simulieren wir das Pushen in eine lokale Registry oder eine Registry, die für die Vereinfachung keine Authentifizierung erfordert. In einem realen Szenario würden Sie sich zuerst mit docker login bei der Registry anmelden.

Listen Sie zunächst Ihre vorhandenen Images auf, um das für den Web-Service erstellte Image zu identifizieren. Navigieren Sie zum Projektverzeichnis, falls Sie sich nicht bereits dort befinden:

cd ~/project

Listen Sie die Docker-Images auf:

docker images

Sie sollten ein Image mit einem Namen wie project-web sehen. Der genaue Name kann je nach Projektverzeichnis leicht variieren.

Taggen Sie nun das project-web-Image, damit es in eine Registry gepusht werden kann. Wir verwenden eine hypothetische Registry-Adresse your-registry.example.com. Ersetzen Sie your-registry.example.com durch die tatsächliche Registry-Adresse, wenn Sie in eine echte Registry pushen würden. Für diese Übung verwenden wir localhost:5000, um eine lokale Registry zu simulieren.

docker tag project-web localhost:5000/my-web-app:latest

Dieser Befehl taggt das project-web-Image mit dem Namen localhost:5000/my-web-app:latest. localhost:5000 ist die Registry-Adresse, my-web-app der Repository-Name und latest der Tag.

Sie können den neuen Tag überprüfen, indem Sie die Images erneut auflisten:

docker images

Sie sollten nun das project-web-Image mit zwei Tags sehen: dem ursprünglichen und localhost:5000/my-web-app:latest.

Versuchen Sie nun, das getaggte Image in die simulierte lokale Registry zu pushen.

docker push localhost:5000/my-web-app:latest

Da wir eine nicht laufende lokale Registry simulieren, schlägt dieser Befehl wahrscheinlich mit einem Verbindungsfehler fehl. Dies ist in diesem Schritt erwartet, da wir uns auf den docker push-Befehl selbst konzentrieren. Im nächsten Schritt werden wir untersuchen, wie solche Fehler behandelt werden können.

In einem realen Szenario mit einer laufenden Registry würde dieser Befehl die Image-Layer in die Registry hochladen.

Service-Images pushen und Fehler ignorieren

Im vorherigen Schritt haben Sie versucht, Ihr benutzerdefiniertes Web-Service-Image in eine simulierte Registry zu pushen, was wahrscheinlich fehlgeschlagen ist, da die Registry nicht lief. In einigen Szenarien möchten Sie möglicherweise versuchen, mehrere Images zu pushen und fortzufahren, selbst wenn eines der Pushes fehlschlägt. Dies kann in Automatisierungsskripten oder beim Pushen in mehrere Registries nützlich sein.

Docker Compose bietet eine Möglichkeit, alle in Ihrer docker-compose.yaml-Datei definierten Service-Images zu pushen. Standardmäßig bricht der gesamte Befehl ab, wenn ein Push fehlschlägt. Sie können jedoch das Flag --ignore-pull-failures mit dem Befehl docker compose push verwenden. Obwohl der Name darauf hindeutet, dass Pull-Fehler ignoriert werden, beeinflusst es je nach Compose-Version und Kontext auch die Behandlung von Push-Fehlern. Eine direktere Möglichkeit, einzelne Push-Fehler in einem Skript zu behandeln, besteht darin, die Services zu durchlaufen und jeden Push-Versuch einzeln durchzuführen, wobei Fehler für jeden Push behandelt werden.

Listen wir zunächst die in Ihrer docker-compose.yaml-Datei definierten Services auf. Navigieren Sie zum Projektverzeichnis, falls Sie sich nicht bereits dort befinden:

cd ~/project

Sie können die Service-Namen (web und db) in Ihrer docker-compose.yaml-Datei sehen.

cat docker-compose.yaml

Versuchen wir nun, alle in der docker-compose.yaml-Datei definierten Services zu pushen. Beachten Sie, dass der db-Service das postgres:latest-Image von Docker Hub verwendet und der web-Service lokal gebaut und für localhost:5000 getaggt wurde.

docker compose push

Dieser Befehl versucht, sowohl das web-Image (nach localhost:5000) als auch das postgres-Image (nach Docker Hub) zu pushen. Der Push zu localhost:5000 wird wahrscheinlich wie zuvor fehlschlagen. Der Push zu Docker Hub für postgres könnte erfolgreich sein, wenn Sie Internetzugang haben und das Image noch nicht in der Registry vorhanden ist (obwohl Sie normalerweise offizielle Images wie postgres nicht in Ihre eigene Registry pushen würden). Der Befehl wird wahrscheinlich einen Fehler aufgrund der fehlenden Verbindung zu localhost:5000 melden.

Um das Ignorieren von Fehlern zu demonstrieren, betrachten wir ein Szenario, in dem Sie mehrere Services haben und diese unabhängig voneinander pushen möchten, selbst wenn einer fehlschlägt. Während docker compose push kein direktes "ignore-push-failures"-Flag für alle Services auf einmal bietet, können Sie ein ähnliches Verhalten in einem Skript erreichen, indem Sie die Services durchlaufen und jeden Push-Versuch einzeln durchführen.

Der entscheidende Punkt hier ist das Verständnis, dass das Pushen von Images ein kritischer Schritt im CI/CD-Pipeline ist und der Umgang mit potenziellen Fehlern (wie Netzwerkproblemen oder Authentifizierungsfehlern) wichtig ist. Während docker compose push standardmäßig beim ersten Fehler abbricht, würden Sie in Skripts oder fortgeschritteneren Szenarien Logik implementieren, um einzelne Push-Ergebnisse zu behandeln.

Lassen Sie uns bestätigen, dass der docker compose push-Befehl ausgeführt wurde.

grep "docker compose push" ~/.zsh_history

Dies bestätigt, dass Sie versucht haben, die Images mit Docker Compose zu pushen. Die Ausgabe des Befehls selbst würde den Fehler für den web-Service-Push anzeigen.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man eine docker-compose.yaml-Datei vorbereitet, um Multi-Container-Docker-Anwendungen zu definieren. Dabei haben Sie speziell Services wie einen Webserver (nginx) und eine Datenbank (PostgreSQL) mit ihren jeweiligen Images, Ports und Umgebungsvariablen konfiguriert. Anschließend haben Sie geübt, diese Service-Images basierend auf den Definitionen in der docker-compose.yaml-Datei zu bauen.

Darüber hinaus haben Sie untersucht, wie man diese gebauten Service-Images mit dem Befehl docker compose push in eine Docker-Registry pusht. Sie haben auch gelernt, wie man potenzielle Fehler während des Push-Vorgangs mit dem Flag --ignore-push-failures behandelt, wodurch der Push-Vorgang fortgesetzt werden kann, selbst wenn einige Images nicht hochgeladen werden können.