Über diese Knotenanwendung
Diese Anwendung enthält ein Paket.json, server.js und eine .gitignore -Datei, die einfach genug sind, um einfach zu erledigen.
.Gitignore
node_modules/*
package.json
{"Name": "Docker-dev", "Version": "0.1.0", "Beschreibung": "Docker Dev", "Abhängigkeiten": {"Connect-redis": "~ 1.4.5", "Express": "~ 3.3.3", "Hiredis": "~ 0.1.15", "Redis": "~ 0.8.4"}}}}}server.js
var express = required ('express'), app = express (), Redis = required ('redis'), redisStore = required ('connect-redis') (express), server = required ('http'). createServer (App); app.configure (function () {app.use (express.cookieper ('storeser (' keyboards ')) (' keyboard ('keyboard'); RedisStore ({host: process.env.redis_host || 'localhost', port: process.env.redis_port || 6379, db: process.env.redis_db || 0}), Cookie: {Ablauf: false, maxage: 30 * 24 * 60 * 1000}})})}); res.json ({Status: "OK"});}); var port = process.env.http_port || 3000; Server.Listen (Port); console.log ('Anhörungen auf Port' + Port);Server.js zieht alle Abhängigkeiten und startet eine bestimmte Anwendung. Diese spezifische Anwendung wird so eingestellt, dass Sitzungsinformationen in Redis gespeichert werden, und enthält einen Anforderungsendpunkt, der auf eine JSON -Statusnachricht reagiert. Das ist alles sehr Standard.
Eine Sache zu beachten ist, dass Verbindungsinformationen für Redis mithilfe von Umgebungsvariablen umschreiben können. Dies spielt eine Rolle bei der späteren Migration vom Entwicklungsumfeld -Entwickler bis zur Produktionsumgebung.
Docker -Datei
Für Entwicklungsbedürfnisse werden Redis und Knoten im selben Container ausgeführt. Dazu werden wir eine Dockerfile verwenden, um diesen Container zu konfigurieren.
Dockerfile
Von DockerFile / Ubuntumaintainer Abhinav Ajgaonkar <[email protected]># Installieren http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz && / tar -xzf node-v0.10.28-linux-x64.tar.gz && / mv node-v0.10.28-linux-x64 node && / cd /usr/local/bin && /ln -S/opt/node/bin/*. && /rm -f /opt/node-v0.10.28-linux-x64.tar.gz# Legen Sie das Arbeitsverzeichnis fest.
Lassen Sie es uns einzeln verstehen,
Von Dockerfile/Ubuntu
Diesmal wird Docker aufgefordert, das von Docker Inc. als Benchmark -Bild zum Erstellen bereitgestellte Dockerfile/Ubuntu -Bild zu verwenden.
LAUFEN /
APT -Get -y -QQ Installieren Sie Python Redis -Server
Das Benchmark -Bild enthält überhaupt nichts - daher müssen wir APT -GET verwenden, um alles zu erhalten, was die Anwendung ausführen muss. Dieser Satz wird Python und Redis-Server installieren. Der Redis -Server ist notwendig, da wir die Sitzungsinformationen in sie speichern und die Notwendigkeit von Python darin besteht, dass sie in die C -Erweiterung des Redis -Knotenmoduls über NPM integriert werden kann.
Run /cd /opt && /wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz && /tar -xzf node-V0.10.28-linux-x64.tar.gz && /mv node-v0.10.10.10.10.10.28-28.x64.tar MV-Knoten-V0.10.28-linux-x64 Knoten &&/cd/usr/local/bin &&/ln -s/opt/node/bin/*. && /rm -f /opt/node-v0.10.28-linux-x64.tar.gz
Dies lädt und extrahiert den 64-Bit-NodeJS-Binärdatum.
WorkDir /Src
In diesem Satz wird Docker mitteilen, dass der Container nach Beginn der CD /SRC einmal die von der CMT -Eigenschaft angegebenen Dinge ausführen muss.
CMD ["/bin/bash"]
Als letzter Schritt rennen /bin /bash.
Container bauen und ausführen
Nachdem die Docker -Datei geschrieben wurde, erstellen wir ein Docker -Bild.
Docker Build -t Sqldump/Docker -dev: 0.1.
Sobald das Bild erstellt wurde, können wir einen Container mit der folgenden Anweisung ausführen:
Docker run -i -t - -rm / -p 3000: 3000 / -v `pwd`: / src / sqldump / docker -dev: 0.1
Schauen wir uns an, was im Docker Run -Befehl passiert.
-Ich startet den Container im interaktiven Modus (im Vergleich zu -d befindet sich im separaten Modus). Dies bedeutet, dass der Container nach Ablauf der interaktiven Sitzung beendet wird.
-t weist eine pseudo-tty zu.
-RM entfernen den Container und sein Dateisystem beim Verlassen.
-P 3000: 3000 leitet Port 3000 am Host an Port 3000 am Container weiter.
-V `pwd`:/src
In diesem Satz wird das aktuelle Arbeitsverzeichnis im Host (z. B. unsere Projektdatei) an /src montiert. Wir hängen das aktuelle Verzeichnis als Volumen auf, anstatt den Befehl add in der dockerfile zu verwenden, damit alle im Texteditor vorgenommenen Änderungen sofort im Container angezeigt werden können.
SQLDUMP/DOCKER-DEV: 0.1 ist der Name und die Version des Docker-Images. Dies ist der gleiche wie der Name und die Version, mit denen wir das Docker -Bild erstellt haben.
Da die Dockerfile CMD ["/bin/bash"] angibt, werden wir uns in einer Bash -Shell -Umgebung anmelden, sobald der Container begonnen wird. Wenn der Befehl Docker Run erfolgreich ausgeführt wird, sieht er wie folgt aus:
Entwicklung beginnen
Jetzt wird der Container ausgeführt, bevor wir mit dem Schreiben von Code beginnen, müssen wir einige Standard-Docker-Dinge aussortieren. Zunächst müssen wir die folgende Anweisung verwenden, um den Redis -Server im Container zu starten:
Service Redis-Server-Start
Installieren Sie dann die Projektabhängigkeiten und Nodemon. Nodemon beobachtet Änderungen in der Projektdatei und startet den Server rechtzeitig neu.
npm installNpm install -g nodemon
Starten Sie den Server schließlich mit dem folgenden Befehl:
nodemon server.js
Wenn Sie nun zu http: // localhost: 3000 in Ihrem Browser navigieren, sollten Sie so etwas sehen:
Fügen wir einen weiteren Endpunkt wie Server.js hinzu, um den Entwicklungsprozess zu simulieren:
app.get ('/hello/: name', function (req, res) {res.json ({hello: req.params.name});});Sie werden sehen, dass Nodemon die von Ihnen vorgenommenen Änderungen erkannt und den Server neu gestartet hat:
Und jetzt, wenn Sie in Ihrem Browser zu http: // localhost: 3000/hello/world navigieren, sehen Sie die folgende Antwort:
Produktionsumgebung
Container im aktuellen Zustand sind weit davon entfernt, als Produkte veröffentlicht zu werden. Die Daten in Redis sind beim Neustart von Containern nicht mehr hartnäckig. Wenn Sie beispielsweise den Container neu starten, werden alle Sitzungsdaten ausgelöscht. Das gleiche wird passieren, wenn Sie den Container zerstören und einen neuen Container öffnen, was offensichtlich nicht das ist, was Sie wollen. Ich werde im produkten Inhalt des zweiten Teils über dieses Problem sprechen.