DevOps – App – Multi-services

11 février 2021

Et pourquoi pas un défi de taille

Contenu – (DevOps – App – Multi-services)

Pré-requis


1 – Les variables d’environnement

Mise en situation

Lors de l’assemblage d’une application multi-conteneurs (appelé aussi MICRO-SERVICES), il SERA peut-être nécessaire de fournir, à un conteneur, des paramètres fonctionnels d’un autre conteneur : 🙃.

🤖 Quel est cet autre conteneur? 🤖

Prenons une application constituée d’un conteneur, pour une base de données de type ‘MySQL‘ et, un autre conteneur pour l’application Web de gestion du SGBD MySQL, ‘phpmyadmin‘.

Lors de l’instanciation de l’image de type ‘phpmyadmin‘, il sera nécessaire de renseigner des informations tel que le port IP de la BD, du nom du compte, du mot de passe à la BD, …

Ce transfert d’information sera effectué, généralement, par l’utilisation de variables d’environnement.

Par exemple, pour fixer le mot de passe de l’utilisateur ‘root‘, lors du démarrage d’un conteneur de type mariaDB, il faudra utiliser la syntaxe suivante:

docker run  --net reseau01 -it -d --name maBD -e MYSQL_ROOT_PASSWORD=password mariadb

NOTE: —> Tester l’accès à la BD en utilisant la commande ‘mysql‘ dans le conteneur ‘maBD

L’option-e‘ permet de renseigner la variable d’environnement ‘MYSQL_ROOT_PASSWORD

NOTE: Le nom des variables n’est pas fixé de façon arbitraire.  Il faut se référer à la documentation de l’image désirée.

Par exemple, pour mariaBD voir ici

Action 1.0 – Expérimentation avec l’option -e

docker run -it --rm -e PS1='yo: ' -e LOGIN_NAME='Fred Lacrosse' alpine /bin/sh

---

yo: env
HOSTNAME=94cc229f2e3e
PS1=yo: 
LOGIN-NAME=Fred Lacrosse

Action 1.1 – Renseigner le ‘hostname‘ au démarrage d’un conteneur

docker run -it --rm --hostname=maAlpine -e LOGIN_NAME='Coco Lafortune' alpine
-----

/ # env
HOSTNAME=maAlpine
LOGIN-NAME=Coco Lafortune

NOTE: À défaut de l’option –hostname, sa valeur sera le ID du conteneur.


Étape 2 – Construire une image qui utilise une variable d’environnement:

Action 2.1 – Dans un dossier vide, renseigner le fichier Dockerfile suivant:

# À partir d'une image
FROM alpine

# Optionnel
LABEL Alain Boudreault <aboudrea@cstj.qc.ca>

ENV EXEMPLE=2.1
# Exécuter des commandes dans l'image
# RUN apt-get update

COPY momo-dit.sh /
RUN chmod a+x /momo-dit.sh

# Commande à exécuter au démarrage d'un conteneur
CMD ["/momo-dit.sh"]

Action 2.2 – Renseigner le fichier momo-dit.sh suivant:

#!/bin/sh
# Afficher à l'écran le contenu de la variable $MESSAGE
# Cette variable doit-être passée au conteneur avec '-e MESSAGE="Une message à afficher"'
echo "-----------------------------------------------------"
echo "Momo dit: " $MESSAGE
echo "-----------------------------------------------------"
echo "EXEMPLE: " $EXEMPLE
echo

Action 2.3 – Générer l’image

docker build --tag docker-hub-login/momo-dit:1.1 .

Action 2.4 – Tester l’image sans utiliser l’option -e

docker run --rm docker-hub-login/momo-dit:1.1
-----------------------------------------------------
Momo dit: 
-----------------------------------------------------
EXEMPLE:  2.1

Action 2.5 – Tester l’image avec l’option -e

docker run -e MESSAGE='Il fît de la sorte un assez long chemin' --rm docker-hub-login/momo-dit:1.1
-----------------------------------------------------
Momo dit:  Il fît de la sorte un assez long chemin
-----------------------------------------------------

Laboratoire 2.6 (Durée 30 minutes) – Construire une image:

Petit rappel bash:

#!/bin/bash
# Vérifier le contenu du premier paramètre
if [ $1 != "Bob" ] ; then
        echo "Erreur:  Nom de login invalide"
        exit 1
fi
echo "Bienvenue $1 chez nous!"

Référence bash


Étape 3 – Mise en place d’une application, à partir d’un conteneur MariaDB et d’un conteneur adminer, qui roulent (les deux conteneurs) dans un réseau privé.

Action 3.1 – Création du réseau privé

docker network create reseau-3.1

docker network ls 
                   
NETWORK ID     NAME         DRIVER    SCOPE
6eca92520b8e   bridge       bridge    local
5b64d4b7c1d2   host         host      local
786951a15a98   none         null      local
173ec396a986   reseau-3.1   bridge    local

Action 3.2 – Mise en place de l’application de la base de données

docker run --net reseau-3.1 \
--name maBD \
-e MYSQL_ROOT_PASSWORD=password \
-d mariadb

Action 3.3 – Mise en place de l’application ‘adminer’

docker run --net reseau-3.1 -p 8080:8080 -d adminer

NOTE:  La documentation de ‘adminer‘ utilise une syntaxe dépréciée ( –link maBD ) pour le lien vers la BD.  Il est préférable d’utiliser un réseau privé.

Action 3.4 – Tester l’application multi-services.

Action 3.4.1 – Dans un fureteur, inscrire l’adresse localhost:8080, ce qui devrait afficher:

Action 3.4.2 – Renseigner les informations de connexion

NOTE:  Il n’est pas nécessaire de connaitre l’adresse IP du conteneur mariaDB, étant donné qu’il utilise le même réseau privé que adminer alors nous pouvons utiliser le nom du conteneur pour la connexion.

Résultat:


Laboratoire 3.5 (durée 30 minutes) – Construire l’application multi-services suivante:

NOTE:  Il faut consulter la documentation de phpmyadmin pour identifier les variables d’environnement nécessaires au fonctionnement du conteneur.  Il n’est pas nécessaire d’utiliser toutes les variables mentionnées dans la documentation. Seulement celles concernant l’utilisateur PMA, son mot de passe et le nom du conteneur du serveur mySQL.