JavaRush /Java-Blog /Random-DE /Erste Bekanntschaft mit Docker
Viacheslav
Level 3

Erste Bekanntschaft mit Docker

Veröffentlicht in der Gruppe Random-DE
Containerisierung ist ein in der Praxis häufig eingesetzter Mechanismus. Wenn Sie beispielsweise nach „Headhunter“ suchen, finden Sie derzeit 477 Stellenangebote, in denen Docker erwähnt wird. Daher wäre es keine schlechte Idee, sich damit vertraut zu machen, worum es geht. Ich hoffe, dieser kurze Rückblick hilft dabei, eine erste Idee zu entwickeln. Nun, er wird es mit zusätzlichen Materialien untermauern, wie zum Beispiel Kursen auf Udemy. Erste Einführung in Docker - 1

Einführung

In dieser kurzen Rezension möchte ich auf ein Thema wie die Containerisierung eingehen. Und Sie müssen zunächst verstehen, was Containerisierung eigentlich ist. Laut Wikipedia ist „ Containerisierung “ eine Virtualisierung auf Betriebssystemebene (d. h. NICHT auf Hardware), bei der der Betriebssystemkern mehrere isolierte Benutzerrauminstanzen statt nur einer verwaltet. „ Benutzerraum “ ist der Adressraum des virtuellen Speichers des Betriebssystems, der für Benutzerprogramme reserviert ist. User-Space-Instanzen (allgemein Container genannt) sind aus Benutzersicht völlig identisch mit einer einzelnen Betriebssysteminstanz. Der Kernel sorgt für eine vollständige Containerisolation, sodass sich Programme aus verschiedenen Containern nicht gegenseitig beeinflussen können. Es stellt sich heraus, dass es sich bei Containerisierung um Softwarevirtualisierung handelt, also um Virtualisierung auf Betriebssystemebene, für die der Betriebssystemkernel verantwortlich ist. Eines der charakteristischen Merkmale dieses Ansatzes besteht darin, dass alle Container einen gemeinsamen Kernel verwenden, der mit dem Host-Betriebssystem (also dem, auf dem sich die Container befinden) identisch ist. Dadurch entfällt der Aufwand für die Emulation virtueller Hardware und das Starten einer vollwertigen Instanz des Betriebssystems. Wir können sagen, dass es sich hierbei um eine „leichte“ Virtualisierung handelt. Der Kernel ist der zentrale Teil des Betriebssystems, der Anwendungen koordinierten Zugriff auf Computerressourcen wie Prozessorzeit, Speicher, externe Hardware sowie externe Eingabe- und Ausgabegeräte ermöglicht. Der Kernel stellt normalerweise auch Dateisystem- und Netzwerkprotokolldienste bereit. Im Allgemeinen ist dies das Herzstück des gesamten Systems. Für zusätzliche Informationen kann es hilfreich sein, das Material „ Allgemeine Informationen zu Containern “ zu lesen. Und noch ein paar Worte, um die Einleitung zu vervollständigen. Wir haben jetzt verstanden, dass ein Betriebssystem einen Kernel hat. Es bietet Isolation für Benutzerrauminstanzen. In diesem Zusammenhang stoßen Sie möglicherweise auf den Begriff „ Cgroups “. Dies ist der Name des Linux-Kernel-Mechanismus, der Ihnen dies ermöglicht. Daher können wir sagen, dass der Weg der Containerisierung mit Linux-Systemen begann. Ab Windows 10 wurde jedoch auch die Containerisierung unterstützt. Um mit Virtualisierung arbeiten zu können, müssen Sie die Virtualisierungsunterstützung im BIOS Ihres Computers konfigurieren. Wie das geht, hängt vom Computer ab. Es könnte zum Beispiel so aussehen:
Erste Einführung in Docker - 2
Unter Windows können Sie dies auf unterschiedliche Weise überprüfen. Sie können beispielsweise ein spezielles Dienstprogramm von der Microsoft-Website herunterladen: Hardware-Assisted Virtualization Detection Tool . Nun, es lohnt sich, ein weiteres wichtiges Konzept zu erwähnen – Hypervisor. Hypervisor ist ein virtueller Maschinenmonitor, ein Programm zur Sicherstellung der parallelen Ausführung mehrerer Betriebssysteme auf demselben Computer. Der Hypervisor stellt sicher, dass Betriebssysteme voneinander isoliert sind und Ressourcen zwischen laufenden Betriebssystemen gemeinsam nutzen. Ein solcher Hypervisor ist Oracle VirtualBox .
Erste Einführung in Docker - 3

Docker

Es ist also klar, was Virtualisierung ist. Aber wie benutzt man es? Und hier kommt uns Docker zu Hilfe. Docker ist eine Software zur Automatisierung der Bereitstellung und Verwaltung von Anwendungen in Containerumgebungen. Es lohnt sich, mit der Tatsache zu beginnen, dass Docker durch ein Konzept wie Docker Enginge repräsentiert wird. Und Sie sollten mit der offiziellen Docker-Website und dem Abschnitt „ Docker-Übersicht “ beginnen.
Erste Einführung in Docker – 4
In der Dokumentation heißt es, dass Docker aus Folgendem besteht:
  • Der Docker-Server wird als Docker-Daemon-Prozess (dockerd) bezeichnet.
  • Befehlszeilenschnittstelle, auch bekannt als CLI (Docker).
  • Eine REST-API, die beschreibt, wie Programme mit dem Deamon „sprechen“ und ihm sagen können, was er tun soll.
Bevor wir weiter darauf eingehen, installieren wir Docker, also den Docker-Daemon. Auf der Docker-Website finden Sie Anweisungen zur Installation von „ Docker für Windows “. Interessanterweise hat Docker seine eigenen Systemanforderungen. Und wenn Sie, wie ich, ein altes Windows haben, zum Beispiel Windows 7, dann müssen Sie Docker Toolbox verwenden.
Erste Einführung in Docker – 5

Docker-Toolbox

So installieren Sie Docker auf alten Maschinen, die die Systemanforderungen nicht erfüllen. Auf der Website heißt es: „Legacy Desktop Solution“. Gehen wir zur Seite „ Docker Toolbox “ und laden sie herunter. Dieses Set wiegt etwa 211 Megabyte. Wir werden es standardmäßig installieren, das heißt, wir stimmen einfach demütig allem zu, ohne die Flags neu anzuordnen. Nach der Installation prüfen wir, ob alles in Ordnung ist. In Zukunft wird unser Schlachtfeld die Kommandozeile sein. Ich empfehle, nicht die Windows-Befehlszeile zu verwenden, da es dabei zu nicht offensichtlichen Problemen kommen kann. Es ist besser, die Bash-Shell zu verwenden. Unter Windows ist die Installation des Git- Versionskontrollsystems die am meisten empfohlene Möglichkeit, es zu erhalten . Es wird immer noch nützlich sein. Denn „gebündelt“ damit wird die Bash sein, die wir brauchen. Für diese Rezension verwende ich Git Bash. Sie können Bash auch mit CYGWIN installieren . Lassen Sie uns Bash oder Git Bash starten. Stellen wir sicher, dass wir die Docker-Maschine installiert haben, auch bekannt als Docker-Maschine: docker-machine -version Was ist diese Docker-Maschine? Docker Machine ist ein Dienstprogramm zur Verwaltung von Docker-Hosts (das sind Hosts, auf denen die Docker Engine installiert ist). Wenn wir direkt nach der Installation von Docket Toolbox Docker-Maschinen mit dem Befehl anzeigen docker-machine ls, sehen wir eine leere Liste:
Erste Einführung in Docker – 6
Lassen Sie uns eine neue Maschine erstellen. Dazu müssen wir den Befehl create ausführen : docker-machine create -- driver virtualbox javarush: Wir sehen das Erstellungsprotokoll der Docker-Maschine:
Erste Einführung in Docker – 7
Was uns hier interessiert, ist Folgendes. Was ist Boot2Docker? Dies ist eine minimalistische Linux-Distribution zum Ausführen der Docker Engine (wir wissen, dass Docker dank Linux-Virtualisierungstools funktioniert und in Windows der notwendige Mechanismus erst ab Windows 10 erschien). Diese Distribution basiert auf der „ Tiny Core Linux “-Distribution. Auch über VirtualBox VM erwähnt. Dies liegt daran, dass wir angegeben haben --driver virtualbox. Aus dem Boot2Docker-Image wurde in VirtualBox eine neue virtuelle Maschine erstellt. Nach der Erstellung können wir VirtualBox starten (da VirtualBox mit Docker Toolbox installiert wird) und die erstellte virtuelle Maschine für die Docker-Maschine sehen:
Erste Einführung in Docker – 8
Nach der Erstellung werden wir aufgefordert, den Befehl „ docker-machine env “ auszuführen , um die Umgebungsvariablen abzurufen, die für die Verbindung mit der Docker-Maschine konfiguriert werden müssen:
Erste Einführung in Docker – 9
Nachdem wir diesen Befehl mit der Docker-Maschine ausgeführt haben, stellen wir eine Verbindung zu einem Remote-Docker-Host her (in diesem Fall einem virtuellen Host, der auf Virtual Box gehostet wird) und können Docker-Befehle lokal ausführen, als würden wir sie auf einem Remote-Host ausführen. Zur Überprüfung können wir den Befehl „ docker info “ ausführen. Wenn die Verbindung zur Docker-Maschine nicht hergestellt werden kann, erhalten wir eine Fehlermeldung. Und wenn alles in Ordnung ist, Informationen zum Docker auf der Docker-Maschine. Jetzt ist es an der Zeit zu verstehen, wie Docker im Allgemeinen funktioniert und wie man es verwendet.
Erste Einführung in Docker – 10

Docker-Container

Wir haben also Docker. Was ist dieser Docker überhaupt? Die Docker-Dokumentation und der Abschnitt „ Erste Schritte “ helfen uns dabei, dies zu verstehen . Im einleitenden Teil dieses Abschnitts werden Docker- Konzepte vorgestellt . Darin heißt es, dass Docker eine Plattform zum Entwickeln, Debuggen und Ausführen von Anwendungen in Containern ist. Daher sind Container das Wichtigste für Docker. Auch wenn man sich das Docker-Logo anschaut, handelt es sich um einen Wal, der auf seinem Rücken Container hält. Aber was ist ein Container? Als nächstes heißt es im Abschnitt „ Bilder und Container “, dass ein Container eine laufende Instanz von Image ist. Und Image ist ein „Paket“, das alles Notwendige für die Anwendung enthält (Code, Umgebung, Bibliotheken, Einstellungen usw.). Versuchen wir es jetzt selbst. Auf der Docker-Website gibt es einen Abschnitt namens „ Docker-Beispiele “, der auch „ Docker für Anfänger “ enthält . Die Beispiele von hier erscheinen mir interessanter. Also wollten wir uns plötzlich mit Alpine Linux vertraut machen und können dies mithilfe von Docker-Containern tun. Um ein Bild zu erhalten, müssen wir es „herausziehen“ oder „herausziehen“. Deshalb führen wir den Docker-Pull -Befehl aus :docker pull apline
Erste Einführung in Docker – 11
Wie wir sehen können, laden wir von irgendwoher herunter. Standardmäßig schaut sich Docker sein Repository im Netzwerk https://hub.docker.com an . Nachdem wir das Bild erfolgreich abgerufen haben, können wir die Liste der verfügbaren Bilder überprüfen, indem wir den Docker-Images- Befehl ausführen :
Erste Einführung in Docker – 12
Jetzt haben wir ein Apline-Bild. Da es sich bei dem Container um eine laufende Instanz eines Images handelt, starten wir genau dieses Image. Starten wir den Container mit dem Befehl docker run alpine. Wie wir sehen, ist nichts passiert. Wenn wir den Befehl docker pszur Anzeige aller aktiven Container ausführen, erhalten wir ebenfalls nichts. Aber wenn wir es ausführen, docker ps -asehen wir alle Container:
Erste Bekanntschaft mit Docker - 13
Die Sache ist, dass wir Docker nicht im interaktiven Modus gestartet haben. Deshalb führte er den Befehl aus und blieb stehen. Der Befehl lautete, das Terminal zu öffnen. Machen wir dasselbe, aber im interaktiven Modus (mit dem Flag -it ):
Erste Einführung in Docker – 14
Wie Sie sehen, sind wir, nachdem wir einen Fehler überwunden und den Hinweis befolgt haben, zum Container gelangt und können darin arbeiten! Um den Container zu verlassen, ohne seinen Betrieb zu unterbrechen, können Sie drücken Ctrl + p + q. Wenn wir jetzt ausführen docker ps, sehen wir einen aktiven Container. Um einen bereits ausgeführten Container aufzurufen, führen Sie den Befehl docker exec aus :
Erste Bekanntschaft mit Docker - 15
Ich empfehle, die Beschreibung des Docker-Beispiels zu lesen, um eine hervorragende Beschreibung zu erhalten, wie das alles geschieht: „ 1.0 Ausführen Ihres ersten Containers “. Mir gefällt es, weil dort alles sehr zugänglich und verständlich geschrieben ist. Um es kurz auszudrücken: Wir sind über Docker-Machine mit einer virtuellen Maschine verbunden, auf der Docker Daemon läuft. Mithilfe der CLI über die REST-API bitten wir Sie, das Alpine-Image zu starten. Docker findet es und lädt es daher nicht herunter. Docker erstellt einen neuen Container und führt den von uns angegebenen Befehl in diesem Container aus. Und das alles ist natürlich gut. Aber warum brauchen wir das alles? Und hier müssen wir herausfinden, wie Docker ein Image erstellt. Und er erstellt sie basierend auf der Docker-Datei.
Erste Einführung in Docker – 16

Docker-Datei

Wie in der Dockerfile-Referenz angegeben , ist eine Dockerfile eine Textdatei, die alle Befehle zum Abrufen eines Bildes enthält. Tatsächlich wurden alle Bilder, die wir erhalten (sogar Alpine, aus dem obigen Beispiel), aus einer Docker-Datei erstellt. Lassen Sie uns unser Image mit einer Java-Anwendung erstellen. Und zuerst brauchen wir diese Java-Anwendung. Ich schlage vor, das Gradle-Build-System zu verwenden, über das Sie in dieser kurzen Rezension mehr lesen können: „ Eine kurze Einführung in Gradle “. Wird uns bei der Erstellung des Projekts „ Gradle Build Init Plugin “ helfen. Erstellen wir eine neue Java-Anwendung mit Gradle: gradle init --type java-application Dieser Befehl erstellt ein Java-Vorlagenprojekt. Dies ist eine eigenständige Anwendung, wir möchten jedoch eine Webanwendung erstellen. Entfernen wir die Klassen App und AppTest (sie wurden automatisch vom Gradle Build Init Plugin generiert). Um schnell eine Webanwendung zu erstellen, verwenden wir das Tutorial von Gradle: „ Erstellen von Java-Webanwendungen “. Lassen Sie uns gemäß dem Tutorial Folgendes tun: Hier muss man vorsichtig sein. Wie immer können die Beispiele Fehler enthalten. Hier ist es:
Erste Einführung in Docker – 17
Um es zu testen, fügen wir nun das Gretty-Plugin zu build.gradle hinzu, wie im Abschnitt „ Gretty-Plugin hinzufügen und App ausführen “ angegeben:
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
Interessant ist, dass Gretty den HelloServletoben beschriebenen Fehler in nicht sieht. Dies beweist, dass sich eine Anwendung in verschiedenen Umgebungen unterschiedlich verhalten kann. Gretty kann dort arbeiten, wo ein normaler Standalone-Server einen Fehler auslösen würde. Es bleibt nur noch zu prüfen, ob die Anwendung ordnungsgemäß funktioniert. Lass es uns tun:gradle appRun
Erste Bekanntschaft mit Docker - 18
Wenn alles in Ordnung ist, verwenden Sie den Befehl gradle war, um ein Archiv mit der Erweiterung war (Webarchiv) zu erstellen. Standardmäßig erstellt Gradle es im \build\libs. Jetzt sind wir bereit, unsere Docker-Datei zu schreiben. Mithilfe der „ Dockerfile-Referenz “ erstellen wir eine Dockerfile. Erstellen wir eine Datei namens „Dockerfile“ im Stammverzeichnis unseres Java-Projekts (an der gleichen Stelle wie das Build-Skript). Öffnen wir es zum Bearbeiten. Diese Datei hat ein eigenes Format, das im Abschnitt „ Dockerfile-Referenz: Format “ beschrieben wird. Jede Docker-Datei beginnt mit einer FROM-Anweisung, die das „Basis-Image“ angibt. Wir können sagen, dass dies das übergeordnete Bild ist, auf dessen Grundlage wir unser Bild erstellen. Es ist für uns sehr einfach, ein übergeordnetes Bild auszuwählen. Eine Webanwendung benötigt einen Webserver. Beispielsweise können wir den Tomcat-Webserver verwenden. Wir gehen zum offiziellen Docker-Repository, das Docker Hub heißt . Wir schauen dort nach, ob das Bild, das wir brauchen, dort ist:
Erste Bekanntschaft mit Docker - 19
Es ist auch wichtig zu verstehen, dass das Tomcat-Image aufgerufen wird. Aber neben dem Namen hat es ein Etikett. Ein Tag ist wie eine Version. Tomcat-Images verschiedener Versionen unterscheiden sich darin, welche Version von Tomcat verwendet wird, welche Version von JRE und welches Basis-Image. Zum Beispiel können wir ein Image erhalten. docker pull tomcat:9-jre8-alpine Es verwendet Version 9 von Tomcat, JRE Version 8 und das Alpine-Image als Basis. Dies kann wichtig sein, um die Größe unseres Bildes zu reduzieren:
Erste Einführung in Docker – 20
Wie wir sehen, ist der Unterschied riesig. Wenn wir unser Image auf Basis von Tomcata Alpine erstellen, beginnen wir mit nur 100 Megabyte und nicht mit 600. Dementsprechend werden wir der zuvor erstellten Docker-Datei folgenden Inhalt hinzufügen:
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
Und jetzt führen wir den Befehl aus, um das Image zu erstellen: docker build -t jrdocker ..
Erste Bekanntschaft mit Docker - 21
-t- Dies ist ein Tag, das heißt, wie man das zusammengesetzte Bild nennt. Der Punkt am Ende bedeutet, dass wir das aktuelle Verzeichnis (das Verzeichnis, in dem sich die Docker-Datei befindet und von dem aus wir den Befehl ausgeführt haben) zu hinzufügen Build context. Build context– Dies ist der Kontext der Dateien, die beim Erstellen einer Docker-Datei verfügbar sind. Wie Sie sehen, konnten wir dadurch die zusammengestellte Kriegsdatei in unser Image, in das Webserververzeichnis, kopieren. Lassen Sie uns nun unser Bild ausführen:docker run -d --rm -p 8888:8080 jrdocker
Erste Bekanntschaft mit Docker - 22
Um zu verstehen, ob der Server gestartet ist, können Sie sich das Protokoll aus dem Container ansehen. Das Protokoll kann mit dem Befehl docker logs abgerufen werden, indem der Container anhand seiner ID oder seines Namens angegeben wird. Zum Beispiel:
Erste Bekanntschaft mit Docker - 23
Vergessen Sie nicht, dass wir mit dem folgenden Befehl jederzeit namentlich zu einem laufenden Container wechseln können: winpty docker exec -it NameКонтейнера sh Jetzt müssen Sie nur noch eine Verbindung herstellen. Zuvor haben wir EXPOSE angegeben , das heißt, wir haben den Zugriff auf Port 8080 aus dem Container heraus zugelassen. Als wir den Container selbst gestartet haben, haben wir das Tag -p ( eingehende Ports ) angegeben und damit Port 8080 auf dem Container (dem Tomcat-Webserver) korreliert wartet dort auf Verbindungen) mit dem Port 8888 auf einer Maschine mit einem Docker-Daemon. Wie wir uns erinnern, haben wir den Docker-Daemon nicht direkt, sondern über die Docker-Maschine gestartet. Fragen wir daher noch einmal mit dem Befehl docker-machine ls nach Daten auf unseren Docker-Maschinen und kontaktieren den Server im Container:
Erste Einführung in Docker – 24
Sie und ich haben gerade unsere Webanwendung in einem Docker-Container gestartet! ) Ich möchte außerdem Folgendes anmerken. Bei Zugriffsproblemen sollten Sie bedenken, dass es sich bei der Docker-Maschine in erster Linie um eine virtuelle Virtual BOx-Maschine handelt. Möglicherweise liegen Probleme mit den Netzwerkeinstellungen der virtuellen Maschine vor. Eine funktionierende VMBox-Konfiguration könnte so aussehen:
Erste Bekanntschaft mit Docker - 25
Erste Bekanntschaft mit Docker - 26

Lagen

Wir haben bereits herausgefunden, dass Bilder aus Dockerfiles erstellt werden und dass Dockerfiles eine Reihe von Befehlen sind. Wir haben auch herausgefunden, dass eine Docker-Datei ein übergeordnetes Element hat. Und dass die Größe der Bilder unterschiedlich ist. Interessanterweise können Sie den Verlauf der Erstellung des Images mit dem Docker- Verlaufsbefehl anzeigen . Zum Beispiel:
Erste Bekanntschaft mit Docker - 27
Es ist wichtig, dies zu sagen, um zu verstehen, dass jedes Bild im Wesentlichen eine Reihe von Bildern ist. Jede Bildänderung (jeder neue Befehl in der Docker-Datei) erstellt eine neue Ebene mit einer eigenen ID. Weitere Informationen zu Layern finden Sie in der Dokumentation „ Docker: Images and Layers “. Ich empfehle außerdem dringend, den Artikel auf Habré zu lesen: „ Docker-Bilder und Container in Bildern “.

Abschluss

Ich hoffe, dieser kurze Überblick hat ausgereicht, um Ihr Interesse für die Containerisierung zu wecken. Nachfolgend finden Sie Links zu zusätzlichem Material, das nützlich sein könnte: #Wjatscheslaw
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION