Skip to main content

Lab 4 - Docker Compose


Première partie

  1. Sur votre VM Linux, créez-vous un répertoire “DockerCompose” sur une VM Linux et créez-vous un fichier docker-compose.yaml à la racine de ce répertoire.

  2. Créer les répertoires nginx, backend et créé les fichiers suivants :

nginx/default.conf

server {
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://app:3000;

        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

backend/package.json

{
  "name": "cegep-node-app",
  "version": "1.0.0",
  "description": "Application Node.js de démonstration",
  "main": "server.js",
  "scripts": {
    "dev": "node server.js"
  },
  "dependencies": {
    "mysql2": "^3.9.0"
  }
}

backend/server.js

const http = require('http');
const mysql = require('mysql2/promise');

// Configuration de la connexion avec les variables du docker-compose
const dbConfig = {
  host: process.env.DB_HOST || 'db',
  user: process.env.DB_USER || 'userMysql',
  password: process.env.DB_PASS || 'password_Mysql',
  database: process.env.DB_NAME || 'database_Name'
};

async function initDB() {
  try {
    const connection = await mysql.createConnection(dbConfig);
    // Création d'une table simple si elle n'existe pas
    await connection.query(`
      CREATE TABLE IF NOT EXISTS visites (
        id INT AUTO_INCREMENT PRIMARY KEY,
        date_visite DATETIME DEFAULT CURRENT_TIMESTAMP
      )
    `);
    await connection.end();
    console.log('Base de données initialisée avec succès.');
  } catch (err) {
    console.error('Erreur lors de l\'initialisation de la DB:', err.message);
  }
}

// Initialiser la DB au démarrage
initDB();

const server = http.createServer(async (req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });

  try {
    const connection = await mysql.createConnection(dbConfig);
    
    // 1. Insérer une nouvelle visite
    await connection.query('INSERT INTO visites () VALUES ()');
    
    // 2. Compter le nombre total de visites
    const [rows] = await connection.query('SELECT COUNT(*) AS total FROM visites');
    const totalVisites = rows[0].total;

    await connection.end();

    // Réponse HTML montrant le flux : Navigateur -> Nginx -> Node.js -> MySQL
    res.end(`
      <h1>Démonstration Architecture 3-Tiers</h1>
      <p><b>Nginx</b> a reçu la requête et l'a transmise à <b>Node.js</b>.</p>
      <p><b>Node.js</b> vient d'enregistrer la visite dans <b>MySQL</b> !</p>
      <h2>Nombre total de visites enregistrées en base : ${totalVisites}</h2>
    `);
  } catch (err) {
    res.end(`<h1>Erreur de connexion à MySQL</h1><p>${err.message}</p>`);
  }
});

// Écoute sur 0.0.0.0
server.listen(3000, '0.0.0.0', () => {
  console.log('Serveur Node.js démarré sur le port 3000');
});

  1. Lire l’exemple et tous les commentaires du Docker compose qui se trouve sur la page sur le Docker Compose


  2. Copier le contenu dans le fichier “docker-compose.yaml” et exécutez le Docker Compose


  3. Tester le site http://localhost/


  4. Tester les commandes des points 2 à 6 commandes (cli)


  5. Dans votre journal, copier les résultats des retours des commandes (cli)


Deuxième partie

On joue à Tetris ;-) https://github.com/DanCegep/tp-docker-tetris

Téléchargez et analysez ce projet et roulez-le.