Docker
Simple Node.js-Anwendung ausführen
Suche…
Ausführen einer Basic Node.js-Anwendung in einem Container
Das Beispiel, das ich besprechen werde, setzt voraus, dass Sie eine Docker-Installation haben, die in Ihrem System funktioniert, und ein grundlegendes Verständnis für die Arbeit mit Node.js. Wenn Sie wissen, wie Sie mit Docker arbeiten müssen, sollte klar sein, dass das Node.js-Framework nicht auf Ihrem System installiert werden muss. Stattdessen verwenden wir die latest Version des von Docker verfügbaren node . Daher können Sie das Bild bei Bedarf vorher mit dem Befehls- docker pull node herunterladen. (Der Befehl pulls automatisch die neueste Version des node aus dem Andockfenster.)
Fahren Sie mit der Erstellung eines Verzeichnisses fort, in dem sich alle Ihre aktiven Anwendungsdateien befinden würden. Erstellen
package.jsonin diesem Verzeichnis einepackage.jsonDatei, die Ihre Anwendung sowie die Abhängigkeiten beschreibt. Ihrepackage.jsonDatei solltepackage.jsonso aussehen:{ "name": "docker_web_app", "version": "1.0.0", "description": "Node.js on Docker", "author": "First Last <[email protected]>", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.13.3" } }
Wenn wir mit Node.js arbeiten müssen, erstellen wir normalerweise eine
serverDatei, die eine Webanwendung definiert. In diesem Fall verwenden wir dasExpress.jsFramework (ab Version4.13.3). Eine grundlegendeserver.jsDatei würdeserver.jsso aussehen:var express = require('express'); var PORT = 8080; var app = express(); app.get('/', function (req, res) { res.send('Hello world\n'); }); app.listen(PORT); console.log('Running on http://localhost:' + PORT);Für diejenigen, die mit Docker vertraut sind, hätten Sie eine Docker-
Dockerfile. EineDockerfileDatei ist eine Textdatei, die alle Befehle enthält, die zum Erstellen eines benutzerdefinierten Abbilds erforderlich sind, das auf Ihre Anwendung zugeschnitten ist.
Erstellen Sie eine leere Textdatei mit dem Namen Dockerfile im aktuellen Verzeichnis. Die Methode zum Erstellen ist in Windows unkompliziert. Unter Linux möchten Sie möglicherweise touch Dockerfile in dem Verzeichnis ausführen, das alle für Ihre Anwendung erforderlichen Dateien enthält. Öffnen Sie die Docker-Datei mit einem beliebigen Texteditor und fügen Sie die folgenden Zeilen hinzu:
FROM node:latest
RUN mkdir -p /usr/src/my_first_app
WORKDIR /usr/src/my_first_app
COPY package.json /usr/src/my_first_app/
RUN npm install
COPY . /usr/src/my_first_app
EXPOSE 8080
FROM node:latestweist den Docker-Dämon an, von welchem Image wir erstellen wollen. In diesem Fall verwenden wir dielatestVersion des offiziellen Docker-Image-nodedie im Docker Hub verfügbar ist.In diesem Bild erstellen wir ein Arbeitsverzeichnis, das alle erforderlichen Dateien enthält, und weisen den Dämon an, dieses Verzeichnis als das gewünschte Arbeitsverzeichnis für unsere Anwendung festzulegen. Dazu fügen wir hinzu
RUN mkdir -p /usr/src/my_first_app WORKDIR /usr/src/my_first_appAnschließend fahren wir mit der Installation von Anwendungsabhängigkeiten fort, indem wir zunächst die
package.jsonDatei (die die Anwendungsinformationen einschließlich der Abhängigkeiten angibt) in das Arbeitsverzeichnis/usr/src/my_first_appim Image verschieben. Wir machen das durchCOPY package.json /usr/src/my_first_app/ RUN npm installWir geben dann
COPY . /usr/src/my_first_app, um alle Anwendungsdateien und Quellcode zum Arbeitsverzeichnis im Image hinzuzufügen.Dann verwenden wir die Anweisung
EXPOSE, um den Daemon anzuweisen, Port8080des resultierenden Containers sichtbar zu machen (über eine Container-zu-Host-Zuordnung), da die Anwendung an Port8080bindet.Im letzten Schritt
node server.jswir den Dämon an, den Befehlsknotennode server.jsim Image auszuführen, indem Sie dennode server.jsnpm startausführen. Wir verwenden dazu dieCMDDirektive, die die Befehle als Argumente übernimmt.CMD [ "npm", "start" ]
Wir erstellen dann eine
.dockerignore-Datei in demselben Verzeichnis wie dieDockerfile, um zu verhindern, dass unsere von Node.js-Systeminstallation verwendete Kopie vonnode_modulesund Protokollen in das Docker-Image kopiert wird. Die.dockerignoreDatei muss den folgenden Inhalt haben:node_modules npm-debug.logBauen Sie Ihr Bild auf
Navigieren Sie zu dem Verzeichnis, das die Docker- Dockerfile enthält, und führen Sie den folgenden Befehl aus, um das Docker-Image zu erstellen. Mit der Markierung -t können Sie Ihr Bild mit einem Tag versehen, sodass Sie es später leichter finden können, indem Sie den Befehl docker images verwenden:
$ docker build -t <your username>/node-web-app .
Ihr Bild wird jetzt von Docker aufgelistet. Zeigen Sie Bilder mit dem folgenden Befehl an:
$ docker images
REPOSITORY TAG ID CREATED
node latest 539c0211cd76 10 minutes ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago
Ausführen des Bildes
Wir können jetzt das soeben erstellte Image mit den Inhalten der Anwendung, dem node Basis-Image und der Dockerfile . Wir führen nun unser neu erstelltes Image <your username>/node-web-app . Durch die Option -d für den docker run Befehl wird der Container im separaten Modus ausgeführt, sodass der Container im Hintergrund ausgeführt wird. Das Flag -p leitet einen öffentlichen Port an einen privaten Port innerhalb des Containers weiter. Führen Sie das zuvor erstellte Image mit diesem Befehl aus:
$ docker run -p 49160:8080 -d <your username>/node-web-app
Drucken Sie die Ausgabe Ihrer App, indem Sie
docker psauf Ihrem Terminaldocker ps. Die Ausgabe sollte ungefähr so aussehen.CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b701693b294 <your username>/node-web-app "npm start" 20 minutes ago Up 48 seconds 0.0.0.0:49160->8080/tcp loving_goldstine
docker logs <CONTAINER ID> Sie die Anwendungsausgabe ab, indem Sie docker logs <CONTAINER ID> . In diesem Fall handelt es sich um docker logs 7b701693b294 .
Ausgabe: Running on http://localhost:8080
- Von der
docker psAusgabe vondocker pslautet das erhaltene Port-Mapping0.0.0.0:49160->8080/tcp. Daher ordnete Docker den8080Port im Container dem Port 49160 auf der Hostmaschine zu. Im Browser können wir jetztlocalhost:49160eingebenlocalhost:49160.
Wir können unsere App auch mit curl aufrufen:
$ curl -i localhost:49160
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
Date: Sun, 08 Jan 2017 14:00:12 GMT
Connection: keep-alive
Hello world