Docker – Retour sur les fusions (bind) Expérimentation avec MySQL

16 février 2021

Histoire de bien intégrer les notions acquises lors des ateliers précédents, nous allons revisiter:

É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

Mise en situation

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!
-----------------------------------------------------

2 – Fusion de ports

É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 🧐?


Étape 3Fun with MySQL

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

4 – Une image MySQL avec une BD personnalisée

À 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;

5 – Démarrage d’une application WordPress

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.


6 – Laboratoire

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.


8 – Outil de gestion Web pour Docker – Portainer

Portainer

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

 


Document rédigé par Alain Boudreault (c) 2021-2022 – revision 2022.03.15.01