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.json
in diesem Verzeichnis einepackage.json
Datei, die Ihre Anwendung sowie die Abhängigkeiten beschreibt. Ihrepackage.json
Datei solltepackage.json
so 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
server
Datei, die eine Webanwendung definiert. In diesem Fall verwenden wir dasExpress.js
Framework (ab Version4.13.3
). Eine grundlegendeserver.js
Datei würdeserver.js
so 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
. EineDockerfile
Datei 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:latest
weist den Docker-Dämon an, von welchem Image wir erstellen wollen. In diesem Fall verwenden wir dielatest
Version des offiziellen Docker-Image-node
die 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_app
Anschließend fahren wir mit der Installation von Anwendungsabhängigkeiten fort, indem wir zunächst die
package.json
Datei (die die Anwendungsinformationen einschließlich der Abhängigkeiten angibt) in das Arbeitsverzeichnis/usr/src/my_first_app
im Image verschieben. Wir machen das durchCOPY package.json /usr/src/my_first_app/ RUN npm install
Wir 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, Port8080
des resultierenden Containers sichtbar zu machen (über eine Container-zu-Host-Zuordnung), da die Anwendung an Port8080
bindet.Im letzten Schritt
node server.js
wir den Dämon an, den Befehlsknotennode server.js
im Image auszuführen, indem Sie dennode server.js
npm start
ausführen. Wir verwenden dazu dieCMD
Direktive, 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_modules
und Protokollen in das Docker-Image kopiert wird. Die.dockerignore
Datei muss den folgenden Inhalt haben:node_modules npm-debug.log
Bauen 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 ps
auf 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 ps
Ausgabe vondocker ps
lautet das erhaltene Port-Mapping0.0.0.0:49160->8080/tcp
. Daher ordnete Docker den8080
Port im Container dem Port 49160 auf der Hostmaschine zu. Im Browser können wir jetztlocalhost:49160
eingebenlocalhost: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