Wie oft mussten Sie Serverumgebungen konfigurieren, um Ihre Anwendung bereitzustellen (z. B. eine Website)? Sicher öfter als ich möchte.
Im besten Fall hatten Sie ein Skript, das dies alles automatisch erledigte. Im schlimmsten Fall könnte es so aussehen:
- Installieren Sie die Datenbank D Version xxx
- Installieren Sie den Webserver N Version xx usw.
Das so konfigurierte Umweltmanagement wird mit der Zeit sehr ressourcenintensiv. Jede geringfügige Änderung der Konfiguration bedeutet mindestens:
- dass jeder Entwickler über diese Änderungen informiert sein sollte
- Alle diese Änderungen sollten sicher in die Produktionsumgebung eingefügt werden
Es ist schwierig, solche Änderungen zu verfolgen und ohne spezielle Tools zu verwalten. Auf jeden Fall gibt es Probleme bei der Konfiguration von Umgebungsabhängigkeiten. Je weiter die Entwicklung voranschreitet, desto schwieriger wird es, diese Probleme zu finden und zu beheben.
Oben habe ich beschrieben, was als Vendor Lock-In bezeichnet wird. Für die Entwicklung von Anwendungen, insbesondere vom Servertyp, wird dieses Phänomen zu einem großen Problem. In diesem Artikel werden wir eine der möglichen Lösungen betrachten -
Docker . Sie lernen, wie Sie eine darauf basierende Anwendung erstellen, bereitstellen und ausführen.
/ Haftungsausschluss: / Dies ist keine Überprüfung des Docker. Am Ende dieses Artikels finden Sie eine Liste nützlicher Literatur, die beschreibt, wie Sie besser mit Docker arbeiten können. Dies ist der erste Einstiegspunkt für Entwickler, die die Bereitstellung von node.js-Anwendungen mithilfe von Docker-Containern planen.
Bei der Entwicklung
eines meiner Projekte war ich mit einem Mangel an detaillierten Artikeln konfrontiert, was zu einer beträchtlichen Anzahl von Fahrrädern führte. Dieser Beitrag ist etwas spät und versucht, den Mangel an Informationen zu diesem Thema zu beheben.
Was ist es und womit isst es?
Mit einfachen Worten, Docker ist eine Abstraktion von LXC-Containern. Dies bedeutet, dass mit Docker gestartete Prozesse nur sich selbst und ihre Nachkommen sehen. Solche Prozesse werden Docker-Container genannt.
Um auf der Grundlage solcher Container eine Art Abstraktion erstellen zu können, ist in Docker ein Image vorhanden (/ docker image /). Basierend auf dem Docker-Image können Sie Container konfigurieren und erstellen.
Es gibt Tausende von vorgefertigten Docker-Images mit vorinstallierten Datenbanken, Webservern und anderen wichtigen Elementen. Ein weiterer Vorteil von Docker ist, dass es ein sehr wirtschaftliches Tool für den Speicherverbrauch ist, da nur die benötigten Ressourcen verwendet werden.
Komm näher
Wir werden uns nicht lange mit der
Installation befassen. Der Prozess in den letzten Releases wurde auf wenige Klicks / Teams vereinfacht.
In diesem Artikel analysieren wir die Bereitstellung einer Docker-Anwendung am Beispiel einer Server-Node.js-Anwendung. Hier ist der primitive Quellcode:
// index const http = require('http'); const server = http.createServer(function(req, res) { res.write('hello world from Docker'); res.end(); }); server.listen(3000, function() { console.log('server in docker container is started on port : 3000'); });
Wir haben mindestens zwei Möglichkeiten, eine Anwendung in einen Docker-Container zu packen:
- Erstellen und Ausführen eines Containers aus einem vorhandenen Image mithilfe des Befehlszeilenschnittstellentools.
- Erstellen Sie Ihr eigenes Bild basierend auf dem fertigen Beispiel.
Die zweite Methode wird häufiger angewendet.
Laden Sie zunächst das offizielle Bild von node.js herunter:
docker pull node
Der Docker-Pull-Befehl lädt ein Docker-Image herunter. Danach können Sie den Docker-Befehl ausführen. Dadurch wird der Container basierend auf dem heruntergeladenen Image erstellt und ausgeführt.
docker run -it -d --rm -v "$PWD":/app -w=/app -p 80:3000 node node index.js
Dieser Befehl startet die Datei index.js, ordnet 3000 Ports 80 zu und zeigt die ID des erstellten Containers an. Schon besser! Aber mit einer CLI werden Sie nicht weit kommen. Lassen Sie uns eine Docker-Datei für unseren Server erstellen.
FROM node WORKDIR /app RUN cp . /app CMD ["node", "index.js"]
Diese Docker-Datei beschreibt das Image, von dem die aktuelle Version geerbt wird, sowie das Verzeichnis, in dem Containerbefehle und der Befehl zum Kopieren von Dateien aus dem Verzeichnis, in dem die Image-Assembly gestartet wird, gestartet werden. Die letzte Zeile gibt an, welcher Befehl im erstellten Container ausgeführt wird.
Als Nächstes müssen wir aus dieser Docker-Datei ein Image erstellen, das wir bereitstellen werden:
Docker-Build -t Benutzername / Helloworld-with-Docker: 0.1.0 . Dieser Befehl erstellt ein neues Bild, markiert es mit dem
Benutzernamen / helloworld-with-docker und erstellt ein 0.1.0-Tag.
Unser Container ist fertig. Wir können es mit dem Docker-Befehl ausführen. Damit lösen wir das Problem der Lieferantenbindung. Der Start der Anwendung hängt nicht mehr von der Umgebung ab. Der Code wird zusammen mit dem Docker-Image geliefert. Mit diesen beiden Kriterien können wir die Anwendung an jedem Ort bereitstellen, an dem Docker ausgeführt werden kann.
Bereitstellen
Die ersten 99% sind nicht so schrecklich wie die restlichen 99%.
Nachdem wir alle oben genannten Anweisungen ausgeführt haben, wird der Bereitstellungsprozess selbst zu einer Frage der Technologie und Ihrer Entwicklungsumgebung. Wir werden zwei Optionen für die Bereitstellung von Docker in Betracht ziehen:
- manuelle Bereitstellung des Docker-Images;
- Bereitstellung mit Travis-CI.
In jedem Fall werden wir in Betracht ziehen, das Image an eine unabhängige Umgebung zu liefern, z. B. den Staging-Server Ihres Produkts.
Manuelle Bereitstellung
Diese Option ist gut, wenn Sie keine kontinuierliche Integrationsumgebung haben. Zuerst müssen Sie das Docker-Image an einen Ort hochladen, auf den der Staging-Server zugreifen kann. In unserem Fall handelt es sich um einen DockerHub. Für jeden Benutzer stellt er kostenlos ein privates Image-Repository und eine unbegrenzte Anzahl öffentlicher Repositorys zur Verfügung.
Melden Sie sich an, um auf unseren DockerHub zuzugreifen:
docker login -e username@gmail.com -u username -p userpass
Wir
laden unser Bild dort:
Docker Push Benutzername / Helloworld-with-Docker: 0.1.0.Wechseln Sie als Nächstes zum Staging-Server (ich erinnere Sie daran, dass Docker bereits darauf vorinstalliert sein muss).
Um unsere Anwendung auf dem Server bereitzustellen, müssen wir nur einen Befehl ausführen:
docker run -d --rm -p 80:3000 username/helloworld-with-docker:0.1.0.
Und alle! Überprüfen Sie das lokale Register der Bilder. Wenn Sie das gewünschte Ergebnis nicht finden, geben Sie den
Benutzernamen / helloworld-with-docker ein , um die DockerHub-Registrierung zu überprüfen. Ein Bild mit diesem Namen finden Sie im Register, da wir es dort bereits hochgeladen haben. Docker lädt es herunter, erstellt einen Container auf seiner Basis und startet Ihre Anwendung darin.
Jetzt können Sie jedes Mal, wenn Sie die Version Ihrer Anwendung aktualisieren müssen, mit einem neuen Tag pushen und den Container auf dem Server jedes Mal neu starten.
PS Diese Methode wird nicht empfohlen, wenn Travis-CI verwendet werden kann.
Bereitstellen mit Travis-CI
Fügen Sie zunächst die DockerHub-Daten zu Travis-CI hinzu. Sie werden in Umgebungsvariablen gespeichert.
travis encrypt DOCKER_EMAIL=email@gmail.com travis encrypt DOCKER_USER=username travis encrypt DOCKER_PASS=password
Dann fügen wir die empfangenen Schlüssel zur Datei .travis.yml hinzu. Wir werden auch jedem Schlüssel einen Kommentar hinzufügen, um in Zukunft zwischen ihnen zu unterscheiden.
env: global: - secure: "UkF2CHX0lUZ...VI/LE=" # DOCKER_EMAIL - secure: "Z3fdBNPt5hR...VI/LE=" # DOCKER_USER - secure: "F4XbD6WybHC...VI/LE=" # DOCKER_PASS
Als nächstes müssen wir uns anmelden und das Bild herunterladen:
after_success: - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - docker build -f Dockerfile -t username/hello-world-with-travis. - docker tag username/hello-world-with-travis 0.1.0 - docker push username/hello-world-with-travis
Die Bildübertragung kann von Travis-CI auf verschiedene Arten gestartet werden:
- manuell;
- über SSH-Verbindung;
- Online-Bereitstellungsdienste (Deploy Bot, deployhq);
- AWS CLI;
- Kubernates;
- Tools für die Docker-Bereitstellung.
Zusammenfassung
In diesem Artikel haben wir die Vorbereitung und Bereitstellung von Docker anhand eines einfachen node.js-Servers als Beispiel auf zwei Arten untersucht: automatisch und automatisiert mit Travis-CI. Ich hoffe, dieser Artikel hat Ihnen geholfen.