.NETCore Docker implementiert Containerisierung und privates Image-Repository-Management

.NETCore Docker implementiert Containerisierung und privates Image-Repository-Management

1. Einführung in Docker

Docker wurde in der Programmiersprache Go entwickelt und basiert auf einigen Funktionen des Linux-Betriebssystems. Es bietet Abstraktion auf Betriebssystemebene und ist eine Containerverwaltungstechnologie, die die Abhängigkeit der Anwendung von der Infrastruktur (Betriebssystem usw.) isoliert. Im Vergleich zu virtuellen Maschinen teilt Docker die Hardwareressourcen des Hostcomputers und verwendet Container, um eine unabhängige Betriebsumgebung zum Ausführen von Anwendungen bereitzustellen. Die virtuelle Maschine basiert auf dem Supervisor (Hypervisor der virtuellen Maschine), der Virtualisierungstechnologie verwendet, um isolierte virtuelle Maschinen bereitzustellen und eine Ausführungsumgebung auf dem Betriebssystem der virtuellen Maschine bereitzustellen! Obwohl beide eine hervorragende Ressourcenisolierung bieten, ist klar, dass Docker den geringeren Virtualisierungs-Overhead aufweist!

Docker umfasst drei Kernkonzepte: Register, Image und Container.

1. Registrierung: Lager. Wird zum Speichern von Docker-Images verwendet. Beispielsweise ist Dockers offizieller Docker Hub ein öffentliches Lager, in dem wir die benötigten Images herunterladen können.

2. Bild: Bild. Entwickler erstellen eine Anwendung oder einen Dienst und packen diese und ihre Abhängigkeiten in ein Container-Image. Ein Image ist eine statische Darstellung der Konfiguration einer Anwendung und ihrer Abhängigkeiten.

3. Behälter: Behälter. Ein Container ist eine laufende Instanz eines Images. Es handelt sich um eine isolierte, ressourcengesteuerte, portable Laufzeitumgebung, die ein Betriebssystem, auszuführende Programme, Abhängigkeiten laufender Programme, Umgebungsvariablen usw. enthält.

Die Interaktion zwischen den dreien ist:

Wenn wir den Befehl „Docker pull“ oder „Docker run“ ausführen und das erforderliche Image lokal nicht verfügbar ist, wird ein Image aus dem Repository (normalerweise DockerHub) heruntergeladen (pull). Docker führt die Run-Methode aus, um einen Container abzurufen, und der Benutzer führt verschiedene Vorgänge im Container aus. Docker führt die Commit-Methode aus, um einen Container in ein Image zu konvertieren. Docker verwendet Befehle wie „Login“ und „Push“, um lokale Images in das Warehouse zu übertragen. Das Image kann auf anderen Maschinen oder Servern verwendet werden, um Container zu generieren und entsprechende Anwendungen auszuführen.

2. Docker-Installation

1. Verwenden Sie zur Installation die Yum-Quelle. Da der Zugriff auf die offizielle Quelle in China langsam ist, fügen Sie hier die Alibaba-Quelle hinzu

 > wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 > yum install -y docker-ce

2. Docker starten

 //Docker CE starten
 > systemctl Docker starten
 > systemctl Docker aktivieren
 //Docker-Status prüfen> systemctl status docker
 // Überprüfen Sie die Docker-Version> Docker -v

3. Testen Sie, ob Docker korrekt installiert ist und führen Sie den Befehl aus:

> docker run hello-world

a. Wenn Sie docker run hello-world ausführen, sucht Docker zuerst lokal nach dem Hello-World-Image. Wenn es lokal nicht verfügbar ist, wird das Image aus dem Standard-Image-Repository Docker Hub abgerufen. Nachdem das Image lokal heruntergeladen wurde, wird das Image instanziiert, um einen Container zu erhalten, und „Hallo von Docker!“ wird ausgegeben.

b. Docker Engine stellt die Kerntechnologien von Docker bereit: Images und Container. Im letzten Schritt des Installationstutorials haben Sie den Engine-Befehl docker run hello-world ausgeführt. Dieser Befehl ermöglicht es Engine, die Kernaufgaben von Docker abzuschließen. Der Befehl besteht aus drei Teilen.

c. Ein Container ist eine vereinfachte Version des Linux-Betriebssystems. Ein Image ist die in diesen Container geladene Software. Wenn Sie diesen Befehl ausführen, führt Engine Folgendes aus:

1. Überprüfen Sie, ob das Hello-World-Software-Image vorhanden ist

2. Laden Sie das Image von Docker Hub herunter (mehr zu Docker Hub erfahren Sie später)

3. Laden Sie dieses Image in den Container und führen Sie es aus

3. Ausführen des .Netcore-Projekts in Docker

1. Laden Sie das Microsoft/dotnet-Image herunter und warten Sie einige Minuten, bis die Installation abgeschlossen ist. Führen Sie docker images aus, um zu sehen, dass der lokale Computer das Microsoft/dotnet-Image bereits enthält.

> docker pull microsoft/dotnet

2. Führen Sie das Microsoft/Dotnet-Image aus. Verwenden Sie docker run <image> , um das Image zu starten, und geben Sie den Parameter „-it“ an, um es im interaktiven Modus zu starten (geben Sie den Container ein). Führen Sie die folgenden Befehle nacheinander aus:

 > docker run -it microsoft/dotnet //Starten Sie ein Dotnet-Image> dotnet new mvc -n mvctest //Erstellen Sie ein .NET Core MVC-Projekt mit dem Namen mvctest> cd mvctest //Geben Sie den Ordner mvctest ein> dotnet run //Starten Sie das .NET Core MVC-Projekt

Die Laufergebnisse sind in der folgenden Abbildung dargestellt:

Drücken Sie Strg+C auf der Tastatur, um die Anwendung zu schließen, und geben Sie exit ein, um den aktuellen Container zu verlassen

Mit den oben genannten einfachen Schritten ist die Erstellung und Ausführung eines .NET Core MVC-Projekts abgeschlossen. An dieser Stelle sind Sie vielleicht neugierig. Das .NET Core SDK ist nicht auf dem Linux-Host installiert. Wie wird das MVC-Projekt erstellt? Hier kommt die Magie von Docker zum Tragen. Das Dotnet-Image, das wir aus dem Image-Repository gezogen haben, enthält alle Abhängigkeiten und die Laufzeitumgebung, die zum Erstellen, Erstellen und Ausführen von .NET Core-Projekten erforderlich sind.

Nachdem wir den Container verlassen haben, führen wir „find -name mvctest“ aus (um nach der MVCTest-Datei zu suchen) und stellen fest, dass sie nicht gefunden wird. Dies bedeutet, dass das gerade erstellte .NET Core MVC-Projekt innerhalb des Containers erstellt wird und vollständig vom Hostcomputer isoliert ist. An diesem Punkt denken Sie vielleicht, dass es zu umständlich ist, den Quellcode jedes Mal im Container zu installieren. Können wir den Container das Quellcodeprojekt unseres Hostcomputers ausführen lassen? Nun, das ist eine gute Frage. Natürlich ist das möglich. Lassen Sie uns diese Frage unten beantworten.

4. Erstellen Sie ein .NET Core-Projekt auf dem Host

Um ein .NET Core-Projekt auf dem Host zu erstellen, müssen wir das .NET Core SDK auf dem Linux-Host installieren.

1. Installieren Sie das .NET Core SDK auf dem Host

Fügen Sie die Yum-Quelle hinzu: sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm

Starten Sie die Installation: yum install -y dotnet-sdk-2.1

Überprüfen Sie die installierte Version. Die folgende Abbildung zeigt, dass die Installation korrekt ist.

2. Erstellen Sie ein .NET Core-Projekt

 > mkdir-Daten
 > CD-Daten
 > dotnet new mvc -n mvctest //Erstellen Sie ein .NET Core MVC-Projekt mit dem Namen mvctest> cd mvctest //Geben Sie den Ordner mvctest ein> dotnet run //Starten Sie das .NET Core MVC-Projekt

Hinweis: Fügen Sie den Code .UseUrls("http://*:5000") zur Datei Program.cs hinzu und greifen Sie im Browser wie unten gezeigt darauf zu:

Der nächste Schritt besteht darin, das Quellcodeprojekt in diesem Verzeichnis durch Mounten im Container freizugeben.

3. Mounten Sie das Hostprojekt in den Container


Beim Starten eines Docker-Images ermöglicht uns Docker, die Dateien des Hosts mithilfe des Parameters -v in einem angegebenen Verzeichnis im Container bereitzustellen. Mit anderen Worten, es ist gleichbedeutend mit der Freigabe der angegebenen Datei auf dem Host, damit der Container darauf zugreifen kann

// Das „\“ im Befehl bildet in Kombination mit der „Eingabe“-Taste einen Zeilenumbruch, sodass wir einen langen Befehl in einer neuen Zeile eingeben können.
 > docker run -it \
 > -v /data/mvctest/:/app \
 > microsoft/dotnet:latest

Der obige Befehl mountet die Dateien im Ordner /data/mvctest/ in das Verzeichnis \app des Containers.


Aus den obigen Ausführungsergebnissen können wir ersehen, dass das App-Verzeichnis im Container das Quellcodeprojekt auf dem Hostcomputer enthält.

Wie oben erwähnt, handelt es sich um eine gemeinsam genutzte Form, anstatt dass der Container eine Kopie des Hostverzeichnisses besitzt. Dies bedeutet, dass Änderungen am Verzeichnis auf dem Host sofort im Container widergespiegelt werden. Andererseits werden Änderungen am freigegebenen Verzeichnis im Container nicht auf dem Hostcomputer widergespiegelt, da andernfalls die Isolationseigenschaften des Containers verletzt werden.

Sind Sie anhand eines so einfachen Szenarios schlau genug, um darüber nachzudenken, wie dieses Szenario in unserem täglichen Codierungsprozess angewendet werden kann? Ja, wir können es für Continuous Build (CI) verwenden. Die Grundidee besteht darin, den Quellcode über Git auf den Hostcomputer zu klonen und dann das Quellcodeverzeichnis zur Erstellung in den Container einzubinden.

4. Mit Hilfe von Dockerfile

Im nächsten Artikel werden wir diesen Vorgang ohne die Abhängigkeit von Dockerfile aktualisieren und mit einem Befehl abschließen.

Dockerfile wird verwendet, um die Reihe von Vorgängen zu definieren, die Sie im Container ausführen werden. Erstellen wir unser erstes Dockerfile

 > cd /data/mvctest/ //Stellen Sie sicher, dass Sie das von uns erstellte MVC-Projektverzeichnis aufrufen> touch Dockerfile //Verwenden Sie den Befehl touch, um ein Dockerfile zu erstellen
 > vi Dockerfile //Verwenden Sie den Befehl vi, um Dockerfile zu bearbeiten

Nachdem Sie die VI-Bearbeitungsoberfläche aufgerufen haben, kopieren Sie den folgenden Code und fügen Sie ihn mit dem Befehl Umschalt + Einfg ein. Drücken Sie dann ESE, um den Bearbeitungsmodus zu verlassen, drücken Sie Umschalt + : und geben Sie wq ein, um zu speichern und die Bearbeitungsoberfläche zu verlassen.

VON microsoft/dotnet:latest
 ARBEITSVERZEICHNIS /app
 KOPIEREN ./app
 Führen Sie „dotnet restore“ aus.
 EXPOSE 5000
 ENV ASPNETCORE_URLS http://*:5000
 EINSTIEGSPUNKT ["dotnet","ausführen"]

Ich werde die obigen Befehle einzeln erklären:

Verwenden Sie FROM, um das vom Container verwendete Image anzugeben

Verwenden Sie WORKDIR, um das Arbeitsverzeichnis anzugeben

Verwenden Sie den Befehl COPY, um das aktuelle Verzeichnis (wobei . das aktuelle Verzeichnis darstellt) in das Verzeichnis /app im Container zu kopieren.

Verwenden Sie den Befehl RUN, um den Befehl anzugeben, der im Container ausgeführt werden soll

Verwenden Sie EXPOSE, um die vom Container freigegebene Portnummer anzugeben

Verwenden Sie ENV, um Umgebungsparameter anzugeben, die verwendet werden, um dem .NETCore-Projekt mitzuteilen, dass es auf allen Netzwerkschnittstellen auf Port 5000 lauschen soll.

Verwenden Sie ENTRYPOINT, um den Einstiegspunkt des Containers anzugeben

Nachdem die Docker-Datei nun fertig ist, können wir unser aktuelles Projekt zur Verteilung und Bereitstellung in ein Image packen.

Verwenden Sie den Befehl docker build -t <name> <path>, um das Image zu verpacken:

> docker build -t mvctest.web .

Der obige Befehl weist Docker an, das aktuelle Verzeichnis in einen Spiegel zu packen und es hellodocker.web zu nennen. Nachdem der Befehl ausgeführt wurde, geben Sie docker images ein, um unser neu gepacktes Image anzuzeigen


Nachdem das Image erstellt wurde, können wir es direkt ausführen:

> docker run -d -p 80:5000 mvctest.web

Die obige Anweisung führt unser neu gepacktes Image aus und ordnet den Port 5000 des Containers über den Parameter -p dem Port 80 des Hosts zu. Der Parameter -d weist Docker an, das Image als Hintergrundaufgabe auszuführen. Da Port 80 der Standard-Web-Port ist, können wir auf die in unserem Container ausgeführte MVC-Website zugreifen, indem wir über den Browser direkt auf die IP zugreifen.

Bisher haben wir die Containerbereitstellung des .NET Core-Projekts mithilfe von Docker perfekt abgeschlossen. Später werden wir das Image auf anderen Maschinen bereitstellen.

5. Übertragen Sie das Bild ins Lager


Bitte registrieren Sie ein Konto bei Docker Hub und legen Sie dann das lokal gepackte Image im Repository unter Ihrem Konto ab.

1. Führen Sie nach der Registrierung den Befehl aus

> docker login


2. Führen Sie den Befehl erneut aus

> docker push


Der Push ist fehlgeschlagen, was darauf hinweist, dass unsere Bildbenennung nicht der Spezifikation entspricht. Es stellt sich heraus, dass das Image vor dem Pushen im Format <Benutzer>/<Repo> benannt werden muss. Wie kann ich es umbenennen? Wir benennen es um, indem wir es taggen

Die obigen Informationen zeigen an, dass der Push erfolgreich war. Überprüfen Sie Ihr eigenes Lager, wie unten gezeigt:

Abschließend wechseln wir eine Maschine und führen folgenden Befehl direkt aus um das Mehrfach-Deployment abzuschließen.

> docker run -p 8081:5000 79522860/mvcdemo.web

Das obige Image-Repository ist fertig. Ist das nicht sehr praktisch? In Kombination mit dem Geschäft werden Sie feststellen, dass mehr Images benötigt werden. Müssen Sie die Container für die verteilte Bereitstellung von Containern einzeln starten? Nein, wir können Images und Container auch mit einem Klick über Konfigurationsdateien bereitstellen, worüber wir im nächsten Artikel sprechen werden.

6. Allgemeine Docker-Befehle

1. Containerbezogene Vorgänge

 > docker ps //Den aktuell laufenden Container anzeigen> docker ps -a //Den Status aller Container anzeigen> docker start/stop id/name //Einen Container starten/stoppen> docker attachment id //Einen Container eingeben (der Container wird auch nach dem Beenden mit exit gestoppt)
 > docker rm id/name //Container löschen. Wenn er läuft, stopp ihn zuerst> docker rm $(docker ps -a -q) //Einen gestoppten Container löschen> docker logs -f hello-world //Logdatensätze des angegebenen Containers anzeigen

> docker run -it --name hello_001 hello-world //創建一個容器,并指定標簽

-i: ermöglicht uns die Interaktion mit dem Container (STDIN)

-t: gibt ein Pseudoterminal oder Terminal im neuen Container an

--name: Geben Sie dem Container einen Namen, der weggelassen werden kann. Wenn er weggelassen wird, generiert Docker einen zufälligen Namen.

2. Bildbezogene Vorgänge

 > Docker-Images // Lokale Images anzeigen > Docker-RMI-ID/Name // Ein Image löschen. Wenn kein Tag angegeben ist, wird standardmäßig das neueste Tag gelöscht. > Docker-RMI $(Docker-Images -q) // Alle Images löschen, Vorsicht > Docker-RMI $(Docker-Images -f "dangling=true" -q) // Alle unbenannten Images löschen (können Zwischenimages sein, die während des Build-Prozesses generiert wurden)
 > Docker Start/Stopp-ID/Name // Einen Container starten/stoppen> Docker Anhänge-ID // Einen Container eingeben (der Container wird auch nach dem Beenden mit „exit“ gestoppt)

Spiegeln nach ID-Tag. Das Folgende ist ein Tag eines lokalen Images mit der ID 0e5574283393 zum „Fedora“-Repository mit dem Tag-Namen version1.0

> docker tag 0e5574283393 fedora/httpd:version1.0

Spiegeln nach Namens-Tag, verwenden Sie den Namen-Tag „httpd“, um lokal auf das Repository „Fedora“ zu spiegeln, und sein Tag-Name ist Version 1.0

> docker tag httpd fedora/httpd:version1.0

Beachten Sie, dass der Tag-Name des referenzierten httpd nicht angegeben ist. Die Standardreferenz ist daher httpd:latest.

Kennzeichnen Sie ein Bild mit Namen und Tag-Name. Kennzeichnen Sie ein lokales Bild mit dem Namen httpd und dem Tag-Namen test. Sein Repository ist Fedora und der Tag-Name lautet version1.0.test.

> docker tag httpd:test fedora/httpd:version1.0.test

Kennzeichnen Sie ein Image in einem privaten Repository. Pushen Sie ein Image in ein privates Register statt in das öffentliche Docker-Register. Sie müssen einen Registrierungshostnamen und -port angeben, um das Image zu kennzeichnen.

> docker tag 0e5574283393 myregistryhost:5000/fedora/httpd:version1.

3. Deinstallieren Sie Docker CE

a. Deinstallieren Sie das Docker-Paket

> yum remove docker-ce

b. Bilder, Container, Volumes oder benutzerdefinierte Konfigurationsdateien auf dem Host werden nicht automatisch gelöscht. Befehle zum Löschen aller Bilder, Container und Datenträger

> rm -rf /var/lib/docker

6. Zusätzliche Wissenspopularisierung

1. Offizielle Adresse der Docker-Image-Bibliothek

https://hub.docker.com/r/microsoft/dotnet/

2. Unterschiede zwischen Microsoft/Dotnet-Image-Versionen

a. microsoft/dotnet:<version>-sdk (microsoft/dotnet:2.1-sdk)

Dieses Image enthält das .NET Core SDK mit .NET Core und den Befehlszeilentools (CLI). Dieses Bild wird dem Entwicklungsszenario zugeordnet. Sie können dieses Image für die lokale Entwicklung, zum Debuggen und für Komponententests verwenden. Dieses Bild kann auch zum Erstellen von Szenarien verwendet werden. Die Verwendung von microsoft/dotnet:sdk stellt immer die neueste Version bereit.

b. microsoft/dotnet:<version>-runtime (microsoft/dotnet:2.1-runtime)

Dieses Image enthält .NET Core (Laufzeit und Bibliotheken) und ist für die Ausführung von .NET Core-Apps in Produktionsumgebungen optimiert.

c. microsoft/dotnet:<version>-runtime-deps

Das Runtime-Deps-Image enthält das Betriebssystem mit allen nativen Abhängigkeiten, die von .NET Core benötigt werden. Dieses Image ist für eigenständige Anwendungen vorgesehen.

3. Bildbeschleunigung

Aufgrund von Problemen mit dem inländischen Netzwerk ist das nachfolgende Abrufen von Docker-Images sehr langsam. Wir können einen Beschleuniger konfigurieren, um dieses Problem zu lösen. Ich verwende die NetEase-Mirror-Adresse: http://hub-mirror.c.163.com.

Neue Versionen von Docker verwenden /etc/docker/daemon.json(Linux) oder %programdata%\docker\config\daemon.json (Windows), um Daemon zu konfigurieren.

Bitte ergänzen Sie dies in der Konfigurationsdatei (falls keine solche Datei vorhanden ist, erstellen Sie bitte zunächst eine):

{
"Registrierungsspiegel": ["http://hub-mirror.c.163.com"]
}

#Aktualisieren Sie die Konfigurationsdatei und starten Sie Docker neu

systemctl daemon-reload

systemctl Neustart Docker

**********Wenn Sie Aliyun verwenden, müssen Sie sich bei Ihrem Alibaba Cloud-Konto anmelden, um Ihre eigene Spiegeladresse zu erhalten************

Zusammenfassen

Oben ist die vom Herausgeber vorgestellte .NETCore Docker-Containerisierung und private Bildrepository-Verwaltung. Ich hoffe, es wird allen helfen. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!
Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank!

Das könnte Sie auch interessieren:
  • .Net Core stellt Docker-Container bereit
  • ASP.NET Core-Entwicklung Docker-Bereitstellung
  • Docker stellt Mysql, .Net6, Sqlserver und andere Container bereit
  • Stellen Sie das .Net6-Projekt im Docker bereit
  • So stellen Sie .NET 5 auf Docker bereit
  • Ein vorläufiges Tutorial zur Verwendung von Docker mit .Net Core
  • Vollständige Schritte zum Bereitstellen von Asp.net-Kernanwendungen mit Docker
  • Schritte zum Ausführen von ASP.NET Core im Docker-Container
  • .Net-Entwicklung und -Bereitstellung mit Docker

<<:  MySQL 5.7.21 Installations- und Konfigurations-Tutorial unter Windows 10

>>:  Erste Schritte mit benutzerdefinierten Anweisungen in Vue 3.0

Artikel empfehlen

So beheben Sie das Eingabe-Jitter-Problem beim WeChat-Applet

Finden Sie das Problem Schauen wir uns zunächst d...

Tutorial zur Installation einer MySQL-ZIP-Datei

In diesem Artikel wird die spezifische Methode zu...

Implementierung eines Nginx-Load-Balancing-Clusters

(1) Experimentelle Umgebung youxi1 192.168.5.101 ...

So installieren und konfigurieren Sie den Apache-Webserver

Erfahren Sie, wie Sie Ihre eigene Website auf Apa...

Beispiel für einen Vue-Übergang zum Erreichen eines Animationseffekts

Inhaltsverzeichnis Ergebnisse auf einen Blick Her...

Vorteile und Prinzipien der MySQL-Replikation im Detail erklärt

Bei der Replikation werden die DDL- und DML-Opera...

Analyse und Lösung des a.getAttribute(href,2)-Problems in IE6/7

Kurzbeschreibung <br />In IE6 und 7 wird in...

Was ist das Basis-Tag und was macht es?

Der <base>-Tag gibt die Standardadresse ode...

Spezifische Verwendung globaler Variablen von node.js

Globales Objekt Alle Module können aufgerufen wer...

Verwendung des Linux-Befehls sed

1. Funktionseinführung sed (Stream EDitor) ist ei...

So verwenden Sie CURRENT_TIMESTAMP in MySQL

Inhaltsverzeichnis Verwendung von CURRENT_TIMESTA...