0% ont trouvé ce document utile (0 vote)
76 vues7 pages

TPDocker

Transféré par

Zbedi Chaima
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
76 vues7 pages

TPDocker

Transféré par

Zbedi Chaima
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

DevOps

Docker
Docker-Compose
Docker-Swarm

Partie I
Objectif : assurer le lancement d’une solution multi-container à travers docker-compose.
La solution consiste à faire communiquer une application java avec une base de données de
type mysql. L’application java et le serveur mysql sont déployés dans deux conteneurs
différents.
▪ Dans le home de votre système créer un répertoire java_app
~$ mkdir java_app

▪ Accéder à ce répertoire, puis créer un répertoire db_data : ce répertoire sera utilisé pour
le montage de volume avec le serveur mysql afin de garantir la persistance des données.
~$ cd java_app
~$ mkdir db_data

▪ Lancer nano et copier le contenu de ce fichier java_app.yaml


~$ nano java_app.yaml

version: '3'
services:
# Database
db:
image: mysql:latest
volumes:
- ./db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: "password"
networks:
mynetwork :
ipv4_address: "192.168.93.21"
networks:
mynetwork:
ipam:
driver: default
config:
- subnet: "192.168.93.0/24"

▪ sauvegarder ce fichier puis tapper la commande ci_dessous assurant le lancement du


service défini dans le fichier yaml

Mohamed HAMMOUDA
~$ docker docker-compose -f java_app.yaml up

▪ Verifier que le conteneur déployant le serveur mysql est lancé:


~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
517dec91c596 mysql:5.7 "docker-entrypoin" 4 minutes 23 seconds ago java_app_db_1
▪ Verifier que le custom bridge mynetwork a été créé:
~$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
7fa67f234db3 bridge bridge local
d93506af64c3 docker_gwbridge bridge local
3536c5d8fdd9 host host local
2175cc25a8c1 java_app_mynetwork bridge local
2fd0951ef39d none null local

▪ Verifier que le conteneur java_app_db_1 est déployé dan dans le reseau


java_app_mynetwork
~$ sudo docker network inspect java_app_mynetwork
"ConfigOnly": false,
"Containers": {
"3ad7e1b651bb342f390de22c8b8ad8ed9ae46b777e3fbaee6d537f57741d5a08": {
"Name": "java_app_db_1",
"EndpointID": "a030651991a0b0b110afd8512877752ec10942cad26c192162b06dd5bc991897",
"MacAddress": "02:42:c0:a8:5d:15",
"IPv4Address": "192.168.93.21/24",
"IPv6Address": ""
}
},

▪ Accéder au serveur mysql à l’intérieur du conteneur


~$ sudo docker exec -it java_app_db_1 bash
bash-4.2# mysql -u root -ppassword

▪ Créer une base de données (myDB)


mysql> create database myDB;

▪ Sélectionner la base de données myDB


mysql> use myDB;

▪ Créer une table emp dans la stucture est la suivante emp(id, name, city)
mysql> create table emp (id int(10) primary key, name varchar(50), city varchar(50));

▪ Insérer une ligne dans la table emp


mysql> insert into emp values (1,'mohamed','Mahdia');

▪ Revenant à notre machine hôte


mysql> exit
bash-4.2# exit
$:
▪ Purger les services créés par docker_compose
~$ docker docker-compose -f java_app.yaml down

▪ Relancer les services de nouveau

Mohamed HAMMOUDA
~$ docker docker-compose -f java_app.yaml up

▪ Vérifier que les données de la base myDB sont persistantes


$ sudo docker exec -it java_app_db_1 bash
bash-4.2# mysql -u root -ppassword
mysql> use myDB;
mysql> select*from emp;
+----+---------+--------+
| id | name | city |
+----+---------+--------+
| 1 | mohamed | Mahdia |
+----+---------+--------+
1 row in set (0.00 sec)

▪ Revenant à notre machine hôte


mysql> exit
bash-4.2# exit
$:

Une fois nous avons réussi à démarrer un service mysql à travers docker-compose. Nous
allons maintenant assurer la connexion d’une application java récupérée à partir de github
avec la base de données myDB.

▪ Positionnez-vous sur home de votre système


~$ cd ~

▪ Cloner le projet à partir de MohamedHammouda/MysqlDataAccessDocker/


Le clonage créera un répertoire MysqlDataAccessDocker contenant un projet java
assurant la connexion à une base de données et l’insertion d’une ligne.
~$ git clone https://github.com/MohamedHammouda/MysqlDataAccessDocker.git

▪ Editer le fichier dockerfile et comprendre son contenu

#la premiere étape de construction utilise une première image de maven


FROM maven:3.6 AS build

#ajoute le projet en entier dans le repertoire testproject


ADD . /var/tmp/testproject/
WORKDIR /var/tmp/testproject/

#empackager l'application
RUN mvn clean package

#installation de la machine virtuelle


FROM adoptopenjdk/openjdk11:alpine-slim

#copier que les artifact dont on aura besoin de la premiere etape et ignorer le reste
COPY --from=build /var/tmp/testproject/target/App1-0.0.1-SNAPSHOT-jar-with-dependencies.jar /usr/local/

#definir la commande de demarrage pour executer le jar


ENTRYPOINT ["java","-jar","/usr/local/App1-0.0.1-SNAPSHOT-jar-with-dependencies.jar"]

Mohamed HAMMOUDA
▪ Editer la fonction Main.java
$ nano ~/MysqlDataAccessDocker/src/main/java/com/Main.java
package com;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Main {

public static void main(String[] args) throws ClassNotFoundException, SQLException {


final String host = System.getenv("DB_HOST");
final String dbname = System.getenv("DB_NAME");
final String dbPwd = System.getenv("DB_PWD");
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
execute(host, dbname, dbpwd);
}

static void execute(String host, String dbname, String dbpwd) throws ClassNotFoundException, SQLException {
try
{
System.out.println("Connexion... " );
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("getting jdbc driver ==> "+host+" " +dbPwd);
Thread.sleep(2000);
Connection conn = DriverManager.getConnection(
"jdbc:mySql://" + host + "/" + dbname , "root", dbPwd);
PreparedStatement stmt = conn.prepareStatement("INSERT INTO emp(id,name,city) VALUES(?, ?,?)");
stmt.setInt(1, 5);
stmt.setString(2, "Yamada");
stmt.setString(3, "Yamada");
stmt.executeUpdate();
System.out.println("new Line inserted");
}
catch(Exception ex)
{
System.out.println("MysqlError : " + ex.getMessage());
}
}

▪ Modifier le fichier en remplaçant les lignes par les parties marqués en gras
▪ Positionnez vous sur le répertoire MysqlDataAccessDocker contenant le fichier dockerfile
~$ cd ~/MysqlDataAccessDocker

▪ Créer votre image


~$ sudo docker build --tag mohamedhammouda/my_app_image:v1 .

▪ Push votre image dans dockerhub


~$ docker login -u mohamedhammouda -p ${docker_hub_pwd}" }
~$ docker push mohamedhammouda/my_app_image:v1
▪ Lancer votre nouvelle image

Mohamed HAMMOUDA
~$ sudo docker run -it --name appjavav1 --net java_app_mynetwork -e DB_HOST=db -e
DB_NAME=myDB -e DB_PWD=password mohamedhammouda/my_app_image:v1
PWD=password mohamedhammouda/my_app_image:v2
Connexion...
getting jdbc driver ==> db password
Connexion ok db password
new Line inserted

▪ Vérifier que le programme java c’est connecté au serveur mysql


▪ Ajouter ce code au fichier yaml est relancer les services

# java_app
java:
depends_on:
- db
image: my_app_image:v1

restart: always

environment:
DB_HOST: db
DB_PWD: "password"
DB_NAME: "myDB"

networks:
mynetwork :
ipv4_address: "192.168.93.22"

▪ Vérifier que la connexion c’est établie

Partie II
Objectif : assurer la création d’un cluster composé de deux machines (leader+worker) et
déployer un certain nombre de serveur web type nginx.

Préparation de l’atelier
Vous devez disposer de 2 machines virtuelles
si vous disposer d’une MV sur laquelle est installé docker, vous pouvez la clonner deux fois
Click droit sur la MV-->Manage-->Cloner

Afin de pouvoir identifier facilement vos machines virtuellement vous pouvez leurs attribuer
des noms (hostname) différents. Sur chacune de vos machines virtuelles tapez la commande
suivante :
hostnamectl set-hostname swarm1

Afin de connaitre l’état d’activation du swarm sur votre machine


$ sudo docker info|grep -i swarm ---> swarm : inactive

Mohamed HAMMOUDA
Dans le cas où le mode swarm est actif sur votre machine vous pouvez le désactiver en
tapant les commandes suivantes :
$ sudo docker swarm leave –f ---> Manager node
$ sudo docker swarm leave ---> Worker node

La gestion des groupes d’objets nécessite toujours la présence d’un admin ou bien un
manager. Ce dernier sera chargé d’initier la création du groupe et l’invitation des members à
faire partie de ce groupe, Docker Swarm ne fait pas l’exception. Ainsi vous devez choisir une
machine qui se comportera en tant que leader en executant la commande suivante :
m1$ sudo dokcker swarm init
Swarm initialized: current node (xz56ovu00wl98j4qqevveynzh) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-14smdo3nq6p8u6k5mqj4sm9gn7y0vf5cldjq6jl3nfhnhe6h6f-


at999whotij6dwf4h8tyjeir9 192.168.236.129:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Pour ajouter des nouvelles machines (node) au groupe (cluster/swarm) nouvellement créé
dans la machine m1(default manager) taper la commande suivante dans chaque machine
que vous souhaitez quelle fera partie de ce groupe.
m2$ sudo docker swarm join --token SWMTKN-1-
14smdo3nq6p8u6k5mqj4sm9gn7y0vf5cldjq6jl3nfhnhe6h6f-at999whotij6dwf4h8tyjeir9
192.168.236.129:2377 ---> This node joined a swarm as a worker.

Un cluster composé de trois nœuds, un manager node et deux worker nodes. A daemon sur la
machine (manager node) fonctionne en swarm mode au lieu du standalone mode
Pour lister l’ensemble des nœuds faisant partie du swarm
m1$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xz56ovu00wl98j4qqevveynzh * ubuntu Ready Active Leader 20.10.14
y5752tarhrsqbf9bxynppycwg ubuntu Ready Active 20.10.14
yx7vbe51uu6053jse6fid79dk ubuntu Ready Active 20.10.14

Un utilisateur final définit un ensemble de services. Ces services seront par la suite
communiqués au Leader node, qui prend en charge la planification et l’affectation des tâches
aux worker nodes. Les services seront transférés au worker node à travers des lignes de
commandes ou bien un fichier yaml.
m1$ sudo docker service create -p 80:80 --name web nginx

m5d5jwwvcyfiv2owo3aj6pp9p
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged

Mohamed HAMMOUDA
m1$ sudo docker service ls

ID NAME MODE REPLICAS IMAGE PORTS


m5d5jwwvcyfi web replicated 1/1 nginx:latest *:80->80/tcp

Pour avoir des informations sur l’état d’exéction des services---> liste des taches du service
m1$ sudo docker service ps web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
8d1fa3l8lsz1 web.1 nginx:latest swarm1 Running Running 15 minutes ago

Mohamed HAMMOUDA

Vous aimerez peut-être aussi