Erstellen, Hochladen, Abrufen und Bereitstellen von Docker-Images (mithilfe von Alibaba Cloud)

Erstellen, Hochladen, Abrufen und Bereitstellen von Docker-Images (mithilfe von Alibaba Cloud)

Da ich während des Lernvorgangs festgestellt habe, dass beim Push-Image immer eine Zeitüberschreitung auftrat, habe ich direkt ein Docker-Repository bei Alibaba Cloud beantragt (Management Center -> Mirror-Repository erstellen -> Meins ist East China 2, einfach das GitHub-Konto binden), fertig! Verwenden Sie beim Pushen in Zukunft dieses Repository, verwenden Sie beim Pullen den Beschleuniger, achten Sie darauf, je nach Nutzungsszenario zu wechseln, verwerfen Sie Dockerhub ... zeichnen Sie den Vorgang auf:

1. Erstellen Sie einen Namespace hhu (basierend auf der aktuellen Schule, kann nur Kleinbuchstaben enthalten, jedes Konto kann nur 5 erstellen), erstellen Sie das Rookie-Docker-Image-Warehouse docker1 (binden Sie es an ein Warehouse in GitHub, Einzelpersonen können es nach Belieben verwenden, dieses Warehouse-Image ist wie eine App, Sie können seine Version kontinuierlich aktualisieren), dann können alle Testimages hierher gepusht werden und andere Image-Warehouses können in Zukunft für andere spezielle Images angewendet werden (fordern Sie beispielsweise beim Erstellen von Tomcat ein separates Image-Warehouse Tomcat an, beim Erstellen von Redis ein Redis-Warehouse usw.). Beenden;

2. Spiegelbildproduktion, dieser Schritt wird unten separat und detailliert beschrieben;

3. Image-Push: Nachdem die Produktion abgeschlossen ist, muss das Image in das Image-Test-Warehouse zu Docker1 gepusht werden. Die grundlegenden Informationen sind wie folgt:

1. Öffentliche Netzwerkadresse: registry.cn-shanghai.aliyuncs.com/hhu/docker1

2. Intranet-Adresse (optional für ECS): registry-internal.cn-shanghai.aliyuncs.com/hhu/docker1

3. Code-Repository (d. h. das gebundene Repository auf GitHub): https://github.com/Jacksonary/Docker

Mein erstes Docker-Image heißt jacksonary/myfirstapp. Ich habe mich entschieden, es basierend auf den Netzwerkbedingungen in das öffentliche Netzwerk zu übertragen. Der Hauptprozess ist wie folgt:

# 1. Wechseln Sie vom Beschleuniger zur Lageradresse, um sich anzumelden: Docker-Login [email protected] registry.cn-shanghai.aliyuncs.com

# 2. Erstellen Sie ein Tag für das Image basierend auf seinem Namen oder seiner ID. Der Standardwert ist der neueste Docker-Tag jacksonary/myfirstapp registry.cn-shanghai.aliyuncs.com/hhu/docker1[:Image-Versionsnummer]

# 3. Pushen Sie das Image Docker Push Registry.cn-shanghai.aliyuncs.com/hhu/docker1 [: Image-Versionsnummer]

Sie können das gepushte Bild dann wie folgt im Alibaba Cloud Warehouse anzeigen:

Beim Abrufen der obigen Bilddatei müssen Sie die Bildversionsnummer angeben. Es wird daher empfohlen, die erforderliche Bildversionsnummer hinzuzufügen, um sie beim Pushen des Bilds unterscheiden zu können. Wenn ich das obige Bild abrufen muss, kann ich Folgendes tun:

# Da die neueste Version standardmäßig die neueste ist, können Sie dieses Feld beim Abrufen leer lassen oder hinzufügen: latest (empfohlen) docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1

1. Erstellung eines Docker-Images

Im Allgemeinen wird ein Projekt in einem Ordner abgelegt. Auf der offiziellen Website gibt es beispielsweise ein Projekt namens flask-app, sodass sich alle Dateien im Projektverzeichnis befinden. Wir müssen im Stammverzeichnis des Projekts eine Textdatei mit dem Namen „Dockerfile“ hinzufügen, das txt-Suffix entfernen und dann mit einem gängigen Texteditor die Docker-Umgebung schreiben, beispielsweise die folgende Docker-Datei:

# 1. Geben Sie das Basis-Image als Linux an (das Alipine Docker-Image ist ein leichtes Linux-System mit nur 5 MB)
AB alpin:3.5

# Installieren Sie Python und Pip unter alipine. Diese App ist in Python geschrieben, daher müssen Sie die Python-Umgebung installieren, normalerweise durch Kopieren von Dateien und Installieren von Abhängigkeiten. RUN apk add --update py2-pip

# Installieren Sie das erforderliche Python. KOPIEREN Sie die von der App benötigte Datei requirements.txt /usr/src/app/
Führen Sie den Befehl „pip install --no-cache-dir -r /usr/src/app/requirements.txt“ aus.

# Kopieren Sie die von der Anwendung benötigten Dateien in das Image COPY app.py /usr/src/app/
KOPIEREN Sie templates/index.html /usr/src/app/templates/

# Legen Sie die Portnummer fest, die freigegeben werden soll EXPOSE 5000

# Richten Sie die Anwendung so ein, dass die Python-Anwendung über cmd gestartet wird CMD ["python", "/usr/src/app/app.py"]

Erstellen Sie dann ein Docker-Image, gehen Sie mit PowerShell in das Stammverzeichnis des Projekts (wo sich das Dockerfile befindet) und führen Sie

Docker Build -t Jacksonary/meineersteApp.

Hier ist zu beachten, dass wir „Dockerfile“ direkt als Namen für die Docker-Konfigurationsdatei schreiben können, wenn wir jedoch andere Namen für die Konfigurationsdatei verwenden, müssen wir diese zusätzlich angeben. Wenn wir beispielsweise „jdk-9-alpine.Dockerfile“ als Docker-Konfigurationsdatei bezeichnen, sollten wir die Konfigurationsdatei mit -f angeben und wie folgt schreiben:

docker build -t jacksonary/myfirstapp -f jdk-9-alpine.Dockerfile .

Der Befehl -t kennzeichnet das aktuell erstellte Image als „jacksonary/myfirstapp“. Die erste Hälfte von / muss Ihre Docker-Benutzerkennung sein (wenn Sie das Dockerhub-Repository verwenden, verwendet Dockerhub standardmäßig Ihren Benutzernamen. Wenn Sie Alibaba Cloud verwenden, kann ich einen beliebigen Namen wählen). Die zweite Hälfte von / ist der Name der Anwendung. Zusammen werden sie als Tag des Images verwendet. Der URL-Pfad dahinter kann nicht verloren gehen. Der Punkt zeigt den aktuellen Pfad an. Nach der Ausführung wird es automatisch auf der aktuellen HV-VM veröffentlicht. Anhand von Docker-Images können Sie sehen, dass ein zusätzliches „jacksonary/myfirstapp“-Image vorhanden ist. Damit ist der Vorgang abgeschlossen.

[Zusammenfassung] In Bezug auf die Dockerfile-Dateikonfiguration müssen Sie:

1. Die Dockerfile-Datei muss mit FROM beginnen, gefolgt vom Basiscontainer und der Version, die den übergeordneten Container des aktuellen Images angeben. Der übergeordnete Container liegt normalerweise in der Form „Benutzername/Imagename: Versionsnummer“ vor (dies ist in Dockerhub dasselbe).

2. Mit der RUN-Anweisung wird das aktuelle Docker-Image erstellt. Bei jedem Aufruf dieser Anweisung erstellt Docker eine neue Image-Ebene, wodurch ein Rollback zur vorherigen Image-Version einfacher wird. Die Syntax besteht darin, auf RUN eine Shell-Anweisung (z. B. RUN mkdir /user/local/foo) folgen zu lassen, die automatisch die /bin/sh-Shell ausführt. Natürlich können Sie auch Folgendes angeben, z. B.: RUN /bin/bash -c 'mkdir /user/local/foo'

3. Mit dem COPY-Befehl können Sie lokale Dateien in den Container kopieren

4. Der durch die CMD-Anweisung definierte Befehl wird ausgeführt, wenn das Image gestartet wird. Im Gegensatz zur RUN-Anweisung erstellt sie keine neue Image-Ebene, sondern führt einfach die Anweisung aus. In der Dockerfile-Datei jedes Images kann nur eine CMD-Anweisung oder mehrere Anweisungen ausgeführt werden (in diesem Fall ist es am besten, CMD als Skript auszuführen). Wenn CDM Anweisungen ausführt, müssen wir angeben, wo diese Anweisungen ausgeführt werden sollen, während RUN dies nicht angeben muss, wie beispielsweise die folgende CMD-Anweisung

CMD ["python", "./app.py"]

CMD ["/bin/bash", "echo", "Hallo Welt"]

5. Mit dem EXPOSE-Befehl wird der Port angegeben, auf dem das Image-Programm Dienste bereitstellen soll. Diese Informationen können mit dem Befehl docker inspect <container-id> abgerufen werden, aber der EXPOSE-Befehl legt den Port nicht tatsächlich für den Host offen. Stattdessen muss er beim Veröffentlichen mit docker run mit dem Flag -p offengelegt werden. Das oben genannte kleine p muss die Zuordnung zwischen dem Host- zum virtuellen Port und dem Host-Port angeben, während das große P den Port im Image einem zufälligen Port auf dem Host offenlegt. Der konkret offengelegte Port kann beispielsweise über docker ps angezeigt werden:

Wie in der obigen Abbildung zu sehen ist, ist der gespiegelte Port 8080 dem Port 32768 des Hosts ausgesetzt, der über localhost:32768 angezeigt werden kann.

6. Der PUSH-Befehl kann das Image auf Plattformen wie Docker Cloud veröffentlichen

7. Der ENV-Befehl wird zum Konfigurieren von Umgebungsvariablen verwendet, wie zum Beispiel:

# Konfigurieren Sie Java-Umgebungsvariablen, bei denen es sich um Standard-JAVA-Umgebungsvariablen in Linux ENV JAVA_HOME=/opt/jdk-9 handelt
ENV PATH=$PATH:$JAVA_HOME/bin

2. Bereitstellen und Ausführen des Images

Nachdem Sie das Image erstellt haben, können Sie es ausführen. Hier ist das Image, das ich gemäß dem Tutorial erstellt habe: docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1, das heruntergeladen und in Docker ausgeführt werden kann:

Docker-Pull-Registrierung.cn-shanghai.aliyuncs.com/hhu/docker1

docker run -p 8888:5000 --name myfirstapp registry.cn-shanghai.aliyuncs.com/hhu/docker1

Die Direktive -p (dies ist sehr wichtig) bedeutet, dass der freigegebene Port 5000 auf der virtuellen Maschine dem lokalen Port 8888 zugeordnet wird und das Image myfirstapp genannt wird. Sie können die Git-Map von Cats unter http://localhost:8888 anzeigen. Bei jeder Aktualisierung wird zufällig eine andere Cat-Map abgerufen.

3. Bild-Push

Die vollständige Adresse der Docker-Image-Datei befindet sich am Anfang des Artikels: https://github.com/Jacksonary/Docker/tree/master/flask-app

4. Bereitstellung einfacher JAVA-Anwendungen

Es handelt sich um ein einfaches Java-Projekt, das mit Maven gepackt wurde. Gehen wir in unser Arbeitsverzeichnis und führen

mvn-Archetyp:generieren -DgroupId=edu.hhu.java -DartifactId=hallowelt -DinteractiveMode=false

Erstellen Sie ein einfaches Maven Java-Projekt. Ich weiß, dass die meisten Leute dies erfolgreich ausführen können, aber einige wenige Leute können mit diesem Befehl kein Projekt erstellen (ich bin einer von ihnen).

In diesem Verzeichnis gibt es kein POM.

Ich gab ihm mit verwirrtem Gesichtsausdruck einen leeren POM und er bekam zur Antwort, dass der POM keine Daten enthielt. Nun, machen wir es anders. Sagen wir ihm, dass wir ein Projekt erstellen möchten:

MVN-Archetyp: Generieren

Dann werden wir gefragt, ob wir das integrierte Skelett möchten. Wählen Sie 7: maven-archetype-quickstart und geben Sie dann die Informationen groupID und artifactId gemäß den Eingabeaufforderungen ein. Schließlich werden Sie gefragt, ob Sie packen möchten. Packen Sie einfach (dann wird das JAR-Paket im Zielverzeichnis angezeigt). Okay, dieser Schritt ist abgeschlossen. Sehen Sie, ob dieses Projekt verwendet werden kann:

java -cp target/helloworld-1.0-SNAPSHOT.jar edu.hhu.java.App

Darunter gibt -cp den Paketpfad aller Klassen an, die zur Ausführung dieser Klassendatei erforderlich sind, also den Pfad des Systemklassenladers. Das Standardskelett begrüßt Sie mit „Hallo Welt“. OK, das Java-Projekt ist erstellt.

Der zweite Schritt besteht darin, die Docker-Konfigurationsdatei Dockerfile zu schreiben:

VON openjdk:latest

KOPIEREN Sie target/helloworld-1.0-SNAPSHOT.jar /usr/src/helloworld-1.0-SNAPSHOT.jar

CMD java -cp /usr/src/helloworld-1.0-SNAPSHOT.jar edu.hhu.java.App

Der dritte Schritt besteht darin, einen Spiegel zu erstellen und auszuführen

Docker Build -t Jacksonary/Hallo Welt.

Docker Run Jacksonary/Hallo Welt

4. Komplexe Multi-Container-Anwendungen in Docker (Docker-Compose)

In der tatsächlichen Entwicklung sind oft mehrere Dienste erforderlich, nicht nur das Drucken eines Satzes in Ubuntu, wie z. B. die Interaktion mit einer Datenbank im WEB. Solche Anwendungen bestehen normalerweise aus mehreren Containern. Zum Starten dieser Container ist keine Shell erforderlich. Alle Container werden in einer Konfigurationsdatei als „Dienstgruppe“ definiert, ähnlich wie bei Dockerfile, in das Stammverzeichnis des Projekts geschrieben und können dann verwendet werden

docker-compose up -d

Mit dem Docker-Compose-Skript können Sie die Anwendung und alle Dienste in der Anwendung starten, stoppen und neu starten. Der vollständige Befehl von Docker-Compose lautet wie folgt:

Anweisung Inhalt

bauen

Dienste erstellen oder neu erstellen

helfen

Hilfe zu einem Befehl erhalten

töten

Behälter töten

Protokolle

Anzeigen der Ausgabe aus Containern

Hafen

Drucken Sie den öffentlichen Port für eine Portbindung

ps

Auflisten von Containern

ziehen

Ruft Service-Bilder ab

Neustart

Dienste neu starten

rm

Angehaltene Container entfernen

laufen

Einen einmaligen Befehl ausführen

Skala

Festlegen der Anzahl von Containern für einen Dienst

Start

Dienste starten

stoppen

Dienste beenden

hoch

Erstellen und Starten von Containern

Der Einstiegspunkt für diese gemeinsam definierten Docker-Komponentendienste ist die Docker-Compse-Konfigurationsdatei, die normalerweise in Form einer YML-Datei vorliegt, beispielsweise in der folgenden Datei „docker-compse.yml“ (beachten Sie, dass beim Konfigurieren jeder Eigenschaft, mit Ausnahme der Portzuordnung, nach dem Doppelpunkt ein Leerzeichen hinzugefügt werden muss):

Version: '3.3'
Leistungen:
 db:
 Containername: db
 Bild:mysql:8
 Umfeld:
  MYSQL_DATABASE: Mitarbeiter
  MYSQL_USER: mysql
  MYSQL_PASSWORD: mysql
  MYSQL_ROOT_PASSWORD: supergeheim
 Häfen:
  - 3307:3306
 Webseite:
 Bild: arungupta/docker-javaee:dockerconeu17
 Häfen:
  -8081:8080
  -9991:9990
 hängt ab von:
  -db

In der oben kombinierten Datei:

1. Definieren Sie zwei Dienste: db und web

2. Das Bildattribut gibt die Bilddatei für jedes Servicewort an

3. Das mysql:8-Image startet den MySql-Dienst

4. Das Umgebungsattribut definiert die MySQL-Dienstumgebungsvariablen für die Initialisierung: MYSQL_DATABASE wird verwendet, um beim Starten des Images eine Datenbank mit einem angegebenen Namen zu erstellen. MYSQL_USER und MYSQL_PASSWORD werden kombiniert, um einen neuen Benutzer zu erstellen und ein Kennwort festzulegen. Diesem Benutzer werden Superrechte für die von MYSQL_DATABASE erstellte Datenbank gewährt. MYSQL_ROOT_PASSWORD ist obligatorisch, um das MySQL-Superuser-Kennwort festzulegen.

5. Ports implementieren Portweiterleitung, der vordere ist der Host, der hintere ist die virtuelle Maschine

6. Das Attribut „depends_on“ gibt die Abhängigkeit zwischen zwei Diensten an. In diesem Fall ist WildFly (ein Anwendungsserver) von MySQL abhängig, sodass MySQL vor WildFly gestartet wird.

Nachdem die oben kombinierte Konfigurationsdatei vorliegt, betritt PW das Verzeichnis, in dem sich die Datei befindet, und verwendet dann docker-compose up -d, um die beiden Dienste im Isolationsmodus zu starten. docker ps kann die Zuordnung zwischen den Ports anzeigen und es kann auch festgestellt werden, dass zwei Container gestartet sind. docker-compose logs kann die Dienstprotokolle anzeigen. Zu diesem Zeitpunkt können wir über http://localhost:8081/resources/employees auf alle Personalinformationen zugreifen und diese Gruppe von Diensten stoppen:

Docker-Compose nach unten

Der obige Artikel zum Erstellen, Hochladen, Abrufen und Bereitstellen von Docker-Images (mit Alibaba Cloud) ist alles, was ich mit Ihnen teilen möchte. Ich hoffe, er kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen.

Das könnte Sie auch interessieren:
  • Docker-Pull-Image und Tag-Vorgang Pull | Tag
  • Python-Skript löst Docker-Image-Problem aus
  • Führen Sie die folgenden Schritte aus, damit Docker Images abrufen kann
  • So ziehen Sie das Docker-Image herunter, um die Version anzuzeigen
  • Detaillierte Erläuterung der Konfigurationsänderung für das Ziehen von inländischen Docker-Images und die Image-Beschleunigung für Registry-Mirrors
  • Lösen Sie das Problem, dass Docker das MySQL-Image zu langsam zieht

<<:  Implementierungscode für die teilweise Aktualisierung einer HTML-Seite

>>:  Detailliertes Beispiel für die Statusverwaltung der Hilfsfunktion der Vue-Frontend-Entwicklung

Artikel empfehlen

Grundlegende MySQL-Tabellenabfragen – häufige Fehler beim Left-Join

Überblick Bei kleinen und mittelgroßen Projekten ...

Kalendereffekt basierend auf jQuery

In diesem Artikelbeispiel wird der spezifische Co...

SVN-Installation und grundlegende Bedienung (grafisches Tutorial)

Inhaltsverzeichnis 1. Was ist SVN? 2. Methoden zu...

Implementierungscode für die teilweise Aktualisierung einer HTML-Seite

Aktualisierung der Ereignisantwort: Aktualisierun...

Detailliertes Tutorial zur Installation von MySQL 5.7 auf RedHat 6.5

RedHat6.5 Installation MySQL5.7 Tutorial teilen, ...

Detaillierter Installationsprozess von Jenkins unter Linux

Inhaltsverzeichnis 1. Installieren Sie JDK 2. Jen...

Detaillierte Erklärung zur Installation der PHP-Curl-Erweiterung unter Linux

Dieser Artikel beschreibt, wie man die PHP-Curl-E...

HTML-Tutorial, leicht zu erlernende HTML-Sprache

1. <body background=Bilddateiname bgcolor=Farb...

Beispiel-Tutorial zur JavaScript-Typerkennungsmethode

Vorwort JavaScript ist eine der am häufigsten ver...

Lassen Sie sich die tiefe Kopie von js verstehen

Inhaltsverzeichnis js tiefe Kopie Methode der Dat...

Vergleich der Vorteile von vue3 und vue2

Inhaltsverzeichnis Vorteil 1: Optimierung des Dif...

Beispiel für die Validierung eines JavaScript-Formulars

HTML-Formulare werden häufig verwendet, um Benutz...

Flammenanimation mit CSS3 umgesetzt

Ergebnisse erzielen Implementierungscode html <...

Detaillierte Erklärung der HTML-Formularelemente (Teil 1)

HTML-Formulare werden verwendet, um verschiedene ...