German Translation:
NEM Docker Entwicklung
Einleitung
nem-docker ist eine Docker Konfiguration mit begleitenden Hilfescripts, die auf Github verfügbar sind. Es ist eine der einfachsten Lösungen um einen NEM node einzurichten und aktuell zu halten. Dieser Blogbeitrag erklärt die Struktur und Entwicklung dieser Docker Konfiguration.
Eine Anwendung in einem Container laufen zu lassen bringt Vorteile wie beispielsweise Isolation, es bringt aber auch einige Einschränkungen mitsich. Beispiele hierfür sind: Mangel an permanentem Speicher, ein bestimmtes Netzwerk-Setup und kein init-System. Diese Docker-Konfiguration und die dazugehörigen Hilfescripts helfen dir das Ganze möglichst reibungslos zum laufen zu bringen. Wir befolgen dabei sogar Best Pratice Empfelungen wie die Überprüfung der Hashwerte der huntergeladenen NEM-Software (würdest du das bei einer manuellen Installation auch machen? ;-)) Lass uns loslegen!
Zwei Arten um Docker laufen zu lassen
Bevor ein Docker Container laufen kann, muss zunächst ein Image dafür erstellt werden. Du kannst diesen Schritt mit dem Aufbau eines Dateisystems für den Container vergleichen. Es gibt zwei Möglichkeiten dies zu bewerkstelligen. Entweder erstellst du das Image lokal oder du lädst das Image vom Docker Hub herunter.
Image von Docker Hub herunterladen
Auf Docker Hub sind Images fĂĽr den Betrieb von nis oder ncc verfĂĽgbar.
Das NIS Image wird aktuell vom Deploy on Azure Scripts verwendet.
Jedes Image ist in einem spezifischen Git-Zweig auf Github abgelegt (nis and ncc). Beide Zweige basieren auf einem dritten Zweig der als hub benannt ist. Die meisten Ă„nderungen finden im hub-Zweig statt. Die nis- und ncc-Zweige enthalten nur Ă„nderungen betreffend Software die zuerst gestartet werden muss.
Image lokal erstellen
Du kannst das image auch lokal erstellen. Die Docker-Konfiguration ist im master branch auf GithHub verfĂĽgbar.
Das erstellen des Images und und der Betrieb des Containers wird durch die Helfer-Scripts vereinfacht. Dies ist aktuell ist am besten getestete Installationsmethode und es wird empfohlen es auf diese Weise durchzufĂĽhren.
Erstellen des Images
Wir konzentrieren uns nun auf das lokal erstellte Image, weil das Reposistory, welches das Dockerfile enthält, auch Beispielkonfigurationsdateien enthält, die aber minimale Unterschiede zu denen auf Dockerhub aufweisen. Weitere Informationen zum Download des Docker-Images findest du weiter unten in diesem Beitrag.
Um einen Docker-Container laufen zu lassen, musst du zuerst das Image beschreiben von dem es nachher laufen soll. Dies wird in der Dockerfile Datei definiert.
Lass uns einen Blick in das nem-docker Dockerfile werfen. Die Links zeigen jeweils auf die relevanten Codezeilen in der Github Datei. Das Container-Image basiert auf Fedora und installiert die benötigten Pakete.
Die aktuellste Version wird heruntergeladen und dessen Valididtät wird überprüft. Wenn die Prüfung erfolgreich ist, wird das Archiv dekomprimiert und die NEM Software wird im /package
Verzeichnis des Containers verfĂĽgbar.
Anschliessend wird ein NEM user hinzugefĂĽgt und weitere Verzeichnisse erstellt, welches NEM Softwaredaten enthalten.
Der Servant wird ebenfalls heruntergealden und installiert, wodurch diese Konfiguration Supernode-tauglich wird.
Docker wurde gemacht um einen Befehl pro Container ausführen zu können. Um diesem Problem aus dem Weg zu gehen, wenn du ein Supernode betreiben möchtest, die Command, die wir verwenden in unserem Container ist supervisord, die kontrolliert welche Software im Container ausgeführt wird.
Wenn ein Image erstellt wird, wird eine Standard supervisord Konfiguration in das Image eingefĂĽgt. Diese Konfiguration definiert lediglich welche Services (NIS, NCC, servant) verfĂĽgbar sind ohne einen von diesen automatisch zu starten.
Im Weiteren definiert das Dockerfile auf welche Ports der Container hören wird und zeigt anschliessend welche Kommandozeile der Container ausführen wird.
Container ausfĂĽhren
Jetzt wo das Image erstellt wurde, können wir den Container mit dem befehl sudo docker run
ausfĂĽhren. Nun gibt es noch einige wichtige Dinge die du beachten solltest.
Persistenter Speicher
Alle Änderungen die im Dateisystem des Containers durchgeführt werden beziehen ausschliesslich auf diesen Container.Wenn du ein Upgrade auf die neuste NEM Version durchführen willst, musst du ein neues Image erstellen und einen neuen Container starten, welcher die zurvor durchgeführten Änderungen am alten Container nicht mehr enthält. Wenn du ein NIS am laufen hast, bedeutet das, dass du nach jedem Update die gesamte Blockchain neu herunterladen musst.
Dieses Problem kann mit der Nutzung eines Docker Volumes gelöst werden. Der beste Weg um das zu Nutzen ist, wenn du das Hostverzeichnis direkt an den Container hängst. So kannst du den Inhalt des Verzeichnisses durchsuchen während der Container am laufen ist. Dies kann einfach durch die nutzung des Flags -v /path/to/host/dir:/home/nem/nem
bewerkstelligt werden, da die NEM Software Daten innerhalb des Containers in /home/nem/nem
gespeichert werden.
Individuelle Konfigurationen
Du möchtest gewiss auch individuelle Konfigurationen an die NEM Software im Container übergeben. Dies ist ebenfalls einfach, da gleich wie beim Einhängen von Verzeichnissen, auch individuelle Dateien an einen Container gehängt werden können. Es ist nur eine Frage des Einhängens des richtigen Files an der richtigen Stelle im Container. Hier findest du die Konfigurationsdateien im Container:
- NIS: /package/nis/config-user.properties
- NCC: /package/ncc/config-user.properties
- Servant: /servant/config.properties
- Supervisord: /etc/supervisord.conf
Wenn deine individuelle Konfigruation im Verzeichnis /home/tom/nis.xml
liegt, kannst du diese mit der Ăśbergabe der folgenden Option nutzen: -v /home/tom/nis.xml:/package/nis/config-user.properties
.
Ports zuweisen
Software, die im Container läuft, öffnet TCP ports. Um diese Container Ports den Host Ports zuzuweisen kann folgende Flag -p container_port:host_port
dem drocker run
ĂĽbergeben werden.
Zum Beispiel um den NIS port zuzuweisen, ĂĽbergebe dem docker run die Option -p 7890:7890
Anwendung
Nun lasst uns unser eigenes Image erstellen und einen Docker Container mit NIS laufen lassen.
Zunächst klonen wir das Repository:
git clone https://github.com/rb2nem/nem-docker.git
danach erstellen wir das Image:
cd nem-docker/
sudo docker build -t nem_image
Nach einiger Zeit sollte folgende Meldung erscheinen:
Successfully built
Wir werden NIS im Container laufen lassen und wir wollen NIS automatisch starten lassen, sobald wir den Container am laufen haben. HierfĂĽr mĂĽssen wir die supervisord Konfiguration updaten:
cp custom-configs/supervisord.conf.sample custom-configs/supervisord.conf
edit custom-configs/supervisord.conf
Die letzte Zeile öffent die Datei im Editor vim in meinem System, aber du kannst den edit
Befehl durch deinen bevorzugten Editor ersetzen. Für Anfänger empfiehlt sich der Einsatz von nano
.
Ă„ndere in der Sektion [program:nis]
die autostart
Zeile zu autostart=true
und speichere die Datei.
FĂĽr Demonstrationszwecke werde ich die NEM-Daten in /tmp/nem
speichern (mach dies bitte nicht in einer produktiven Umgebung, wähle ein anderes Verzeichnis als /tmp
sonst wirst du alle Daten verlieren beim nächsten Neustart…). Erstelle folgendes Verzeichnis:
mkdir /tmp/nem
Nun ist alles eingerichtet um den Container laufen zu lassen. Um NIS laufen zu lassen musst du Port 7890 öffnen mit der Option -p 7890:7890
, hänge das NEM Datenverzeichnis vom Host mit dem Befehl -v "/tmp/nem:/home/nem/nem"
ein, und hänge die supervisord Konfiguration mit -v "$PWD/custom-configs/supervisord.conf:/etc/supervisord.conf"
ein.
Beachte, dass eingehängte Dateien und Verzeichnisse in einem Container eine absolute Pfadangabe benötigen, daher wird $PWD
verwendet, welches das aktuelle Arbeitsverzeichnis ausgibt. Zuletzt gib dem Container den Namen nem
. Der Vollständige Befehl lautet:
sudo docker run -d -p 7890:7890 \
-v "/tmp/nem:/home/nem/nem" \
-v "$PWD/custom-configs/supervisord.conf:/etc/supervisord.conf" \
--name nem \
nem_image
-d
lässt den Container als Daemon laufen, welcher dir die Shell-Command zurückgibt.
Der Container wird dem nem
Verzeichniss den Benutzer nem
zuordnen, welcher die User-ID 1000 hat. Zusätzlich wird der Container die Rechte read (lesen), write (schreiben) und execute (ausführen) der Gruppe des genannten Verzeichnisses zuweisen. Dies sollte den Zugang zum Verzeichnis ermöglichen, auch wenn die User-ID des Hosts nicht 1000 entspricht.
Nach einpaar Sekunden solltest du den laufenden NIS auf Port 7890 auf deinem Locallost mit diesem Befehl erreichen können (installiere curl auf deinem Host, wenn nötig oder nutze einen Webbrowser):
curl http://localhost:7890/status
Falls du folgende Fehlermeldung erhältst:
curl: (56) Recv failure: Connection reset by peer
könnte das NIS möglicherweise noch am starten sein. Wenn NIS aufgestartet ist, solltest du folgende Rückmeldung erhalten:
{"code":5,"type":4,"message":"status"}
Code 5 beudetet:
Der lokale Node ist geladen (impliziert, dass NIS am laufen ist). Hier ist die Bedeutung der anderen Codes beschrieben.
Wenn du selbst nach einigen Minuten keine Erfolgsmeldung erhältst, kannst du den NIS Log unter /tmp/nem/nis-stderr.log
ĂĽberprĂĽfen.
Wenn NIS am laufen ist, gibt dir curl http://localhost:7890/node/info
Informationen zu deiner Node.
Nun kannst du den Container sicher stoppen und entfernen:
sudo docker stop nem
sudo docker rm nem
Da keine Daten im Container gespeichert sind, kann er sicher entfernt werden. Nächstes Mal wenn du den Container starten möchtest, gibst du den selben sudo docker run
Befehl ein und er wird sofort starten, da er die zwischengespeicherten Daten nutzen kann um den Container zu erstellen. Zusätzlich wird er die bereits heruntergeladene Blockchain nutzen.
Betrieb mit Docker Hub Images
Die folgenden Befehle kannst du nutzen, um mit Docker Hub Images anstatt mit einem selbsterstellten Image zu arbeiten, um das selbe umzusetzen, wie im vorherigen Abschnitt beschrieben.
Das rb2nem/nis Image ist bereits so konfiguriert, dass NIS automatisch gestartet wird. Demzufolge musst du die supervisord Konfiguration nicht ändern:
mkdir /tmp/nem
sudo docker run -d -p 7890:7890\
-v "/tmp/nem:/home/nem/nem" \
--name nem \
rb2nem/nis
Falls du trotzdem die Standard-Konfigurationsdateien die im Container genutzt werden ändern möchtest, nutze die Beispiel-Konfigurationsdatei, die du im Repository im Verzeichnis custom-configs
findest:
git clone https://github.com/rb2nem/nem-docker.git
Denke daran, dass in diesen Beispielkonfigurationen kein Service automatisch gestartet wird. Vergesse daher nicht das autostart
Feld zu ändern!
Gibt es einen einfacheren Weg?
Wir haben gesehen wie wir NEM in einem Docker Container laufen lassen können, leider erfordert dies das Ausführen von umständlichen Befehlen. Wäre es nicht einfacher ein Script zu erstellen, welches all die benötigten Parameter bei Bedarf übergibt? Natürlich! Die Gute nachricht ist, dass Scripts hierfür existieren. Wir werden dieseim nächsten Beitrag über NEM Docker Container behandeln.
Hi I am new,
Wanted to use the docker config ndev. I am using MacOS Sierra. Got the following error when execute ./ndev
in the terminal.
ERROR: Named volume "nis:/Users/azlan/nem-dev/nis/nem:rw" is used in service "nemdevnis" but no declaration was found in the volumes section.
Error: No such container: docker_nemdevnis_1
The following is my yaml file:
version: '2'
services:
nemdevnis:
# build: "nis"
image: "rb2nem/nem-dev-guide:nis"
volumes:
- ${persistent_location}:/Users/azlan/nem-dev/nis/nem
nemdevtools:
# build: "tools"
image: "rb2nem/nem-dev-guide:tools"
# image: "test"
volumes:
- ${tools_dir}:/Users/azlan/nem-dev/code
ports:
- "8081:8081"
- "8082:8082"
- "7778:7778"
- "7890:7890"
Appreciate for your help, thanks in advance.