So erstellen Sie eine Node.js-Anwendung mit Docker

Einführung

Über die Plattform Docker können Entwickler Anwendungen als container packen und ausführen. Ein Container ist ein isolierter Prozess, der auf einem gemeinsam genutzten Betriebssystem ausgeführt wird und eine leichtere Alternative zu virtuellen Maschinen darstellt. Obwohl Container nicht neu sind, bieten sie Vorteile - einschließlich Prozessisolierung und Standardisierung der Umgebung - die an Bedeutung gewinnen, da immer mehr Entwickler verteilte Anwendungsarchitekturen verwenden.

Beim Erstellen und Skalieren einer Anwendung mit Docker wird in der Regel ein Image für Ihre Anwendung erstellt, das Sie dann in einem Container ausführen können. Das Image enthält Ihren Anwendungscode, Bibliotheken, Konfigurationsdateien, Umgebungsvariablen und die Laufzeit. Durch die Verwendung eines Images wird sichergestellt, dass die Umgebung in Ihrem Container standardisiert ist und nur das enthält, was zum Erstellen und Ausführen Ihrer Anwendung erforderlich ist.

In diesem Lernprogramm erstellen Sie ein Anwendungsimage für eine statische Website, die das Framework Express und Bootstrap verwendet. Anschließend erstellen Sie einen Container mit diesem Image und senden ihn zur zukünftigen Verwendung an Docker Hub. Abschließend ziehen Sie das gespeicherte Image aus Ihrem Docker Hub-Repository und erstellen einen weiteren Container, um zu demonstrieren, wie Sie Ihre Anwendung neu erstellen und skalieren können.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

Schritt 1 - Installieren Ihrer Anwendungsabhängigkeiten

Um Ihr Image zu erstellen, müssen Sie zuerst Ihre Anwendungsdateien erstellen, die Sie dann in Ihren Container kopieren können. Diese Dateien enthalten den statischen Inhalt, den Code und die Abhängigkeiten Ihrer Anwendung.

Erstellen Sie zunächst ein Verzeichnis für Ihr Projekt im Ausgangsverzeichnis Ihres Nicht-Root-Benutzers. Wir werden unser ++ nennen, aber Sie können dies gerne durch etwas anderes ersetzen:

mkdir

Navigieren Sie zu diesem Verzeichnis:

cd

Dies ist das Stammverzeichnis des Projekts.

Erstellen Sie als Nächstes eine https://docs.npmjs.com/files/package.json [+ package.json +] -Datei mit den Abhängigkeiten Ihres Projekts und anderen identifizierenden Informationen. Öffne die Datei mit + nano + oder deinem Lieblingseditor:

nano package.json

Fügen Sie die folgenden Informationen zum Projekt hinzu, einschließlich Name, Autor, Lizenz, Eintrittspunkt und Abhängigkeiten. Achten Sie darauf, die Autoreninformationen durch Ihren eigenen Namen und Ihre Kontaktdaten zu ersetzen:

~ / node_project / package.json

{
 "name": "",
 "version": "1.0.0",
 "description": "nodejs image demo",
 "author": "",
 "license": "MIT",
 "main": "app.js",
 "keywords": [
   "nodejs",
   "bootstrap",
   "express"
 ],
 "dependencies": {
   "express": "^4.16.4"
 }
}

Diese Datei enthält den Projektnamen, den Autor und die Lizenz, unter der sie freigegeben wird. Npm recommends Machen Sie Ihren Projektnamen kurz und beschreibend, und vermeiden Sie doppelte Angaben in der Registrierung npm. Wir haben die MIT license im Lizenzfeld aufgeführt, um die kostenlose Verwendung und Verteilung des Anwendungscodes zu ermöglichen.

Zusätzlich wurde folgende Datei angegeben:

  • " main ": Der Eintrittspunkt für die Anwendung, + app.js. Sie werden diese Datei als nächstes erstellen.

  • "" Abhängigkeiten "": Die Projektabhängigkeiten - in diesem Fall Express 4.16.4 oder höher.

Obwohl diese Datei kein Repository auflistet, können Sie ein Repository hinzufügen, indem Sie diese Richtlinien unter https://docs.npmjs.com/files/package.json#repository befolgen und ein Repository zu Ihrer Datei + package.json + hinzufügen]. Dies ist eine gute Ergänzung, wenn Sie Ihre Anwendung versionieren.

Speichern und schließen Sie die Datei, wenn Sie alle Änderungen vorgenommen haben.

Führen Sie den folgenden Befehl aus, um die Abhängigkeiten Ihres Projekts zu installieren:

npm install

Dadurch werden die Pakete installiert, die Sie in Ihrer Datei "+ package.json +" in Ihrem Projektverzeichnis aufgeführt haben.

Nun können wir mit dem Erstellen der Anwendungsdateien fortfahren.

Schritt 2 - Erstellen der Anwendungsdateien

Wir werden eine Website erstellen, die Benutzern Informationen über Haie bietet. Unsere Anwendung verfügt über einen Haupteinstiegspunkt, "+ app.js ", und ein " views " - Verzeichnis, das die statischen Elemente des Projekts enthält. Die Landingpage " index.html" bietet den Benutzern einige vorläufige Informationen und einen Link zu einer Seite mit detaillierteren Hai-Informationen, "+ sharks.html". Im "+ views" -Verzeichnis erstellen wir sowohl die Landingpage als auch "+ sharks.html".

Öffnen Sie zunächst "+ app.js +" im Hauptprojektverzeichnis, um die Projektrouten zu definieren:

nano app.js

Der erste Teil der Datei erstellt die Express-Anwendung und Router-Objekte und definiert das Basisverzeichnis und den Port als Konstanten:

~ / node_project / app.js

const express = require('express');
const app = express();
const router = express.Router();

const path = __dirname + '/views/';
const port = 8080;

Die Funktion + require lädt das Modul` + express + , mit dem wir die Objekte + app` und + router erstellen. Das Objekt "+ router +" führt die Routing-Funktion der Anwendung aus, und wenn wir HTTP-Methodenrouten definieren, fügen wir sie diesem Objekt hinzu, um zu definieren, wie unsere Anwendung Anforderungen handhaben wird.

Dieser Abschnitt der Datei setzt auch ein paar Konstanten, + path und` + port`:

  • + path +: Definiert das Basisverzeichnis, welches das Unterverzeichnis + views + innerhalb des aktuellen Projektverzeichnisses ist.

  • + port +: Weist die App an, den Port + 8080 + abzuhören und zu binden.

Als nächstes legen Sie die Routen für die Anwendung mit dem Objekt + router + fest:

~ / node_project / app.js

...

router.use(function (req,res,next) {
 console.log('/' + req.method);
 next();
});

router.get('/', function(req,res){
 res.sendFile(path + 'index.html');
});

router.get('/sharks', function(req,res){
 res.sendFile(path + 'sharks.html');
});

Die Funktion "+ router.use " lädt eine https://expressjs.com/de/guide/writing-middleware.html[middleware function], die die Anforderungen des Routers aufzeichnet und an die Routen der Anwendung weiterleitet. Diese werden in den nachfolgenden Funktionen definiert, die festlegen, dass eine GET-Anforderung an die Basisprojekt-URL die Seite " index.html " zurückgeben soll, während eine GET-Anforderung an die Route " / sharks " " sharks.html +" zurückgeben soll .

Stellen Sie abschließend die Middleware "+ Router " und die statischen Ressourcen der Anwendung bereit und weisen Sie die App an, den Port " 8080 +" abzuhören:

~ / node_project / app.js

...

app.use(express.static(path));
app.use('/', router);

app.listen(port, function () {
 console.log('Example app listening on port 8080!')
})

Die fertige "+ app.js" -Datei sieht folgendermaßen aus:

~ / node_project / app.js

const express = require('express');
const app = express();
const router = express.Router();

const path = __dirname + '/views/';
const port = 8080;

router.use(function (req,res,next) {
 console.log('/' + req.method);
 next();
});

router.get('/', function(req,res){
 res.sendFile(path + 'index.html');
});

router.get('/sharks', function(req,res){
 res.sendFile(path + 'sharks.html');
});

app.use(express.static(path));
app.use('/', router);

app.listen(port, function () {
 console.log('Example app listening on port 8080!')
})

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Als Nächstes fügen wir der Anwendung statischen Inhalt hinzu. Beginnen Sie, indem Sie das Verzeichnis + views + erstellen:

mkdir views

Öffnen Sie die Zielseitendatei "+ index.html":

nano views/index.html

Fügen Sie der Datei den folgenden Code hinzu, der Boostrap importiert, und erstellen Sie eine jumbotron -Komponente mit einem Link zur detaillierteren Infoseite + sharks.html + :

~ / node_project / views / index.html

<!DOCTYPE html>
<html lang="en">

<head>
   <title>About Sharks</title>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
   <link href="css/styles.css" rel="stylesheet">
   <link href="https://fonts.googleapis.com/css?family=Merriweather:400,700" rel="stylesheet" type="text/css">
</head>

<body>
   <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md">
       <div class="container">
           <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span>
           </button> <a class="navbar-brand" href="#">Everything Sharks</a>
           <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
               <ul class="nav navbar-nav mr-auto">
                   <li class="active nav-item"><a href="/" class="nav-link">Home</a>
                   </li>
                   <li class="nav-item"><a href="/sharks" class="nav-link">Sharks</a>
                   </li>
               </ul>
           </div>
       </div>
   </nav>
   <div class="jumbotron">
       <div class="container">
           <h1>Want to Learn About Sharks?</h1>
           <p>Are you ready to learn about sharks?</p>
           <br>
           <p><a class="btn btn-primary btn-lg" href="/sharks" role="button">Get Shark Info</a>
           </p>
       </div>
   </div>
   <div class="container">
       <div class="row">
           <div class="col-lg-6">
               <h3>Not all sharks are alike</h3>
               <p>Though some are dangerous, sharks generally do not attack humans. Out of the 500 species known to researchers, only 30 have been known to attack humans.
               </p>
           </div>
           <div class="col-lg-6">
               <h3>Sharks are ancient</h3>
               <p>There is evidence to suggest that sharks lived up to 400 million years ago.
               </p>
           </div>
       </div>
   </div>
</body>

</html>

Über die navbar auf oberster Ebene können Benutzer zwischen den Seiten * Home * und * Sharks * wechseln. In der Unterkomponente "+ navbar-nav" verwenden wir die Bootstrap-Klasse "+ active", um dem Benutzer die aktuelle Seite anzuzeigen. Wir haben auch die Routen zu unseren statischen Seiten angegeben, die den Routen entsprechen, die wir in "+ app.js +" definiert haben:

~ / node_project / views / index.html

...
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
  <ul class="nav navbar-nav mr-auto">
     <li class="active nav-item"><a href="/" class="nav-link">Home</a>
     </li>
     <li class="nav-item"><a href="/sharks" class="nav-link">Sharks</a>
     </li>
  </ul>
</div>
...

Zusätzlich haben wir auf der Jumbotron-Schaltfläche einen Link zu unserer Hai-Informationsseite erstellt:

~ / node_project / views / index.html

...
<div class="jumbotron">
  <div class="container">
     <h1>Want to Learn About Sharks?</h1>
     <p>Are you ready to learn about sharks?</p>
     <br>
     <p><a class="btn btn-primary btn-lg" href="/sharks" role="button">Get Shark Info</a>
     </p>
  </div>
</div>
...

Es gibt auch einen Link zu einem benutzerdefinierten Stylesheet in der Kopfzeile:

~ / node_project / views / index.html

...
<link href="css/styles.css" rel="stylesheet">
...

Wir werden dieses Stylesheet am Ende dieses Schritts erstellen.

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Mit der Zielseite der Anwendung können wir unsere Hai-Informationsseite "+ sharks.html" erstellen, die interessierten Benutzern weitere Informationen zu Haien bietet.

Öffne die Datei:

nano views/sharks.html

Fügen Sie den folgenden Code hinzu, der Bootstrap und das benutzerdefinierte Stylesheet importiert und den Benutzern detaillierte Informationen zu bestimmten Haien bietet:

~ / node_project / views / sharks.html

<!DOCTYPE html>
<html lang="en">

<head>
   <title>About Sharks</title>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
   <link href="css/styles.css" rel="stylesheet">
   <link href="https://fonts.googleapis.com/css?family=Merriweather:400,700" rel="stylesheet" type="text/css">
</head>
<nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md">
   <div class="container">
       <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span>
       </button> <a class="navbar-brand" href="/">Everything Sharks</a>
       <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
           <ul class="nav navbar-nav mr-auto">
               <li class="nav-item"><a href="/" class="nav-link">Home</a>
               </li>
               <li class="active nav-item"><a href="/sharks" class="nav-link">Sharks</a>
               </li>
           </ul>
       </div>
   </div>
</nav>
<div class="jumbotron text-center">
   <h1>Shark Info</h1>
</div>
<div class="container">
   <div class="row">
       <div class="col-lg-6">
           <p>
               <div class="caption">Some sharks are known to be dangerous to humans, though many more are not. The sawshark, for example, is not considered a threat to humans.
               </div>
               <img src="https://assets.digitalocean.com/articles/docker_node_image/sawshark.jpg" alt="Sawshark">
           </p>
       </div>
       <div class="col-lg-6">
           <p>
               <div class="caption">Other sharks are known to be friendly and welcoming!</div>
               <img src="https://assets.digitalocean.com/articles/docker_node_image/sammy.png" alt="Sammy the Shark">
           </p>
       </div>
   </div>
</div>

</html>

Beachten Sie, dass wir in dieser Datei wieder die Klasse "+ active +" verwenden, um die aktuelle Seite anzugeben.

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Erstellen Sie schließlich das benutzerdefinierte CSS-Stylesheet, mit dem Sie in "+ index.html " und " sharks.html " verknüpft sind, indem Sie zunächst einen Ordner " css " im Verzeichnis " views +" erstellen:

mkdir views/css

Öffnen Sie das Stylesheet:

nano views/css/styles.css

Fügen Sie den folgenden Code hinzu, der die gewünschte Farbe und Schriftart für unsere Seiten festlegt:

~ / node_project / views / css / styles.css

.navbar {
   margin-bottom: 0;
}

body {
   background: #020A1B;
   color: #ffffff;
   font-family: 'Merriweather', sans-serif;
}

h1,
h2 {
   font-weight: bold;
}

p {
   font-size: 16px;
   color: #ffffff;
}

.jumbotron {
   background: #0048CD;
   color: white;
   text-align: center;
}

.jumbotron p {
   color: white;
   font-size: 26px;
}

.btn-primary {
   color: #fff;
   text-color: #000000;
   border-color: white;
   margin-bottom: 5px;
}

img,
video,
audio {
   margin-top: 20px;
   max-width: 80%;
}

div.caption: {
   float: left;
   clear: both;
}

Diese Datei legt nicht nur Schriftart und Farbe fest, sondern begrenzt auch die Größe der Bilder, indem sie ein "+ max-width +" von 80% angibt. Dadurch wird verhindert, dass sie mehr Platz einnehmen, als wir auf der Seite möchten.

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Mit den vorhandenen Anwendungsdateien und den installierten Projektabhängigkeiten können Sie die Anwendung starten.

Wenn Sie das Lernprogramm zur Ersteinrichtung des Servers in den Voraussetzungen befolgt haben, ist eine Firewall aktiv, die nur SSH-Datenverkehr zulässt. So lassen Sie zu, dass der Datenverkehr für den Port "+ 8080 +" ausgeführt wird:

sudo ufw allow 8080

Stellen Sie zum Starten der Anwendung sicher, dass Sie sich im Stammverzeichnis Ihres Projekts befinden:

cd ~/

Starten Sie die Anwendung mit + node app.js:

node app.js

Navigieren Sie mit Ihrem Browser zu "+ http: //: 8080 +". Sie sehen die folgende Zielseite:

Klicken Sie auf die Schaltfläche * Get Shark Info *. Sie sehen die folgende Informationsseite:

Sie haben jetzt eine Anwendung in Betrieb. Wenn Sie fertig sind, beenden Sie den Server, indem Sie "+ STRG + C +" eingeben. Jetzt können wir mit der Erstellung der Docker-Datei fortfahren, mit der wir diese Anwendung nach Wunsch neu erstellen und skalieren können.

Schritt 3 - Dockerfile schreiben

Ihre Docker-Datei gibt an, was bei der Ausführung in Ihrem Anwendungscontainer enthalten sein soll. Mithilfe einer Docker-Datei können Sie Ihre Container-Umgebung definieren und Unstimmigkeiten mit Abhängigkeiten oder Laufzeitversionen vermeiden.

Gemäß den https://www.digitalocean.com/community/tutorials/building-optimized-containers-for-kubernetes (den Richtlinien zum Erstellen optimierter Container) werden wir unser Image so effizient wie möglich gestalten, indem wir die Anzahl der Bildebenen und minimieren Beschränkung der Bildfunktion auf einen einzigen Zweck - die Neuerstellung unserer Anwendungsdateien und des statischen Inhalts.

Erstellen Sie im Stammverzeichnis Ihres Projekts die Docker-Datei:

nano Dockerfile

Docker-Bilder werden aus einer Folge von übereinander angeordneten Bildern erstellt. Im ersten Schritt fügen Sie das Basisimage für Ihre Anwendung hinzu, das den Ausgangspunkt für die Anwendungserstellung bildet.

Verwenden wir die https://hub.docker.com//node/ [+ node: + image], da dies zum Zeitpunkt des Schreibens die Empfohlene LTS-Version ist von Node.js. Das "+ alpine " - Bild stammt aus dem Projekt "https://alpinelinux.org/[Alpine Linux]" und hilft uns, die Bildgröße niedrig zu halten. Weitere Informationen darüber, ob das " alpine +" - Bild die richtige Wahl für Ihr Projekt ist oder nicht, finden Sie in der ausführlichen Diskussion im Abschnitt "* Image Variants *" unter https://hub.docker.com//node/ [ Docker Hub Node-Image-Seite].

Fügen Sie die folgende "+ FROM +" - Anweisung hinzu, um das Basis-Image der Anwendung festzulegen:

~ / node_project / Dockerfile

FROM node:

Dieses Bild enthält Node.js und npm. Jede Docker-Datei muss mit einem "+ FROM +" - Befehl beginnen.

Standardmäßig enthält das Docker-Knoten-Image einen Benutzer, der kein Root-Benutzer ist und den Sie verwenden können, um zu vermeiden, dass Ihr Anwendungscontainer als Root ausgeführt wird. Es wird empfohlen, die Ausführung von Containern als * root * zu vermeiden und Fähigkeiten innerhalb des Containers einschränken auf die erforderlichen Werte zu beschränken Führen Sie die Prozesse aus. Wir werden daher das Ausgangsverzeichnis des Benutzers * node * als Arbeitsverzeichnis für unsere Anwendung verwenden und sie als unseren Benutzer innerhalb des Containers festlegen. Weitere Informationen zu Best Practices beim Arbeiten mit dem Docker Node-Image finden Sie in diesem best practices guide.

Um die Berechtigungen für unseren Anwendungscode im Container zu optimieren, erstellen wir das Unterverzeichnis "+ node_modules " in " / home / node " zusammen mit dem Verzeichnis " app ". Durch das Erstellen dieser Verzeichnisse wird sichergestellt, dass sie über die von uns gewünschten Berechtigungen verfügen. Dies ist wichtig, wenn wir lokale Knotenmodule im Container mit " npm install +" erstellen. Zusätzlich zum Erstellen dieser Verzeichnisse legen wir die Eigentumsrechte für sie für unseren * node * -Benutzer fest:

~ / node_project / Dockerfile

...
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

Weitere Informationen zum Dienstprogramm für die Konsolidierung von "+ RUN +" - Anweisungen finden Sie unter discussion of how to Containerebenen verwalten.

Legen Sie als Nächstes das Arbeitsverzeichnis der Anwendung auf "+ / home / node / app" fest:

~ / node_project / Dockerfile

...
WORKDIR /home/node/app

Wenn ein "+ WORKDIR +" nicht festgelegt ist, erstellt Docker standardmäßig ein solches. Es empfiehlt sich daher, es explizit festzulegen.

Kopieren Sie als nächstes die Dateien + package.json und` + package-lock.json` (für npm 5+):

~ / node_project / Dockerfile

...
COPY package*.json ./

Wenn Sie diese Anweisung "+ COPY " hinzufügen, bevor Sie " npm install " ausführen, oder den Anwendungscode kopieren, können Sie den Caching-Mechanismus von Docker nutzen. In jeder Phase des Builds prüft Docker, ob eine Ebene für diese bestimmte Anweisung zwischengespeichert ist. Wenn Sie " package.json +" ändern, wird diese Ebene neu erstellt. Andernfalls kann Docker die vorhandene Image-Ebene verwenden und die Neuinstallation der Knotenmodule überspringen.

Um sicherzustellen, dass alle Anwendungsdateien dem Benutzer gehören, der nicht als Root angemeldet ist * node *, einschließlich des Inhalts des Verzeichnisses + node_modules +, wechseln Sie den Benutzer zu * node *, bevor Sie + npm install + ausführen:

~ / node_project / Dockerfile

...
USER node

Nachdem wir die Projektabhängigkeiten kopiert und unseren Benutzer gewechselt haben, können wir + npm install ausführen:

~ / node_project / Dockerfile

...
RUN npm install

Kopieren Sie anschließend Ihren Anwendungscode mit den entsprechenden Berechtigungen in das Anwendungsverzeichnis des Containers:

~ / node_project / Dockerfile

...
COPY --chown=node:node . .

Dadurch wird sichergestellt, dass die Anwendungsdateien dem Benutzer gehören, der kein Root-Benutzer ist.

Stellen Sie abschließend den Port "+ 8080 +" für den Container bereit und starten Sie die Anwendung:

~ / node_project / Dockerfile

...
EXPOSE 8080

CMD [ "node", "app.js" ]

+ EXPOSE + veröffentlicht nicht den Port, sondern dient als Dokumentationsmethode, welche Ports im Container zur Laufzeit veröffentlicht werden. + CMD + führt den Befehl zum Starten der Anwendung aus - in diesem Fall https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#cmd[`node app.js + `] . Beachten Sie, dass es in jeder Docker-Datei nur eine " CMD +" - Anweisung geben sollte. Wenn Sie mehr als eine angeben, wird nur die letzte wirksam.

Mit dem Dockerfile können Sie viele Dinge tun. Eine vollständige Liste der Anweisungen finden Sie in der Docker-Referenzdokumentation unter https://docs.docker.com/engine/reference/builder/[Dockerfile.

Das komplette Dockerfile sieht so aus:

~ / node_project / Dockerfile

FROM node:10-alpine

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

WORKDIR /home/node/app

COPY package*.json ./

USER node

RUN npm install

COPY --chown=node:node . .

EXPOSE 8080

CMD [ "node", "app.js" ]

Speichern und schließen Sie die Datei, wenn Sie mit der Bearbeitung fertig sind.

Fügen Sie vor dem Erstellen des Anwendungsimages eine https://docs.docker.com/engine/reference/builder/#dockerignore-file [+ .dockerignore + file] hinzu. Ähnlich wie bei einer https://git-scm.com/docs/gitignore [+ .gitignore + Datei] gibt + .dockerignore + an, welche Dateien und Verzeichnisse in Ihrem Projektverzeichnis nicht in Ihre kopiert werden sollen Container.

Öffnen Sie die Datei + .dockerignore +:

nano .dockerignore

Fügen Sie in der Datei Ihre lokalen Knotenmodule, NPM-Protokolle, Dockerfile und die Datei + .dockerignore + hinzu:

~ / node_project / .dockerignore

node_modules
npm-debug.log
Dockerfile
.dockerignore

Wenn Sie mit Git arbeiten, sollten Sie auch das Verzeichnis + .git + und die Datei + .gitignore + hinzufügen.

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Sie können jetzt das Anwendungsimage mit dem Befehl +docker build + ` erstellen. Wenn Sie das `+ -t +