La conteneurisation consiste à regrouper une application, ses dépendances et bibliothèques ensemble afin qu’elles puissent être utilisées de manière plug-and-play sur n’importe quel type d’infrastructure. Chaque regroupement est appelé un conteneur.
Pourquoi conteneuriser un service Node.js?
Comme discuté dans la dernière section, conteneuriser un service Node.js signifierait regrouper l’application, ses dépendances, bibliothèques et même sa configuration dans un conteneur unique. La conteneurisation offre les avantages suivants:
- Portable. Étant donné que nous avons regroupé toutes les exigences de l’application dans un conteneur, les mêmes images peuvent être installées en développement, en staging et en production.
- Rapide et léger. Les conteneurs ont tendance à être beaucoup plus rapides que les machines virtuelles (VM) ou le matériel nu car ils exécutent uniquement les exigences de l’application, tandis qu’historiquement, les VM ou le matériel nu démarreraient toute la machine et toutes les applications.
- Évolutif. Avec les deux avantages ci-dessus, la scalabilité devient très facile car les conteneurs sont rapides, efficaces et faciles à déployer.
Dans cet article, nous allons nous concentrer spécifiquement sur containeriser une application Node.js.
Prérequis
Outils et Logiciels
Docker (Moteur Docker et Docker CLI)
Nous aurons besoin de installer Docker pour gérer nos conteneurs. Le Moteur Docker gère le temps d’exécution, et le CLI peut être utilisé pour interagir via la ligne de commande.
Node.js et npm/yarn Installés (Pour le Développement/Testing Initial)
Nous aurons besoin de Node.js et npm installés pour installer les dépendances des bibliothèques et exécuter le service.
Kubernetes ou Docker Compose pour Gérer Plusieurs Conteneurs (Optionnel)
Nous aurons besoin de Kubernetes ou Docker Compose pour gérer plusieurs conteneurs.
Fondamentaux
Structure de l’application Node.js :
- Il est attendu que le lecteur comprenne déjà le rôle du fichier principal (
app.js
ouindex.js
) dans le projet, ainsi que le rôle d’autres fichiers commepackage.json
etyarn.lock
. - Cet article ne plongera pas non plus dans d’autres aspects du projet, comme les contrôleurs, les middleware et les routes.
Commandes de base Docker et syntaxe du Dockerfile
Commandes Docker :
docker ps -> Lists all the containers running on the system
docker pull -> Pulls any image from the docker hub or official registry of Docker
docker build -> Creates an image from the docker file
docker run -> Starts a container from an exiting image
docker stop -> Stops a container if it has crashed or if you want to switch the container
Instructions de base du Dockerfile :
FROM -> Every DockerFile
WORKDIR -> Set the working directory inside the container
COPY (or ADD) -> Transfers the application's files to the image
RUN -> Executes commands during build time
CMD -> Sets the default command to be run when the container is started from the image
EXPOSE -> Specifies the port the container listens on
ENV -> Sets environment variables used during build and runtime
Les tables couvertes et la structure Node.js sont suffisantes pour commencer la conteneurisation et déployer votre service Node.js.
Mise en place du service Node.js
Configuration de l’environnement Node.js est un processus simple. Assurez-vous d’avoir Node.js installé sur votre machine. Si vous avez des doutes, veuillez consulter l’appendice (1). Une fois installé, ouvrez votre terminal et vérifiez l’installation en tapant.
node -v
npm -v
Créez un répertoire de projet et initialisez votre projet comme suit:
npm init -y
Installez le module express
npm install express
Créez un fichier serveur, appelons-le server.mjs, où nous pouvons ajouter la route et la logique correspondant à la route. Puisque cet article traite principalement de la conteneurisation, nous maintiendrons la logique de l’endpoint très simple. Quelque chose comme ceci:
import express from "express";
const app = express();
const port = 8080;
app.get('/', (req, res) => {
res.send('Welcome to my demo service!');
});
app.listen(port, () => {
console.log(`Demo Service is running on port ${port}`);
});
Maintenant votre service est prêt à être démarré, naviguez vers le répertoire du projet dans le terminal et exécutez cette commande :
node server.mjs
Le service est en cours d’exécution; si nous visitons http://localhost:3000, nous verrons :
« Bienvenue sur mon serveur »
Création du Dockerfile
Révisons ce qu’est un Dockerfile, il contient les instructions pour construire l’image Docker. Créons un Dockerfile dans le répertoire racine. Pendant cette étape, comme nous l’avons discuté dans les instructions du Dockerfile, nous devons effectuer les actions suivantes :
FROM node:18-alpine => Indicate the base image to use. Here we're using the official Nodejs 14 image.
WORKDIR /usr/src/app => Sets the working directory in the container.
COPY package*.json ./ => Duplicate the package.json and package-lock.json files to the working directory.
RUN npm install => Installs the app package dependencies.
COPY . . => Copies the remaining of the app to the working directory.
EXPOSE 8080 => Exposes the port our app is listening on.
CMD ["node", "app.js"] => Defines the command to start your Node.js application.
Construction et exécution de l’image Docker
Depuis la racine du terminal, naviguez vers votre projet et exécutez la commande suivante :
docker build -t image-name .
Où nom-de-l'image
est le nom de l’image Docker. Le .
à la fin définit le contexte sur le répertoire actuel.
Une fois l’image construite, nous allons créer le conteneur et exécuter l’application Node.js à l’aide de la commande suivante :
docker run --name container-name -p 8080:8080 image-name
Une fois que ce qui précède est réussi, vous pouvez vérifier que le service est en cours d’exécution en exécutant docker ps
, puis en accédant à la même URL localhost qu’auparavant.
Pousser des images vers un registre
Maintenant que votre image est prête, il est temps de la pousser vers un registre. Pour les besoins de cet article, essayons de la pousser uniquement vers Docker Hub. Docker Hub est un service basé sur le cloud pour stocker, partager et gérer les images de conteneurs Docker.
Créez un compte sur https://hub.docker.com/ et connectez-vous avec votre compte.
docker login
Une fois connecté, les images construites localement peuvent être ajoutées comme suit :
docker tag image-name:tag dockerhub-username/repository-name:tag
Où :
tag
est soitlatest
soit un numéro de version.nom-du-dépôt
est le nom du dépôt souhaité.
Ensuite, poussez l’image comme suit :
docker push dockerhub-username/repository-name:tag
Conclusion
Comme nous pouvons le voir, la conteneurisation rend les flux de travail et les services complexes rapides, portables et évolutifs en séparant les dépendances. Une fois mis en œuvre, toute l’équipe en bénéficie.Je vous encourage à explorer les fonctionnalités avancées comme les constructions multi-étapes et le réseau de conteneurs. Envisagez également d’apprendre à utiliser des outils d’orchestration (par exemple, Kubernetes) et d’intégrer des pipelines CI/CD pour optimiser votre flux de développement.
Annexe
Source:
https://dzone.com/articles/containerization-of-a-nodejs-service