É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