Skip to main content

app-nodejs

  1. Comment construire une application Node.js avec Docker

La plate-forme Docker permet aux développeurs de paquetr et d'exécuter des applications en tant que conteneurs. Un conteneur est un processus isolé qui s'exécute sur un système d'exploitation partagé, offrant une alternative plus légère au poids des machines virtuelles.

Conditions préalables

  • Un serveur exécutant Ubuntu, ainsi qu'un utilisateur non racine avec sudodes privilèges et un pare-feu actif.
  • Docker installé sur votre serveur
  • Docker sur Ubuntu » 22.04/20.04 ou debian
  • Node.js et npm installés, en suivant ces instructions sur l'installation avec le PPA géré par NodeSource sur Ubuntu 22.04/20.04 / 18.04.
  • Un compte Docker Hub.

Étapes pour construire l'application NodeJS avec Docker

  • Dépendances d'installation de la demande
  • Créer des fichiers d'application NodeJS
  • Dockerfile
  • Créer le dépôt d'images DockerHub

Étape 1 - Installation de vos dépendances à l'application

Pour créer votre image, vous devrez d'abord faire vos fichiers de candidature, que vous pourrez ensuite copier dans votre conteneur. Ces fichiers incluront le contenu statique, le code et les dépendances de votre application.

  1. Création d'un dossier projet
sudo mkdir project_app
  1. Naviguez jusqu'à ce répertoire:
cd project_app
  1. Init package.json
sudo nano package.json
  1. Ajouter les dépendances pour le node_modules
{
"name": "nodejs-image-demo",
"version": "1.0.0",
"description": "nodejs image demo",
"author": "Author description",
"license": "MIT",
"main": "app.js",
"keywords": [
"nodejs",
"bootstrap",
"express"
],
"dependencies": {
"express": "^4.16.4"
}
}

Pour installer les dépendances de votre projet, exécutez la commande suivante:

Cela permettra d'installer les paquets que vous avez listés dans votre package.jsonfichier dans votre répertoire de projet.

npm install

Pare-feu activation

Si vous suivez le tutoriel de configuration initial du serveur dans les conditions préalables, vous aurez un pare-feu actif permettant uniquement le trafic SSH. Permettre le trafic au port 8080 course:

sudo ufw allow 8080

Étape 3 - Écrire le Dockerfile

Votre fichier Docker spécifie ce qui sera inclus dans votre conteneur d'application lorsqu'il sera exécuté. L'utilisation d'un Dockerfile vous permet de définir votre environnement de conteneur et d'éviter les divergences avec les dépendances ou les versions d'exécution.

Conformément à ces directives sur la construction de conteneurs optimisés, nous rendrons notre image aussi efficace que possible en minimisant le nombre de couches d'images et en limitant la fonction de l'image à un seul objectif, recréant nos fichiers d'application et notre contenu statique.

Dans le répertoire racine de votre projet,

créez le Dockerfile:

sudo nano Dockerfile

Les images Docker sont créées à l'aide d'une succession d'images stratifiées qui s'appuient les unes sur les autres. Notre première étape consistera à ajouter l'image de de notre application qui constituera le point de départ de la construction de l'application.

Utilisons le node:10-alpineimage, puisqu'au moment de la rédaction du présent document, il s'agit de la version LTS recommandée de Node.js. Le alpineL'image est dérivée du projet Alpine Linux, et nous aidera à garder notre taille d'image à un niveau bas.


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" ]

Detaillons le Dockerfile

  • FROM instruction de définir l'image de base de l'application:

  • RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app La création de ces répertoires garantira qu'ils ont les permissions que nous voulons, ce qui sera important lorsque nous créerons des modules de nœuds locaux dans le conteneur avec npm install. En plus de créer ces répertoires, nous mettrons leur possédance à notre utilisateur de nœuds:

  • WORKDIR /home/node/app: définir le répertoire de travail de l'application à /home/node/app Si WORKDIR n'est pas réglé, Docker en créera un par défaut, c'est donc une bonne idée de le définir explicitement.

  • COPY package*.json ./ Ensuite, copiez le package.jsonet package-lock.json(pour le 5ème) fichiers:

  • CMD exécuter la commande pour démarrer l'application - dans ce cas, node app.js

.dockerignore

Avant de construire l'image de l'application, ajoutons un .dockerignore Fichier. Travailler de la même manière qu'une .gitignoreDossier, .dockerignoreprécise quels fichiers et répertoires dans votre répertoire de projet ne doivent pas être copiés sur votre conteneur.

sudo nano .dockerignore

collez ce code

node_modules
npm-debug.log
Dockerfile
.dockerignore

lancer l'image de votre application

Vous êtes maintenant prêt à construire l'image de l'application en utilisant le docker build commandement. En utilisant le flag -t avec docker build vous permettra d'étiqueter l'image avec un nom mémorable.

Parce que nous allons pousser l'image à Docker Hub, incluons notre nom d'utilisateur Docker Hub dans l'étiquette. Nous allons marquer l'image comme nodejs-image-demo, mais n'hésitez pas à le remplacer par un nom de votre choix. N'oubliez pas de remplacer également your_dockerhub_username avec votre propre nom d'utilisateur Docker Hub:

sudo docker build -t your_dockerhub_username/nodejs-image-demo .
sudo docker images

Il est maintenant possible de créer un conteneur avec cette image en utilisant docker run. Nous incluons trois drapeaux avec cette commande:

  1. -p: Ceci publie le port sur le conteneur et le cartographie vers un port sur notre hôte. Nous utiliserons le port 80 sur l'hôte, mais vous devriez vous sentir libre de le modifier si nécessaire si vous avez un autre processus en cours sur ce port. Pour plus d'informations sur le fonctionnement de ce processus, passez à l'examen de cette discussion dans les documents Docker sur la liaison portuaire.
  2. -d: Cela fait fonctionner le conteneur en arrière-plan.
  3. --name: Cela nous permet de donner au conteneur un nom mémorable.

Exécuter la commande suivante pour construire le conteneur:

sudo docker run --name nodejs-image-demo -p 80:8080 -d your_dockerhub_username/nodejs-image-demo

Une fois votre conteneur en cours d'exécution, vous pouvez inspecter une liste de vos conteneurs en fonctionnement avec docker ps:

sudo docker ps -a 

Avec votre conteneur en cours d'exécution, vous pouvez maintenant visiter votre application en naviguant sur votre navigateur IP sans le port:

http://your_server_ip

Maintenant que vous avez créé une image pour votre application, vous pouvez la pousser vers Docker Hub pour une utilisation future.

Utilisation d'un dépôt pour travailler avec des images

En poussant votre image d'application vers un registre comme Docker Hub, vous la rendez disponible pour une utilisation ultérieure lorsque vous construisez et échelonnez vos conteneurs. Nous allons démontrer comment cela fonctionne en poussant l'image de l'application vers un dépôt, puis en utilisant l'image pour recréer notre conteneur.

sudo docker login -u userdocker -p password
  1. push image docker application
sudo docker push your_dockerhub_username/nodejs-image-demo

Testons l'utilité du registre d'images en détruisant notre conteneur d'application et notre image actuelle et en les reconstruisant avec l'image dans notre dépôt.

sudo docker ps

En utilisant le CONTAINER IDlisté dans votre sortie, arrêter le conteneur d'application en cours d'exécution. Assurez-vous de remplacer l'ID en surbrillance ci-dessous par le vôtre CONTAINER ID:

sudo docker stop CONTAINER_ID

Énumérez toutes vos images avec le flag -a:

docker images -a

Retirez le conteneur arrêté et toutes les images, y compris les images non utilisées ou en suspension, avec la commande suivante:

docker system prune -a

Avec toutes vos images et conteneurs supprimés, vous pouvez maintenant tirer l'image de l'application de Docker Hub:

docker pull your_dockerhub_username/nodejs-image-demo
docker images

Vous pouvez maintenant reconstruire votre conteneur en utilisant la commande:

docker run --name nodejs-image-demo -p 80:8080 -d your_dockerhub_username/nodejs-image-demo

Visite http://your_server_ipune fois de plus, voir votre application en cours d'exécution.