Docker
Exécution de l'application Simple Node.js
Recherche…
Exécution d'une application Basic Node.js dans un conteneur
L'exemple que je vais aborder suppose que vous avez une installation Docker qui fonctionne dans votre système et une compréhension de base de la façon de travailler avec Node.js. Si vous savez comment travailler avec Docker, il est évident que le framework Node.js ne doit pas nécessairement être installé sur votre système. Nous utiliserons plutôt la latest
version de l’image de node
disponible auprès de Docker. Par conséquent, si nécessaire, vous pouvez télécharger l'image au préalable avec le docker pull node
commande docker pull node
. (La commande pulls
automatiquement la dernière version de l'image de node
depuis le menu fixe.)
Procédez à la création d’un répertoire où tous vos fichiers d’application de travail résideraient. Créez un fichier
package.json
dans ce répertoire qui décrit votre application ainsi que les dépendances. Votre fichierpackage.json
devrait ressembler à ceci:{ "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" } }
Si nous devons travailler avec Node.js, nous créons généralement un fichier de
server
qui définit une application Web. Dans ce cas, nous utilisons le frameworkExpress.js
(version4.13.3
). Un fichierserver.js
base ressemblerait à ceci: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);
Pour ceux qui connaissent Docker, vous auriez rencontré un
Dockerfile
. UnDockerfile
est un fichier texte contenant toutes les commandes requises pour créer une image personnalisée adaptée à votre application.
Créez un fichier texte vide nommé Dockerfile
dans le répertoire en cours. La méthode pour en créer un est simple dans Windows. Sous Linux, vous souhaiterez peut-être exécuter touch Dockerfile
dans le répertoire contenant tous les fichiers requis pour votre application. Ouvrez le fichier Dockerfile avec n'importe quel éditeur de texte et ajoutez les lignes suivantes:
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
indique au démon Docker quelle image nous voulons générer. Dans ce cas, nous utilisons lalatest
version dunode
image Docker officiel disponible sur le Docker Hub .Dans cette image, nous procédons à la création d'un répertoire de travail contenant tous les fichiers requis et nous demandons au démon de définir ce répertoire comme répertoire de travail souhaité pour notre application. Pour cela nous ajoutons
RUN mkdir -p /usr/src/my_first_app WORKDIR /usr/src/my_first_app
Nous procédons ensuite à l'installation des dépendances de l'application en déplaçant d'abord le fichier
package.json
(qui spécifie les informations d'application, y compris les dépendances) dans le/usr/src/my_first_app
de l'image. Nous faisons cela parCOPY package.json /usr/src/my_first_app/ RUN npm install
Nous tapez ensuite
COPY . /usr/src/my_first_app
pour ajouter tous les fichiers d'application et le code source au répertoire de travail de l'image.Nous utilisons ensuite la directive
EXPOSE
pour demander au démon de rendre visible le port8080
du conteneur résultant (via un mappage de conteneur à hôte) puisque l'application est liée au port8080
.Au cours de la dernière étape, nous demandons au démon d'exécuter la commande
node server.js
dans l'image en exécutant la commande de basenpm start
. Nous utilisons la directiveCMD
pour cela, qui prend les commandes comme arguments.CMD [ "npm", "start" ]
Nous créons ensuite un fichier
.dockerignore
dans le même répertoire que leDockerfile
pour empêcher que notre copie denode_modules
et de journaux utilisés par notre installation système Node.js ne soit copiée sur l'image Docker. Le fichier.dockerignore
doit avoir le contenu suivant:node_modules npm-debug.log
Construisez votre image
Naviguez jusqu'au répertoire contenant le Dockerfile
et exécutez la commande suivante pour créer l'image Docker. L' -t
vous permet de baliser votre image pour la retrouver plus facilement à l'aide de la commande docker images:
$ docker build -t <your username>/node-web-app .
Votre image sera maintenant répertoriée par Docker. Visualisez les images en utilisant la commande ci-dessous:
$ docker images
REPOSITORY TAG ID CREATED
node latest 539c0211cd76 10 minutes ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago
Lancer l'image
Nous pouvons maintenant exécuter l'image que nous venons de créer en utilisant le contenu de l'application, l'image de base du node
et le Dockerfile
. Nous allons maintenant exécuter notre image nouvellement créée <your username>/node-web-app
. Fournir l'option -d
à la commande docker run
exécute le conteneur en mode détaché, de sorte que le conteneur s'exécute en arrière-plan. L' -p
redirige un port public vers un port privé à l'intérieur du conteneur. Exécutez l'image que vous avez précédemment créée à l'aide de cette commande:
$ docker run -p 49160:8080 -d <your username>/node-web-app
Imprimez la sortie de votre application en exécutant
docker ps
sur votre terminal. La sortie devrait ressembler à ceci.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
Obtenez la sortie de l'application en saisissant les docker logs <CONTAINER ID>
. Dans ce cas, il s'agit des docker logs 7b701693b294
.
Sortie: en Running on http://localhost:8080
- À partir de la sortie du
docker ps
, le mappage de port obtenu est0.0.0.0:49160->8080/tcp
. Docker a donc mappé le port8080
intérieur du conteneur sur le port 49160 de la machine hôte. Dans le navigateur, nous pouvons maintenant entrerlocalhost:49160
.
Nous pouvons également appeler notre application en utilisant curl
:
$ 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