Guide et instructions

1. Objectifs

Se familiariser avec les bases de docker:

  • Image
  • Dockerfile
  • Volume
  • Network
  • Docker-compose

2. Introduction

Dans tous les ateliers il faut utiliser l’utilisateur « ubuntu » et se positionner dans /home/ubuntu

su ubuntu
cd /home/ubuntu

Créez un dossier « lab01 » qui sera notre répertoire de travail pour la suite de cet atelier.

mkdir lab01 ; cd lab01

3. Construire et utiliser une image Docker

3.1 Présentation de l’application

On va utiliser une application web qui compte les requêtes http et renvois le résultat. C’est une application NodeJS qui utilise le framework Express et la base de données Redis. Cette application est construite à partir des fichiers suivants:

  • Le fichier app.js
'use strict';

const bluebird = require('bluebird'),
      express = require('express'),
      app = express(),
      redis = require("redis"),
      client = redis.createClient({host: "redis"}),
      PORT = 8080;

bluebird.promisifyAll(redis.RedisClient.prototype);

app.get('/', (req, res) => {
  client.incrAsync('hits').then((result) => {
    res.send('Hello everyone! I have processed ' + result + ' requests.\n');
  })
});

app.listen(PORT);
console.log('Running on http://localhost:' + PORT);
  • Le fichier package.json
{
  "name": "compose-workshop",
  "version": "1.0.0",
  "description": "NodeJS App",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/Inist-CNRS/compose-workshop.git"
  },
  "keywords": [
    "docker",
    "compose",
    "nodejs"
  ],
  "author": "Claude Niederlender <claude.niederlender@gmail.com>",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/Inist-CNRS/compose-workshop/issues"
  },
  "homepage": "https://github.com/Inist-CNRS/compose-workshop#readme",
  "dependencies": {
    "bluebird": "^3.4.0",
    "express": "^4.13.4",
    "redis": "^2.5.3"
  }
}

3.2 Manipulation

Créez un dossier app01 ensuite créez les deux fichiers « app.js » et « package.json » de l’application dans ce dossier.

mkdir app01 ; cd app01

Lancez un container redis à partir de l’image redis:latest.

docker run -d --name redis redis

Créez un réseau bridge network nommé « mon-net »

docker network create mon-net

Connectez le container « redis » sur ce réseau

docker network connect mon-net redis

Construisez une image pour l’application NodeJS, avec un Dockerfile.

Créez un fichier sans extension nommé « Dockerfile » dans notre dossier puis ajouter les instructions suivantes :

FROM node:14.15.0-alpine

LABEL maintainer="UIC Training <training@useitcloud.fr>"

# Create the directory /usr/src/my-app
RUN ...
# Change the current directory to /usr/src/my-app
WORKDIR ...
# Copy the file app.js to the current directory
COPY ...
# Copy the file package.json to to the current directory
COPY ...
# Execute the command: npm install
RUN ...

EXPOSE 8080

CMD ["node", "app.js"]

Nous pouvons construire notre image en utilisant la commande suivante:

docker build -t mesapps/app01 .

Une fois cette exécution terminée, vérifiez si l’image a bien été créée avec cette commande:

docker images

Nous allons lancer un conteneur à base de cette image avec la commande suivante:

docker run -d --name app01 --network mon-net -p 8080:8080 mesapps/app01

Pour vérifier le bon fonctionnement de ce déploiement connectez-vous à l’adresse suivante:

http://[LABENVIRONMENTIP]:8080

Le résultat est illustré par cette image. résultat

Listez les containers avec la commande doker ps

Pour accéder au conteneur de l’application app01, utilisez la commande suivante:

docker container exec -it app01 /bin/sh

Nettoyez les ressources avec les commandes suivantes:

docker rm -vf redis
docker rm -vf app01
docker network rm mon-net

3.3 Challenge

Pour ce défi on va redéployer l’application NodeJS en utilisant un fichier docker-compose.yml. Il faut suivre les étapes suivantes:

  • Création du fichier docker-compose.yml
version: '3'
services:
  web:
    ###
    # Insert here instructions for the web NodeJS application
    ###
  redis:
    ###
    # Insert here instructions for redis
    ###
  • Lancez l’application
docker compose up -d
  • Testez l’application via http://[LABENVIRONMENTIP]:8080
  • Nettoyage
docker compose stop
docker compose rm

4. Déploiement d’une application multi-container

Dans cette partie vous allez déployer un site web wordpress basé sur 3 services qui sont:

Pour la persistance des données de la base (/var/lib/mysql) utilisez un volume. Cherchez les images avec « docker search »

docker search wordpress

Consultez les images sur dockerhub afin de compléter le fichier « docker-compose.yml » suivant:

version: '3'
services:
  db:
    image: mariadb:10
    volumes:
      ##
      # Ajoutez un volume pour MariaDB data (répertoire /var/lib/mysql)
      ##
    restart: always
    environment:
      ##
      # Ajoutez les variables d'environnement pour accés à la base MariaDB 
      ##
  dbadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - "8080:80"
    environment:
      ##
      # Ajoutez les variables d'environnement pour MariaDB+PHPMyAdmin
      ##
    depends_on:
      ##
      # Ajouter les dépendances
      ##

  wordpress:
    image: wordpress:latest
    depends_on:
      ##
      # Ajouter les dépendances
      ##
    ports:
      - "8000:80"
    restart: always
    environment:
      ##
      # Ajoutez les variables d'environnement pour accés à la base MariaDB
      ##

Lancez l’application avec la commande suivante:

docker compose up -d

Vérifiez que le déploiement est réussi en se connectant à l’adresse suivante : http://[LABENVIRONMENTIP]:8081

Configurez votre cms wordpress Procédez au nettoyage du déploiement avec les commandes suivantes:

docker compose stop
docker compose rm

Relancez à nouveau le déploiement

docker compose up -d

Vérifiez que le déploiement est réussi en se connectant à l’adresse suivante : http://[LABENVIRONMENTIP]:8081 Qu’est-ce que vous constatez ? Nettoyage

docker compose stop
docker compose rm