Création d’une Image Docker : Un Cas Concret

Prenons l’exemple d’une application web simple en Node.js. Nous allons créer une image Docker pour cette application afin de l’exécuter dans un conteneur. L’objectif est d’empaqueter cette application, avec toutes ses dépendances, dans une image Docker que nous pourrons exécuter sur n’importe quel système.

L’application Node.js

Supposons que notre application est un serveur Node.js qui affiche “Hello, Docker!” sur le port 3000. Voici la structure de l’application :

    • app.js
    • package.json

app.js :

const express = require('express');
const app = express();
 
app.get('/', (req, res) => {
  res.send('Hello, Docker!');
});
 
app.listen(3000, () => {
  console.log('App is running on port 3000');
});

package.json :

{
  "name": "docker-node-app",
  "version": "1.0.0",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^4.17.1"
  }
}

Écriture du Dockerfile

Pour créer une image Docker, nous devons écrire un Dockerfile. Ce fichier contient toutes les instructions nécessaires pour empaqueter notre application et ses dépendances.

Voici un exemple de Dockerfile pour notre application Node.js :

# Étape 1 : Utiliser une image de base
FROM node:14-alpine

# Étape 2 : Définir le répertoire de travail dans le conteneur
WORKDIR /app

# Étape 3 : Copier le fichier package.json et installer les dépendances
COPY package.json ./
RUN npm install

# Étape 4 : Copier le reste du code source
COPY . .

# Étape 5 : Exposer le port sur lequel l'application va tourner
EXPOSE 3000

# Étape 6 : Commande pour démarrer l'application
CMD ["npm", "start"]

Explication du Dockerfile :

  1. FROM node:14-alpine : Nous utilisons une image de base légère avec Node.js préinstallé (version 14 basée sur Alpine Linux, qui est minimaliste).
  2. WORKDIR /app : Nous définissons /app comme répertoire de travail dans le conteneur, où toutes les commandes suivantes seront exécutées.
  3. COPY package.json ./ : Nous copions d’abord le fichier package.json pour installer les dépendances.
  4. RUN npm install : Cette commande installe les dépendances de notre application.
  5. COPY . . : Nous copions tous les fichiers de l’application dans le répertoire /app du conteneur.
  6. EXPOSE 3000 : Nous exposons le port 3000 pour permettre l’accès au serveur web.
  7. CMD [“npm”, “start”] : Cette commande lance l’application Node.js lorsqu’on démarre le conteneur.

Construction de l’image Docker

Une fois le Dockerfile prêt, nous pouvons créer l’image Docker en utilisant la commande docker build. Assurez-vous de vous placer dans le répertoire contenant votre Dockerfile, puis exécutez :

docker build -t my-node-app .

Cette commande :

  • -t my-node-app : Tag l’image avec le nom my-node-app.
  • . : Spécifie que le Dockerfile et le contexte de build sont dans le répertoire courant.

Docker lira le Dockerfile, exécutera les instructions pas à pas, et créera une image contenant l’application Node.js.

Exécution de l’image Docker

Une fois l’image construite, nous pouvons exécuter un conteneur basé sur cette image avec la commande suivante :

docker run -d -p 3000:3000 my-node-app

Cette commande :

  • -d : Lance le conteneur en mode détaché (en arrière-plan).
  • -p 3000:3000 : Mappe le port 3000 du conteneur au port 3000 de l’hôte.
  • my-node-app : Utilise l’image que nous venons de créer.

Une fois le conteneur lancé, vous pouvez ouvrir votre navigateur et accéder à http://localhost:3000 pour voir votre application afficher “Hello, Docker!”.

Résumé

Ce cas concret montre comment nous pouvons utiliser un Dockerfile pour automatiser la création d’une image Docker contenant une application Node.js. À partir de ce fichier, Docker package l’application et ses dépendances dans une image, qui peut ensuite être exécutée dans un conteneur sur n’importe quelle machine où Docker est installé.