
Étape 1 – Liaison d’un dossier sur une alpine
Action 1.1 – Dans un répertoire vide, créer
mkdir mes-scripts-sh
Attention, ne pas descendre dans le nouveau dossier.
Action 1.2 – Ajouter au dossier ‘mes-scripts-sh‘ le fichier ‘Momo-dit-v1.sh‘
code mes-scripts-sh/momo-dit-v1.sh
----> Contenu:
#!/bin/sh
# Afficher à l'écran le contenu de la variable $1
if [ -z "$1" ]
then
echo "Usage: momo-dit-v1 'un message'"
exit 1
fi
echo "-----------------------------------------------------"
echo "Momo dit: " $1
echo "-----------------------------------------------------"
echo
La prochaine étape consiste à démarrer une alpine et à lier le dossier ‘mes-scripts-sh‘ au nouveau conteneur.
Il faut TOUJOURS utiliser l’adressage absolu lors de la liaison. Cela n’est pas très pratique, surtout si nous avons à travailler avec une structure profonde de dossiers.
Heureusement, il est possible d’injecter le chemin du répertoire courant lors de la liaison (-v) de volumes.
Action 1.3 – Afficher le résultat de la commande ‘pwd‘
$ echo $(pwd)
/Users/alain/420-4D4
# NOTE: Nous plaçons l'expression entre "" car sous PowerShell, le résultat sera sur deux lignes à moins d'utiliser la syntaxe ${pwd}.
$ echo "$(pwd)/mes-scripts-sh"
/Users/alain/420-4D4/mes-scripts-sh
Action 1.4 – Démarrer un conteneur alpine, lié au dossier ‘mes-scripts-sh‘.
docker run --rm -it --name momo-dit -v "$(pwd)/mes-scripts-sh/:/mes-scripts-sh" alpine / # ls mes-scripts-sh/ momo-dit-v1.sh
Action 1.5 – Tester le script ‘Momo-dit-v1.sh‘
/ # chmod a+x mes-scripts-sh/momo-dit-v1.sh / # mes-scripts-sh/momo-dit-v1.sh "Bonjour le monde!" ----------------------------------------------------- Momo dit: Bonjour le monde! -----------------------------------------------------
Étape 2 – Expérimentation avec node-red
Node-RED est un outil de développement basé sur des flux de programmation visuelle. Cet outil, développé à l’origine par IBM, permet de connecter des périphériques matériels, des API et des services en ligne dans le cadre de l’Internet des objets (IOT).
Action 2.1 – Démarrer un conteneur node-red sur le port 80
docker run -it -d -p 80:1880 nodered/node-red
Action 2.2 – Tester dans un fureteur: http://localhost

NOTE: Remarquer le message d’avertissement ‘WARNING’
Action 2.2 – Ajouter deux noeuds dans node-red

Note: À la sortie de node-red, notre schéma sera perdu.
Action 2.3 – Arrêter et effacer le conteneur node-red
Action 2.4 – Démarrer un conteneur node-red avec une fusion de volumes.
# Créer un répertoire de travail pour node-red $ mkdir node-red # Démarrer node-red avec une fusion de volumes docker run -it -d -p 80:1880 -v "$(pwd)/node-red/:/data" nodered/node-red

NOTE: Remarquer il n’y a plus de message d’avertissement.
Action 2.5 – Ajouter deux noeuds dans node-red

Action 2.6 – Arrêter, effacer et relancer le conteneur.
QUESTION: Est-ce que le schéma node-red de l’action 2.5 est disponible 🧐?
Pré-requis
Nous allons maintenant pousser un peu plus loin notre compréhension des liaisons de type ‘volume’ et ‘réseau’.
Action 3.1 – Créer un répertoire de liaison pour les bases de données de MySQL
mkdir mysql
Action 3.2 – Lancer un conteneur MySQL avec une liaison locale
docker run -p 99:3306 -e MYSQL_ROOT_PASSWORD=password --name maBD -v "$(pwd)/mysql:/var/lib/mysql" -d mysql
NOTE: Le mot de passe pour root est ‘password‘ et le port de connexion est ‘99‘
Résultat:
2021-02-16 21:43:05+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. 2021-02-16 21:43:05+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 2021-02-16 21:43:05+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. 2021-02-16 21:43:05+00:00 [Note] [Entrypoint]: Initializing database files 2021-02-16T21:43:05.406448Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.23) initializing of server in progress as process 47 2021-02-16T21:43:05.415338Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive 2021-02-16T21:43:05.420410Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2021-02-16T21:43:08.336062Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2021-02-16T21:43:11.334556Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. 2021-02-16 21:43:15+00:00 [Note] [Entrypoint]: Database files initialized 2021-02-16 21:43:15+00:00 [Note] [Entrypoint]: Starting temporary server 2021-02-16T21:43:15.825021Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 92 2021-02-16T21:43:15.831944Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive 2021-02-16T21:43:15.855469Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2021-02-16T21:43:16.580080Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2021-02-16T21:43:16.776999Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock 2021-02-16T21:43:16.985323Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2021-02-16T21:43:16.985761Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. 2021-02-16T21:43:16.992337Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. 2021-02-16T21:43:17.048444Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL. 2021-02-16 21:43:17+00:00 [Note] [Entrypoint]: Temporary server started. Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. 2021-02-16 21:43:23+00:00 [Note] [Entrypoint]: Stopping temporary server 2021-02-16T21:43:23.092752Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.23). 2021-02-16T21:43:24.969309Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.23) MySQL Community Server - GPL. 2021-02-16 21:43:25+00:00 [Note] [Entrypoint]: Temporary server stopped 2021-02-16 21:43:25+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. 2021-02-16T21:43:25.356057Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 1 2021-02-16T21:43:25.364401Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive 2021-02-16T21:43:25.376308Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2021-02-16T21:43:25.980587Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2021-02-16T21:43:26.177462Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock 2021-02-16T21:43:26.313565Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2021-02-16T21:43:26.313846Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. 2021-02-16T21:43:26.320063Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. 2021-02-16T21:43:26.395319Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
Action 3.3.1 – Connexion locale au SGBD MySQL avec le client mysql
docker exec -it maBD mysql -uroot -ppassword
Action 3.3.2 – Connexion locale au SGBD MySQL,
À partir de l’application MySQLWorkBench – Créer une nouvelle connexion:

Action 3.4 – Créer un nouveau schéma (BD)

Laboratoire 3.5
QUESTION: Est-ce que nous avons retrouvé la BD ‘maBD‘?
Alternative
Si vous n’êtes pas à l’aise avec l’application ‘MySQLWorkBench‘, vous pouvez utiliser le client ‘mysql‘ du conteneur:
$ docker exec -it maBD /bin/bash
/# mysql -uroot -ppassword
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| maBD |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> CREATE DATABASE docker_sql_99;
mysql> USE docker_sql_99;
mysql> CREATE TABLE tbl_amis (nom VARCHAR(30), email VARCHAR(30));
mysql> SHOW TABLES;
+-------------------------+
| Tables_in_docker_sql_99 |
+-------------------------+
| tbl_amis |
+-------------------------+
mysql> INSERT INTO tbl_amis (nom, email) VALUES ('Toto Binette', 'toto@me.com');
mysql> INSERT INTO tbl_amis (nom, email) VALUES ('Titi Binette', 'titi@me.com');
mysql> SELECT * FROM tbl_amis;
+--------------+-------------+
| nom | email |
+--------------+-------------+
| Toto Binette | toto@me.com |
| Titi Binette | titi@me.com |
+--------------+-------------+
2 rows in set (0.00 sec)
mysql> exit
À partir d’un dossier vide
Action 4.0 – Créer les dossiers suivants:
mkdir BDInit mkdir maBD
Action 4.1 – Dans le dossier BDInit, créer le fichier mabd-init.sql.
/*
Exemple d'un script d'initialisation d'un schéma de BD MySQL
Fichier: DBInit/mabd-init.sql
Auteur: Alain Boudreault
Date: 2021.02.18
*/
CREATE DATABASE IF NOT EXISTS mabd;
CREATE USER bob;
-- select host, user from mysql.user;
GRANT ALL PRIVILEGES ON mabd.* TO 'bob'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON mabd.* TO 'bob'@'localhost' IDENTIFIED BY 'password';
USE mabd;
CREATE TABLE tbl_amis (nom VARCHAR(30), email VARCHAR(30));
INSERT INTO tbl_amis (nom, email) VALUES ('Toto Binette', 'toto@me.com');
INSERT INTO tbl_amis (nom, email) VALUES ('Titi Binette', 'titi@me.com');
-- FIN DU SCRIPT
Action 4.2 – Créer le fichier docker-comp-init-bd.yml suivant :
# Fichier: docker-comp-init-bd.yml
# Auteur: Alain Boudreault
# Date: 2021.02.18
# --------------------------------
# Exemple de modification du schéma de la DB lors de l'étape démarrage du service.
# De plus, les BD sont liées à l'extérieur du conteneur.
# Les répertoires: database et dbdata doivent exister dans le dossier courrant.
# Le fichier d'initialisation SQL 'mabd-init.sql' doit-être présent dans le dossier database.
version: '3'
services:
mysql:
image: mysql:5.7
volumes:
- ./BDInit:/tmp/database # Un zone temporaire de stockage
- ./maBD:/var/lib/mysql:rw # Le dossier de stockage des BD.
ports:
- "3308:3306"
environment:
- MYSQL_ROOT_PASSWORD=password
command: mysqld --init-file="/tmp/database/mabd-init.sql"
Action 4.3 – Démarrer le service
docker-compose -f docker-comp-init-bd.yml up -d
NOTE: Nous utilisons ICI, la commande docker-compose, qui permet de démarrer un système à multi-services. docker-compose est une alternative à la commande docker run suivi d’un nombre élevé d’options.
Au cours suivant, nous amorcerons nos apprentissages de l’approche micro-services avec docker-compose.
Action 4.4 – Expérimenter avec la base de données
docker exec -it conteneur-ID mysql -uroot -ppassword
mysql> SHOW DATABASES; mysql> USE mabd; mysql> SHOW tables; mysql> SELECT * FROM tbl_amis; mysql> SELECT host, user FROM mysql.user;
Action 5.1 – Créer un réseau privé docker pour l’application
docker network create monreseau docker network ls
Action 5.2 – Démarrage du service de base de données
Note: L’utilisation des variables d’environnement:
permet la création d’une base de données ainsi qu’un compte utilisateur à la base de données, lors de la première exécution du conteneur.
docker run -d -v $(pwd)/db_data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=jteledispas \ -e MYSQL_DATABASE=wordpress \ -e MYSQL_USER=wp420 \ -e MYSQL_PASSWORD=wp420 \ --name baseDeDonneesPourWP \ -p 3306:3306 \ --network monreseau \ mysql:5.7
Note: Il faut se référer à la documentation sur hub.docker.
Action 5.3 – Vérification de la création de la BD et de l’utilisateur pour le service WordPress.

Action 5.4 – Démarrage du service de WordPress
docker run --name worpress -d \ -p 8000:80 \ -e WORDPRESS_DB_HOST=baseDeDonneesPourWP \ -e WORDPRESS_DB_USER=wp420 \ -e WORDPRESS_DB_PASSWORD=wp420 \ -e WORDPRESS_DB_NAME=wordpress \ --network monreseau \ wordpress:latest
Action 5.5 – Afficher les conteneurs en exécution
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5715adf4eca2 wordpress:latest "docker-entrypoint.s…" 21 seconds ago Up 20 seconds 0.0.0.0:8000->80/tcp worpress ac7ea4103539 mysql:5.7 "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp baseDeDonneesPourWP
Action 5.6 – Lancer wordpress dans un fureteur
http://localhost:8000


Voilà, nous avons l’application WordPress fonctionnant grace à deux micro-services; 1) MySQL, 2) WordPress.
Action 5.6 – Comparaison entre docker run et docker-compose pour l’app WordPress. Docker-compose sera couvert à la leçon suivante.

Mettre en place un site wordpress, à partir de conteneurs, pour la CIE_ABC, en respectant le devis suivant:
Voilà, nous venons de terminer notre expérimentation avec un conteneur de type MySQL.
Action 8.1 – Démarrer l’application via docker
# Note: Syntaxe pour une station MacOs ou Linux:
$ docker volume create portainer_data
$ docker run -d -p 8000:8000 -p 9443:9443 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:2.11.1
Note: Docum pour Windows ici
Action 8.2 – Ouvrir l’application:
https://localhost:9443
