Dies ist nur eine einfache Demonstration, um Schritt für Schritt ein grundlegendes Verständnis der Funktionsweise von Docker zu erlangen. Ich habe Docker auf diese Weise gelernt und dieses Repo erstellt, um einige Probleme zu lösen, mit denen ich während meiner Lernerfahrung konfrontiert war, damit es anderen Anfängern helfen kann. Ich wünsche Ihnen viel Spaß beim Lernen. Wenn es Ihnen gefällt, geben Sie es auf GitHub ab und unterstützen Sie meine Arbeit.
Wichtig: – Wenn Sie die Größe der Readme-Datei sehen, denken Sie vielleicht noch einmal darüber nach, aber um ehrlich zu sein: Wenn Sie von Anfang an arbeiten, werden Sie keine Probleme haben und ganz nebenbei lernen.
Wikipedia definiert Docker als
ist eine Reihe von Plattform-as-a-Service-Produkten (PaaS), die Virtualisierung auf Betriebssystemebene nutzen, um Software in Paketen, sogenannten Containern, bereitzustellen. Container sind voneinander isoliert und bündeln ihre Software, Bibliotheken und Konfigurationsdateien; Sie können über genau definierte Kanäle miteinander kommunizieren. Alle Container werden von einem einzigen Betriebssystemkernel ausgeführt und verbrauchen daher weniger Ressourcen als virtuelle Maschinen.
Docker hilft Ihnen dabei, Ihre Anwendungen effizienter in einer Sandbox (Containern genannt) bereitzustellen, um sie auf dem Host-Betriebssystem, also dem Mac, auszuführen. Der Hauptvorteil von Docker besteht darin, dass Sie Software mit all ihren Abhängigkeiten in einer einzigen standardisierten Einheit packen können.
Der Container ist eine Lösung, wie die Software problemlos zum Laufen gebracht werden kann, wenn sie von einer Computerumgebung in eine andere verschoben wird. Dies kann von einer Staging-Umgebung in die Produktion oder vielleicht von einem Laptop auf einen anderen Laptop mit einem anderen Betriebssystem erfolgen.
Container bieten einen logischen Verpackungsmechanismus, mit dem Ihre Anwendungen von der Umgebung, in der sie ausgeführt werden, abstrahiert werden können. Der Hauptunterschied besteht darin, dass nicht jeder Container ein vollwertiges Betriebssystem benötigt. Alle Container auf einem einzigen Host teilen sich ein einziges Betriebssystem. Dies hilft dabei, große Mengen an Systemressourcen wie CPU und RAM freizugeben.
Wenn Sie mit der Installation von Docker fertig sind, testen Sie Ihre Docker-Installation, indem Sie Folgendes ausführen:
docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
Dockerfile
ist ein Textdokument, das alle Befehle enthält, die Sie in der Befehlszeile aufrufen können, um ein Bild zu erstellen. Erstellen Sie eine Datei hello.js
und kopieren Sie diesen Code hinein. Hier haben wir einen einfachen JS-Code geschrieben, um Hello World auf localhost:8888
anzuzeigen. var http = require( " http " ) ;
http.createServer(function (request, response) {
response.writeHead(200, { ' Content-Type ' : ' text/plain ' }) ;
response.end( ' Hello Worldn ' ) ;
}).listen(8888) ;
// Console will print the message
console.log( ' Server running at http://127.0.0.1:8888/ ' ) ;
Dockerfile
und kopieren Sie diesen Code hinein. FROM node:8
LABEL maintainer= " [email protected] "
RUN npm install
ADD hello.js /hello.js
EXPOSE 8888
ENTRYPOINT [ " node " , " hello.js " ]
Selbst wenn dies die erste Docker-Datei ist, die Sie jemals gesehen haben, können Sie meiner Meinung nach gut erraten, was hier passiert. Die Dockerfile-Anweisungen sind FROM, ENV, LABEL, RUN, ADD, EXPOSE und ENTRYPOINT; Sie sind in Großbuchstaben geschrieben, aber das ist eine Konvention, keine Voraussetzung.
Auf hoher Ebene enthält diese Docker-Datei Anweisungen wie „Mit dem Knoten-Image beginnen“, “[email protected]”
als Betreuer hinzufügen, npm install
“ ausführen, um Abhängigkeiten zu installieren, die Datei in den Anwendungscode zu kopieren, den Netzwerkport der App zu dokumentieren, und legen Sie hello.js als Standardanwendung fest, die ausgeführt werden soll.
Jetzt erstellen wir ein Docker-Image auf unserem lokalen Computer. Öffnen Sie Ihr Terminal im Ordner des aktuellen Projekts und führen Sie es aus
docker build -t helloworld .
Hier weisen Sie Docker an, ein Image namens helloworld
basierend auf dem Inhalt des aktuellen Verzeichnisses zu erstellen (beachten Sie den Punkt (.) am Ende des Build-Befehls). Docker sucht im Verzeichnis nach der Docker-Datei und erstellt das Image basierend auf den Anweisungen in der Datei.
Nachdem Sie das Docker-Image erstellt haben, besteht der nächste Schritt darin, das Image auszuführen und zu prüfen, ob es funktioniert:
docker run -p 8888:8888 helloworld
Der Befehl, den wir gerade ausgeführt haben, hat Port 8888 für den Server im Container verwendet und diesen extern auf Port 8888 verfügbar gemacht. Gehen Sie zur URL mit Port 8888:
Glückwunsch! Sie haben Ihr erstes Docker-Image erfolgreich erstellt.
Docker-Images sind wie Vorlagen für virtuelle Maschinen und werden zum Starten von Containern verwendet. Unter der Haube bestehen sie aus einer oder mehreren schreibgeschützten Ebenen, die zusammengestapelt das Gesamtbild ergeben. Docker kümmert sich darum, diese Schichten zu stapeln und sie als ein einziges einheitliches Objekt darzustellen. Hinweis: Docker-Images sind unveränderlich, das heißt, Docker-Images können sich nie ändern. Sobald Sie eines erstellt haben, können Sie es löschen, aber nicht ändern.
Das Docker-Image enthält alle von Ihnen gepackten Dateien, die zum Dateisystem des Containers werden – und es enthält außerdem viele Metadaten über das Image selbst. Dazu gehört eine kurze Geschichte der Entstehung des Bildes. Damit können Sie jede Ebene des Bildes und den Befehl sehen, mit dem die Ebene erstellt wurde. Sie können den Verlauf des helloworld
-Images überprüfen, indem Sie Folgendes verwenden:
docker image history helloworld
IMAGE CREATED CREATED BY COMMENT
cb84eb33ca20 58 seconds ago /bin/sh -c # (nop) ENTRYPOINT ["node" "hello…
7d652a817a9f 58 seconds ago /bin/sh -c # (nop) EXPOSE 8888
334575e947c9 59 seconds ago /bin/sh -c # (nop) ADD file:b9606ef53b832e66e…
Die CREATED BY
-Befehle sind die Dockerfile-Anweisungen – es besteht eine Eins-zu-eins-Beziehung, sodass jede Zeile in der Dockerfile eine Bildebene erstellt.
Zunächst müssen Sie sich mit Ihrem Dockerhub-Konto anmelden
docker login --username $dockerId
Nachdem Sie angemeldet sind, können Sie Bilder an Ihr Konto oder an alle Organisationen senden, auf die Sie Zugriff haben. Wenn Sie kein Mitglied einer Organisation sind, können Sie Bilder nur in Repositorys in Ihrem Konto übertragen.
Wir haben ein Docker-Image namens helloworld
erstellt. Diese Bildreferenz hat keinen Kontonamen, daher können wir sie nicht an Registrierungen weiterleiten. Wir müssen das Bild jedoch nicht neu erstellen, um ihm eine neue Referenz zu geben, Bilder können mehrere Referenzen haben. Kennzeichnen Sie Ihr Bild wie folgt:
docker image tag helloworld $dockerId /helloworld:v1
Jetzt haben wir eine Bildreferenz mit unserer Docker-ID im Kontonamen und haben uns bei Docker Hub angemeldet, sodass wir unser Bild teilen können! Der Docker-Image-Push-Befehl ist das Gegenstück zum Pull-Befehl. Er lädt unsere lokalen Image-Ebenen in die Registrierung hoch:
docker image push championshuttler/helloworld:v1
The push refers to a repository [docker.io/championshuttler/helloworld]
9519a21ac374: Pushed
Wir können eine beliebige Zeichenfolge in ein Docker-Image-Tag einfügen, und wie wir bereits gesehen haben, können Sie mehrere Tags für dasselbe Image haben. Wir verwenden dies, um die Software in unseren Bildern zu versionieren und Benutzern die Möglichkeit zu geben, fundierte Entscheidungen darüber zu treffen, was sie nicht verwenden möchten – und um unsere eigenen fundierten Entscheidungen zu treffen, wenn wir die Bilder anderer Personen verwenden.
Viele Softwareprojekte verwenden ein numerisches Versionierungsschema mit Dezimalpunkten, um anzuzeigen, wie groß die Änderung zwischen den Versionen ist, und Sie können dies mit Ihren Bild-Tags verfolgen. Die Grundidee ist so etwas wie [major].[minor].[patch], das einige implizite Garantien hat. Eine Version, die nur die Patch-Nummer erhöht, enthält möglicherweise Fehlerbehebungen, sollte aber über dieselben Funktionen wie die letzte Version verfügen. Eine Version, die die Nebenversion erhöht, fügt möglicherweise Funktionen hinzu, sollte jedoch keine entfernen. Eine Hauptversion könnte völlig andere Funktionen haben.
Die meisten Anwendungen laufen nicht in einer einzigen Komponente. Sogar große alte Apps werden typischerweise als Front-End- und Back-End-Komponenten erstellt, bei denen es sich um separate logische Schichten handelt, die in physisch verteilten Komponenten ausgeführt werden. Docker ist ideal für die Ausführung verteilter Anwendungen geeignet – von N-Tier-Monolithen bis hin zu modernen Microservices. Jede Komponente wird in ihrem leichtgewichtigen Container ausgeführt und Docker verbindet sie mithilfe von Standard-Netzwerkprotokollen. Solche Multi-Container-Apps definieren und verwalten Sie mit Docker Compose. Docker Compose ist ein Tool zum Definieren und Ausführen von Docker-Anwendungen mit mehreren Containern. Mit Compose verwenden Sie eine YAML
Datei, um die Dienste Ihrer Anwendung zu konfigurieren. Dann erstellen und starten wir mit einem einzigen Befehl alle Dienste aus Ihrer Konfiguration.
Die Docker Compose-Datei beschreibt den gewünschten Zustand Ihrer App – wie sie aussehen sollte, wenn alles läuft. Es handelt sich um ein einfaches Dateiformat, in dem Sie alle Optionen, die Sie in Ihre Docker-Container-Ausführungsbefehle einfügen würden, in der Compose-Datei erfassen. Anschließend verwenden Sie das Docker Compose-Tool, um die App auszuführen. Es ermittelt, welche Docker-Ressourcen es benötigt – das können Container, Netzwerke oder Volumes sein – und sendet Anfragen an die Docker-API, um diese zu erstellen. Der Standardname für die Compose YAML-Datei ist docker-compose.yml
. Wir können jedoch das Flag -f verwenden, um benutzerdefinierte Dateinamen anzugeben.
Fangen wir an.
Unten zeigt der Code eine sehr einfache Docker Compose
Datei, die eine kleine Flask-App mit zwei Diensten (Web-Frontend und Redis) definiert. Die App ist ein einfacher Webserver, der die Anzahl der Besuche zählt und den Wert in Redis speichert.
version: " 3.5 "
services:
web-frontend:
build: .
command: python app.py
ports:
- target: 8888
published: 8888
networks:
- counter-net
volumes:
- type: volume
source: counter-vol
target: /code
redis:
image: " redis:alpine "
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:
Der version
ist erforderlich und sollte immer in der ersten Zeile der Datei stehen. Dies erklärt die Version des Compose file
(im Grunde die API).
Der services
der obersten Ebene ist der Ort, an dem wir die verschiedenen Anwendungsdienste definieren. Das von uns verwendete Beispiel definiert zwei Dienste; ein Web-Frontend namens web-frontend
und eine In-Memory-Datenbank namens Redis. Compose stellt jeden dieser Dienste als seinen Container bereit.
Der networks
der obersten Ebene weist Docker an, neue Netzwerke zu erstellen. Standardmäßig erstellt Compose Bridge-Netzwerke. Hierbei handelt es sich um Single-Host-Netzwerke, die nur Container auf demselben Host verbinden können.
Im Rahmen der Definition des Web-Frontend-Dienstes geben wir Docker die folgenden Anweisungen:
Wir stellen die in der Compose-Datei aus dem vorherigen Abschnitt definierte App bereit. Dazu benötigen Sie die folgenden 4 Dateien von https://github.com/championshuttler/counter-app:
Klonen Sie das Git-Repo lokal.
git clone https://github.com/championshuttler/counter-app.git
Lassen Sie uns jede Datei kurz beschreiben:
app.py
ist der Anwendungscode (eine Python-Flask-App).docker-compose.yml
ist die Docker Compose-Datei, die beschreibt, wie Docker die App bereitstellen soll.Dockerfile
beschreibt, wie das Image für den Web-Frontend-Dienst erstellt wird.requirements.txt
listet die für die App erforderlichen Python-Pakete auf. Lassen Sie uns Compose verwenden, um die App aufzurufen. Sie müssen alle folgenden Befehle im counter-app
Verzeichnis ausführen:
docker-compose up &
Es dauert ein paar Sekunden, bis die App startet, und die Ausgabe kann recht ausführlich sein.
Wenn die Anwendung erfolgreich bereitgestellt wurde, können Sie einen Webbrowser auf Ihren Docker-Host an port 5000
richten und die Anwendung in ihrer ganzen Pracht sehen.
Fanden Sie das Tutorial völlig durcheinander oder hatten Sie Spaß und haben etwas gelernt? Schicken Sie mir Ihre Gedanken direkt oder erstellen Sie einfach ein Problem. Finden Sie mich auch auf Twitter. Wenn Sie Fragen haben, können Sie mich gerne fragen.
Ich würde gerne von Ihren Erfahrungen mit diesem Tutorial hören. Ich hoffe, dass Ihnen das Lernen Spaß gemacht hat. Wenn es Ihnen gefällt, geben Sie es bitte auf GitHub ab und unterstützen Sie meine Arbeit.