In diesem Tutorial werfen wir einen Blick auf die Geschichte der Containerisierung, des Docker, seiner Komponenten und wie man es in unserer täglichen Arbeit einsetzen kann. Bevor wir jedoch zu tief in das Tutorial eintauchen, werfen wir einen Blick darauf, was Docker ist, damit wir verstehen, was es ist, mit dem wir arbeiten werden.
Docker ist eine offene Plattform zum Erstellen, Versenden und Ausführen verteilter Anwendungen. Programmierer, Entwicklungsteams und Betriebsingenieure erhalten so die gemeinsame Toolbox, die sie benötigen, um die verteilten und vernetzten Eigenschaften moderner Anwendungen zu nutzen.
Wie in der formalen Definition von Docker oben angegeben, hilft es Entwicklern oder Betriebsingenieuren bei der Automatisierung der Infrastrukturumgebung, die Anwendungen benötigen.
Nehmen wir an, Sie haben eine in Node.js geschriebene Anwendung, die Express für RESTful-Dienst und MongoDB für Datenpersistenz verwendet. Machen wir es komplexer und fügen Sie mehrere Instanzen von Node.js und Nginx Load Balancer vor den Node.js-Instanzen hinzu.
Wäre es nicht besser, wenn ich die Installationsschritte in einer Textdatei aufschreibe und jemanden die gesamte Umgebung für mich installieren lassen würde? Docker hilft Ihnen bei der Containerisierung aller Komponenten der Architektur (Node.js-Instanz, Nginx-Webserver, MongoDB-Datenbank usw.) sehr einfach.
Was ist jedoch überhaupt Containerisierung? Werfen wir einen Blick auf die Geschichte der Containerisierungstechnologie.
Das erste Containerisierungsprojekt, an das ich mich erinnern kann, ist OpenVZ. Hierbei handelt es sich um eine containergestützte Virtualisierung für Linux, die erstmals 2005 veröffentlicht wurde. Mit OpenVZ können Sie mehrere isolierte, sichere Linux-Container erstellen, um sie auf demselben physischen Server ohne Konflikte zwischen Anwendungen auszuführen.
Zur gleichen Zeit entstand ein weiteres Projekt von FreeBSD, genannt Jails. Auf diese Weise können Sie Apps und Dienste in einem Jail (wir können dies als Container bezeichnen) mithilfe von chroot anlegen.
Es gab andere Projekte wie Solaris Containers, aber warum wurde Docker populär, obwohl alle oben genannten Containerisierungsprojekte acht Jahre älter sind als Docker? Lesen Sie weiter, um Ihr Docker-Wissen zu erweitern.
Bevor Sie erklären, wie Docker funktioniert, lassen Sie mich erklären, wie Container funktionieren. Ein Container ist etwas, was mit der Virtualisierung auf Betriebssystemebene zu tun hat und die es ermöglicht, mehrere isolierte Benutzerbereiche anstelle von nur einem zu erstellen. Diese Isolation wird mit der Chroot
.
Der Hauptunterschied zwischen Containern und VMs ist wie folgt. Wenn Sie mithilfe von VM mehrere virtuelle Maschinen erstellen, werden die Betriebssysteme und virtualisierten Hardwareprodukte für jeden Gast dupliziert. Wenn Sie jedoch mehrere Container erstellen, werden nur die mit der Betriebssystemverteilung verbundenen Ordner von Grund auf neu erstellt, während die mit dem Linux-Kernel verbundenen Teile von Containern gemeinsam genutzt werden. Sie können sich das Bild unten ansehen, um den Unterschied visuell zu sehen.
Wie Sie auch im Schema sehen können, werden die Gastbetriebssysteme, wenn Sie Ubuntu- und Mint-Gäste mithilfe von VM erstellen, dupliziert, selbst wenn sie denselben Linux-Kernel verwenden. Verteilung bedeutet eigentlich eine Differenzierung der Behälter und Libs Ordner und der Linux-Kernel ist der gleiche.
Wenn Sie sich das zweite Bild oben ansehen, werden Sie feststellen, dass die gesamte Architektur auf Betriebssystemebene von allen Containern gemeinsam genutzt wird und nur die Behälter und Libs werden von Grund auf für verschiedene Behälter erstellt. Docker Engine verfügt über Namespaces, cgroups
, und SELinux, und hilft Ihnen bei der Orchestrierung von Containern. Wenn Sie zusätzliche Informationen zur Docker Engine benötigen, können Sie die Docker-Website besuchen.
Bevor Sie mit der Erläuterung der Komponenten fortfahren, können Sie Docker auf Ihrem Computer installieren. Es hat ziemlich grundlegende Schritte zu installieren.
Docker besteht hauptsächlich aus zwei Komponenten: Docker Engine und Docker Hub. Docker Engine ist für die Orchestrierung von Containern vorgesehen, wie ich oben gesagt habe, und Docker Hub ist ein SaaS-Dienst zum Verwalten und Freigeben von Anwendungsstapeln. Wenn Sie beispielsweise Redis mit Docker verwenden möchten, können Sie es auf Ihren lokalen Computer ziehen, indem Sie den folgenden Befehl ausführen:
Docker ziehen Redis
Dadurch werden alle Ebenen des Container-Images abgerufen und können in Ihrer Umgebung ausgeführt werden. In Docker Hub finden Sie viele Repositorys.
Docker hat auch ein spezielles Dateisystem namens AUFS (EINAdvanced Multi Layered Unifizierung FIle System). Bei diesem System wird jede einzelne Commit-Änderung in Ebenen gespeichert, z. B. in der Versionskontrolle. Wenn Sie Ihr Docker-Image ändern, wird es als anderes Commit beibehalten und beim Build-Vorgang nicht vollständig neu erstellt. Alle anderen Ebenen werden zuvor erstellt.
Wenn Sie ein Repository auf Ihren lokalen Computer ziehen, werden Sie außerdem feststellen, dass der Abrufvorgang Schicht für Schicht ausgeführt wird. Nehmen wir an, Sie haben eine Änderung vorgenommen und testen Ihren neuen Container, der jedoch fehlschlägt. Kein Problem, Sie können Ihre Änderungen rückgängig machen und neu erstellen, wie Sie es in Git immer tun.
Vorausgesetzt, Docker ist bereits auf Ihrem Computer installiert, können wir mit ein paar coolen Docker-Befehlen beginnen.
Docker ziehen Ubuntu Docker Run -it Ubuntu Bash
Wie Sie sich vorstellen können, ruft der obige Befehl das Ubuntu-Image von Docker Hub ab und führt es gefolgt vom bash-Befehl aus.
Sie werden sehen, dass Sie sich innerhalb des Containers befinden, nachdem Sie den obigen Befehl ausgeführt haben. Sie befinden sich jetzt in der Ubuntu-Shell und können * nix-Befehle ausführen. Sie können etwas erstellen, löschen, Prozesse usw. sehen.
Seien Sie jedoch vorsichtig, denn beim Verlassen des Containers gehen Ihre Daten verloren. Warum? Weil Sie Ihre Container als unveränderlich gestalten müssen.
Entwerfen Sie zunächst, welche Pakete enthalten sein sollen, welche Anwendungen in den Container geklont werden usw., und führen Sie dann den Container aus. Wenn Sie etwas versagen, müssen Sie in der Lage sein, die Konfiguration zu ändern und erneut auszuführen. Behalten Sie nie Zustand in Ihren Behältern.
Um den Container auszuführen, können Sie das folgende Format verwenden.
Dockerlauf [OPTIONEN] IMAGE [: TAG | @DIGEST] [BEFEHL] [ARG…]
In Docker stehen viele Parameter für den Laufvorgang zur Verfügung. Sie können sich auf die Dokumentation für alle Optionen beziehen, aber ich werde Ihnen einige Beispiele für den praktischen Gebrauch geben.
docker run -d redis
Dieser Befehl führt ein Redis-Bild im getrennten Modus aus. Dies bedeutet, dass alle E / A-Vorgänge über Netzwerk oder gemeinsame Verbindungen erfolgen. Sie können davon ausgehen, dass es im Daemon-Modus läuft. Wir haben gesagt Redis
Hier können Sie aber auch den Autor und das Tag des Bildes angeben, indem Sie einen Befehl wie den folgenden verwenden.
docker run -d huseyinbabal / mongodb: 1,0
Wir betreiben ein Mongodb
Bild, zu dem gehört huseyinbabal
mit bestimmter Version 1,0
.
Sie können Ihr Bild auch interaktiv wie folgt ausführen:
docker run -it huseyinbabal / ubuntu: 1,2 bash
Wenn Sie den obigen Befehl ausführen, wird er ausgeführt Ubuntu 1.2
und dann ein ausführen bash
Befehl, um Ihre Eingabeaufforderung in das Terminal innerhalb des Containers zu setzen.
Wir haben Bilder ausgeführt, die aus dem Docker Hub-Repository abgerufen wurden. Wie sieht es mit dem Aufbau unseres eigenen Images aus? Wir können dies mit dem Docker-Build-Befehl tun, müssen aber ein angeben Dockerfile
Damit Docker jede in Dockerfile definierte Anweisung ausführen kann.
FROM ubuntu MAINTAINER Huseyin BABAL RUN apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 RUN echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | tee -a /etc/apt/sources.list.d/10gen.list RUN apt-get Update RUN apt-get -y installieren apt-utils RUN apt-get -y-installieren mongodb-10gen RUN "einige Konfigurationen" >> /etc/mongodb.conf CMD ["/ usr / bin / mongod", "--config", "/etc/mongodb.conf"]
Dies ist eine sehr einfache Dockerfile-Definition, die uns dabei helfen wird, unser Image aufzubauen. In dieser Dockerfile-Definition sagen wir zunächst, dass wir alle Eigenschaften vom Ubuntu-Image erben werden. Dieses Image wird zuerst von Ihrem lokalen Server abgerufen. Wird es nicht gefunden, wird es vom Docker Hub abgerufen.
In der zweiten Zeile definieren wir den Autor oder Verwalter des Bildes. In den folgenden Dateien führen wir einfach einige * nix-Befehle mit dem RUN-Befehl aus, um wichtige Pakete und MongoDB-bezogene Pakete zu installieren. Um MongoDB zu starten, schreiben wir mongodb.conf
, und im letzten Schritt führen wir den Befehl mithilfe von aus CMD
.
Um unser Image auszuführen, sollten wir das Image mithilfe dieser Docker-Datei erstellen. Sie können Folgendes zum Erstellen des Abbilds verwenden.
docker build -t huseyinbabal / mongodb: 1,0 .
Dies wird einfach ein Bild mit einem Tag erstellen Huseyinbabal / Mongodb: 1,0
und verwendet Dockerfile im aktuellen Ordner (siehe Punkt am Ende des Befehls). Um zu testen, ob es erstellt wurde oder nicht, können Sie den folgenden Befehl verwenden.
Docker-Bilder
Daraufhin werden alle Bilder aufgelistet, die auf Ihrem Computer vorhanden sind.
Wenn Sie ein erstelltes Image ausführen möchten, können Sie einfach Folgendes ausführen:
docker run -d huseyinbabal / mongodb: 1,0
Aber warte! Dies ist der Daemon-Knoten. Wie kann ich diesen Container betreten? Es ist sehr einfach. Rufen Sie zunächst den Namen des Mongodb-Containernamens mit dem folgenden Befehl ab.
Docker ps
Sie sehen eine Ausgabe wie unten.
Sie können den Namen in der Spalte NAMES sehen. Nun ist es Zeit, mit dem folgenden Befehl in den Container zu gelangen.
docker exec -i -tbash
Sie können die laufenden Prozesse in diesem Container sehen.
Wie bereits erwähnt, gehen beim Schließen des laufenden Containers alle auf diesen Container bezogenen Daten verloren. Dies ist in der Docker-Welt normal.
In unserem Container schreibt MongoDB zum Beispiel alle Daten in einen in der Datei mongodb.conf angegebenen Pfad. Dieser Ordner ist im Container vorhanden. Wenn Sie den Container schließen, gehen alle Daten verloren. Wenn Sie die Daten in einem Ordner beibehalten, der für einen Host-Computer freigegeben ist, den Docker ausführt, können Sie das verwenden -v
Option in der Lauf
Befehl. Zum Beispiel:
docker run -d -v / host / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1.0
Dies wird map /host / mongo_db_path
Welches ist in Ihrem Host-Rechner zu /container / mongo_data_path
was ist in dem Behälter. Immer, wenn der Mongo Daten in den Pfad innerhalb des Containers schreibt, ist er innerhalb der Host-Maschine automatisch verfügbar. Selbst wenn Sie den Container schließen, bleiben die Daten im Pfad innerhalb der Hostmaschine.
Angenommen, MongoDB läuft im Container. Sie können den MongoDB-Port außerhalb des Containers an Port 27017 verfügbar machen, und Sie können den folgenden Befehl verwenden, um von außerhalb des Containers mit Port 5000 zuzugreifen.
docker run -d -P 5000: 27017 -v / host / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1.0
Sie können also innerhalb des Containers über Port 5000 eine Verbindung zu MongoDB herstellen.
Angenommen, Sie benötigen die Netzwerkinformationen des angegebenen Containers. Sie können dieses Detail mit der Docker inspizieren
Befehl. Dieser Befehl druckt viele Metadaten über den Container.
ist der Teil, der in existiert CONTAINER-ID
in dem Docker ps
Ausgabe. Die Ausgabe der Inspektion erfolgt im JSON-Format. Um die IP-Adresse des Containers abzurufen, können Sie Folgendes verwenden:
Docker inspect --format '.NetworkSettings.IPAddress'
Die obigen Befehle sind die grundlegenden Befehle, wenn Sie Docker-Dinge ausführen. Wenn Sie viel über Docker-Befehle erfahren möchten, lesen Sie bitte die Dokumentation.
Es wird empfohlen, jedem Container nur eine Verantwortung zuzuweisen. Ich meine hier, Sie sollten MongoDB- und Spring Boot-Anwendungen nicht in einem Container installieren, um die DB- und Application-Layer in einem Container bereitzustellen. Stattdessen können Sie eine App in einem Container ablegen. Jede Anwendungsinstanz, jedes Datenbankmitglied, jede Nachrichtenwarteschlange usw. sollte nur einen Container enthalten.
Angenommen, Sie legen die Anwendungs- und Datenbankschichten in einem Container ab. Es ist sehr schwierig, die Leistung oder Diagnose für die Anwendung oder Datenbank zu messen. Wenn Sie Ihre Anwendung skalieren möchten, können Sie diesen Container ebenfalls nicht skalieren, da in diesem Container auch eine Datenbankanwendung installiert ist.
Wenn Sie Ihren Container ausführen, dürfen Sie niemals ssh in diesen Container laden, um etwas zu aktualisieren oder zu löschen. Der Hauptgrund für die Verwendung von Docker besteht darin, Ihre Änderungen in Dockerfile historisch zu speichern. Wenn Sie etwas ändern möchten, ändern Sie Dockerfile, erstellen Sie das Image und führen Sie den Container aus. Selbst wenn Sie manuell etwas im Container ändern, wird es gelöscht, wenn der Container erneut ausgeführt wird.
Normalerweise möchten Sie jeden Befehl in separaten Zeilen wie unten beschrieben schreiben.
FROM Ubuntu MAINTAINER Huseyin BABAL RUN apt-get Update RUN apt-get installieren -y build-essential RUN apt-get install -y php5 RUN apt-get install -y nginx CMD ["nginx", "g", "daemon off; "] EXPOSE 80
Dies bedeutet eine Ebene für jede Zeile. Es ist keine vorgeschlagene Methode zum Erstellen von Dockerfile. Sie können Ihre Befehle mit einem umgekehrten Schrägstrich (\) für jede Jobgruppe wie folgt trennen:
FROM ubuntu: 15.04 MAINTAINER Huseyin BABAL RUN apt-get update \ -y build-essential -y php5 \ -y nginx = 1.7.9 \ apt-get clean CMD ["nginx", "g", "daemon off;"] EXPOSE 80
In der oben genannten Docker-Datei haben wir geplant, die erforderlichen Pakete in einer Zeile zu installieren, und führen eine aus sauber
Betrieb, um die Umgebung sauber zu machen. Auf diese Weise haben wir keine separaten Ebenen für jeden Befehl erstellt.
Das Erstellen und Betreiben eines Containers ist sehr einfach. Nach zwei Monaten erhalten Sie möglicherweise 50 Container für Ihre Anwendungsarchitektur! Es ist sehr schwierig, die Ursache eines Problems zu finden, wenn in Ihren Containern ein Fehler auftritt.
Der einfachste Weg, dies zu tun, besteht darin, Ihre Containeraktivitäten in einem zentralen Protokollsystem zu protokollieren. Umleiten Sie beispielsweise Ihre Standardprotokolle in eine Protokolldatei in jedem Container. Ein Agent kann diese Protokollinhalte an ein zentrales Protokollverwaltungssystem wie ELK oder Splunk streamen. Wenn Sie Containerspezifische Daten innerhalb von Protokollen senden, z. B. Container-ID, können Sie Fehler im Protokollverwaltungs-Dashboard sehr einfach filtern.
Möglicherweise möchten Sie den Container selbst überwachen. Diesmal können Sie sich den Google-Ratgeber ansehen. Auf diese Weise können Sie Ihren Container über einen REST-Dienst überwachen. Um beispielsweise Containerinformationen anzuzeigen, können Sie eine GET-Anforderung an senden http: // hostname
/api/v1.0/containers/
.
Wenn Sie Standardprozeduren auf Ihren Containerlebenszyklus anwenden, ist es sehr einfach, Ihre Gesamtarchitektur zu steuern. Sie können beispielsweise einen Basiscontainer erstellen, um einige Vorgänge in anderen Containern zu übernehmen. Andererseits können Sie Standardspeicherorte für Konfigurationsdateien, Protokolldateien und Quelldateien verwenden. Seien Sie vorsichtig bei der Verwendung einer separaten Docker-Datei für jeden Container. Wenden Sie die Versionierung schließlich auf alle Ihre Container an, um die Funktionen zu trennen, und verwenden Sie je nach Bedarf unterschiedliche Versionen.
Sicherheit ist bei Containern ein sehr wichtiges Thema. Führen Sie Ihre Container immer im unprivilegierten Modus aus. Ich schlage vor, dass Sie Apparmor verwenden, um Ihren Container vor externen Threads und sogar Zero-Day-Angriffen zu schützen. Ich empfehle SELinux auch für Ihre Container, um die Sicherheitsrichtlinien für die Zugriffssteuerung entsprechend Ihren Anforderungen anzuwenden. Bleiben Sie auf dem Laufenden mit den Aktualisierungen der Bilder, die Sie in Containern verwenden, um die neuesten Patches auf den Container anzuwenden. Vergessen Sie dabei nicht, Ihr Bild an eine stabile Version anzuhängen.
Modulus ist eine vollständig unterstützte Plattform für die Bereitstellung und Orchestrierung von Unternehmen. Sie begannen zunächst mit einem auf Node.js ausgerichteten PaaS über LXC und beschlossen, zu Docker zu wechseln. Dadurch konnten sie mehr Sprachen unterstützen als Node.js, d. H. PHP-, Java-, Python- und Static-Projekte.
Mit Sprachunterstützung meine ich hier, dass Sie Ihre Anwendung, die in den oben genannten Sprachen geschrieben wurde, mit einem einzigen Befehl mit vordefinierten Eigenschaften für Modulus bereitstellen können. Angenommen, Sie werden eine Node.js-Anwendung für Modulus bereitstellen, und Sie müssen sie nur ausführen Modul bereitstellen
in Ihrem Projektstammordner. Der Modul besteht aus den folgenden Komponenten.
Modulus-CLI ist für den Bereitstellungsvorgang für Ihre Anwendung von der Befehlszeile aus und kann einfach mit installiert werden npm install -g modulus
. Mit Modulus CLI können Sie Projekte erstellen, Projekte bereitstellen, Protokolle streamen und datenbankbezogene Vorgänge ausführen. Alternativ können Sie Ihr Projekt bereitstellen, indem Sie über das Administrationsfenster hochladen.
Sie können Ihre Anwendung mit ein paar einfachen Schritten erstellen und implementieren. Sie können Sprache, Servogröße und Standort auswählen. Dann bereiten Sie sich auf die Bereitstellung Ihres Projekts vor.
Alternativ können Sie ein Projekt in der Kommandozeile mit erstellen Modulprojekt erstellen
und dann Modul bereitstellen
.
Möglicherweise möchten Sie einige Daten in Ihrer Anwendung speichern. Mit Modulus können Sie Ihrer Anwendung auch eine Datenbank hinzufügen. MongoDB wird hinter den Kulissen verwendet. Sie können innerhalb des Dashboards eine Datenbank erstellen und in der Befehlszeile eine Datenbank erstellen. Sie können den Datenbankbildschirm unten sehen.
Sie können die Datenbank-URL auf dem Detailbildschirm abrufen und in Ihren Anwendungen verwenden.
Sie können Anwendungsprotokolle von der Befehlszeile aus mit beenden Modul protokolliert den Schwanz
, Sie können Protokolle auch wie folgt im Dashboard streamen.
Wenn Sie auf klicken STROM können Sie die Protokolle in Echtzeit sehen.
Das sind die Hauptkomponenten von Modul. Sie können sich auch andere Komponenten anschauen Metriken, Auto-Skalierung, Addons, Benachrichtigungen, und Verwaltung im Modul Dashboard.
Wir haben Container besprochen und eine kurze Geschichte gegeben. Im Vergleich zu VMs bietet Docker viele Möglichkeiten zur Verwaltung Ihrer Anwendungsinfrastruktur.
Wenn Sie Docker für Ihre Architektur verwenden, müssen Sie auf einige Konzepte wie Einzelverantwortung, unveränderliche Server, Sicherheit, Anwendungs- und Containerüberwachung achten.
Wenn Ihr System größer wird, ist es sehr einfach zu steuern. Modulus ist eines der Unternehmen, das Docker für sein PaaS-System verwendet. Durch die Nutzung der Leistungsfähigkeit von Docker hat Modulus ein großartiges System entwickelt, mit dessen Hilfe Benutzer ihre Anwendungen, die in Node.js, PHP, Java und Python geschrieben sind, sehr einfach implementieren können.