Introduction aux Architectures Microservices : mise en oeuvre

Post on 16-Apr-2017

12,774 views 4 download

transcript

SOA – Microservices

Mickaël BARON – 2016 (Rév. Janvier 2017)mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

@mickaelbaron

Mise en œuvre

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onLicence

2

Creative CommonsContrat Paternité

Partage des Conditions Initiales à l'Identique

2.0 France

http://creativecommons.org/licenses/by-sa/2.0/fr

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onA propos de l’auteur …

3

� Mickaël BARON

� Ingénieur de Recherche au LIAS

� http://www.lias-lab.fr

� Equipe : Ingénierie des Données et des Modèles

� Responsable des plateformes logicielles, « coach » technique

� Responsable Rubriques Java de Developpez.com

� Communauté Francophone dédiée au développement informatique

� http://java.developpez.com

� 4 millions de visiteurs uniques et 12 millions de pages vues par mois

� 750 00 membres, 2000 forums et jusqu'à 5000 messages par jour

@mickaelbaron

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onPlan du cours

4

� Architecture microservices « fil rouge »

� Coder avec KumuluzEE

� Isoler avec Docker

� Communiquer avec RabbitMQ

� Composer avec Docker Compose

� Répartir la charge avec Nginx

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDéroulement du cours : Introduction générale

5

� Pédagogie du cours

� Des bulles d’aide tout au long du cours

� Comprendre une architecture microservices

� Pas de technique pour l’instant

� Pré-requis

� Cours sur JAX-RS

� Introduction générale sur les Microservices

� Bases en shell Linux

� Bases en réseaux

Ceci est une alerte

Ceci est une astuce

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onRessources : Liens sur le Web

6

� Billets issus de Blog� tuhrig.de/layering-of-docker-images� labs.ctl.io/optimizing-docker-images

� Github� github.com/jpetazzo/orchestration-workshop� github.com/wsargent/docker-cheat-sheet� github.com/chanezon/docker-tips� github.com/javaee-samples/docker-java/tree/master/slides

� Articles� www.programering.com/a/MDMzAjMwATk.html

� Présentations� xebia.github.io/docker-introduction/slides

� Images (crédits)� Site Docker (https://www.docker.com/)� Blog de Laurelt, dessinatrice pour Docker (http://bloglaurel.com/)

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onRessources : Bibliothèque

7

� Docker: Up & Running� Auteur : Karl Matthias, Sean P. Kane� Éditeur : O’Reilly� Edition : June. 2015 - 224 pages - ISBN : 9781491917572

� RabbitMQ in Action� Auteur : Alvaro Videla, Jason J. W. Williams� Éditeur : Manning Publications� Edition : May 2012 - 312 pages - ISBN : 9781935182979

� Docker Cookbook� Auteur : Sébastien Goasguen� Éditeur : O’Reilly� Edition : Dec. 2015 - 366 pages - ISBN : 9781491919712

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onArchitecture microservices « fil rouge » : HelloWorld

8

Vous saisissez un message …

… il apparaît dans la liste

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onArchitecture microservices « fil rouge » : HelloWorld

9

Service web RESThelloworldrestmicroservice

Interface webhelloworldwebmicroservice

Logshelloworldlogmicroservice

Emailhelloworldemailmicroservice

Twitterhelloworldtwittermicroservic

e

Base de donnéesRedis

Bus d’événements

RabbitMQ

Synchrone

Asynchrone

POST/GET

lpushhmset

lrangehgetAll

Body= « ... »

Ce microservice est unpublieur (publisher)

Ces microservices sont des souscripteurs (subscriber)

Sept microservices, des petits noms pour les identifier par la suite

• Web• Rest• Redis• RabbitMQ• Log• Email• Twitter

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Isoler conteur

Channel = helloworld

SOA – Microservices

Mickaël BARON – 2016 (Rév. Janvier 2017)mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

@mickaelbaron 10

Mise en œuvre – Coder avec KumuluzEE

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onJava et les microservices : KumuluzEE

11

� Site web : https://ee.kumuluz.com

� Très jeune projet, a gagné le Duke’s Choice Award 2015

� KumuluzEE s’appuie sur les standards Java EE pour les

briques logicielles (JAX-RS, JPA…)

� Aucune nouvelle API proposée en dehors de Java EE et tout

ce que vous avez appris en Java EE s’applique

� Seule la manière de déployer change

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onKumuluzEE : mode d’emploi

12

1) Créer un projet Maven simple2) Ajouter les dépendances KumuluzEE à votre pom.xml

1) Développer votre application Java EE

<dependency><groupId>com.kumuluz.ee</groupId><artifactId>kumuluzee-core</artifactId><version>${kumuluzee.version}</version>

</dependency><dependency>

<groupId>com.kumuluz.ee</groupId><artifactId>kumuluzee-servlet-jetty</artifactId><version>${kumuluzee.version}</version>

</dependency><dependency>

<groupId>com.kumuluz.ee</groupId><artifactId>kumuluzee-jax-rs</artifactId><version>${kumuluzee.version}</version>

</dependency>

Dépendances minimales pour faire du service REST

Possibilité de choisir le serveur web souhaité (à venir)

@Path("/helloworld")@Produces(MediaType.APPLICATION_JSON)@Consumes(MediaType.APPLICATION_JSON)public class HelloWorldResource {

...@GETpublic Response getHelloWorlds() {

return Response.ok(currentDAO.getHelloWorlds()).build();

}

@POSTpublic Response addHelloWorld(HelloWorld newHelloWorld) {

if (newHelloWorld != null) {newHelloWorld.setStartDate(new

Date().toString());}currentDAO.addHelloWorld(newHelloWorld);return Response.status(Status.CREATED).build();

}

Rien de nouveau. C’est du JAX-RS comme vu dans

les précédents cours

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onKumuluzEE : mode d’emploi

13

5) Ajouter le plugin maven-dependency-plugin au pom.xml

6) Ajouter le fichier beans.xml et créer un répertoire webapp

7) Compiler : $ mvn package

8) Exécuter : $ java -cp target/classes:target/dependency/*

com.kumuluz.ee.EeApplication

9) Tester : localhost:8080/helloworld

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/beans_1_2.xsd"

bean-discovery-mode="all"></beans>

Fichier beans.xml à copier dans META-INF

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>2.10</version><executions>

<execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals>

</execution></executions>

</plugin>

Permettra de placer toutes les dépendances dans le répertoire

target du projet

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

on

Logshelloworldlogmicroservice

Emailhelloworldemailmicroservice

Twitterhelloworldtwittermicroservic

e

Ces microservices sont des souscripteurs (subscriber)

« Fil rouge » : HelloWorld

14

Interface webhelloworldwebmicroservice

Base de donnéesRedis

Bus d’événements

RabbitMQ

Synchrone

Asynchrone

POST/GET

lpushhmset

lrangehgetAll

Body= « ... »

Ce microservice est unpublieur (publisher)

Sept microservices, des petits noms pour les identifier par la suite

• Web• Rest• Redis• RabbitMQ• Log• Email• Twitter

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Isoler conteur

Channel = helloworld

Service web RESThelloworldrestmicroservice

SOA – Microservices

Mickaël BARON – 2016 (Rév. Janvier 2017)mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

@mickaelbaron 15

Mise en œuvre – Isoler avec Docker

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : généralités

16

� Docker Inc. est une jeune entreprise mars 2013� Sites web de référence

� https://www.docker.com� Documentation : https://docs.docker.com/� Installation : https://docs.docker.com/engine/installation/

� Propose une suite d’outils du même nom que la société� Basés principalement sur

� LinuX Containers (LXC) : https://en.wikipedia.org/wiki/LXC� AUFS : https://en.wikipedia.org/wiki/Aufs

� Outils sont principalement en ligne de commande� Fonctionne sous Linux nativement et sous Windows et MacOS

via une VM (Docker Toolbox)

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : un // avec Java

17

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : images

18

� Dans un système Linux classique, deux systèmes de fichiers� bootfs : contient le « boot loader » et le noyau (kernel)

� rootfs : contient la structure des répertoires (/usr, /lib, /bin…)

Dans un système Linux classique le rootfs est en lecture / écriture

Sous Docker le rootfs est en lecture unique (utilisation d’UnionMountdont l’implémentation est aufs)

Identique à la plupart des distributions Linux

Spécifique à chaque distribution

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : images

19

� Plusieurs rootfs ?

� Sous un système Linux classique un seul rootfs

� Sous Docker possibilité de plusieurs rootfs

� Le rootfs constitue l’image de base d’un conteneur Docker

Image de baseSans image pas de conteneur

… patience le concept de conteneur est expliqué

Une image ne peut être modifiée

puisqu’elle est en lecture seule

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : images

20

� Une image est décomposée d’un ensemble de couches appelée layer qui composent l’image finale

� Chaque couche est liée à la couche inférieure dite parent

� Exemple� Image finale = Apache + Emacs + Debian

� Image de base = Debian

� Emacs est une couche de l’image finale

� Emacs est la couche parente de celle d’Apache

� Facilite la réutilisation des images

� Où trouver des images ?� https://hub.docker.com

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : conteneur

21

� Un conteneur est une couche modifiable qui est liée à la

couche inférieure

� Comparaison avec le monde « Java »

� bootfs = JVM

� image de base = classe Object

� image = classe

� relation parent = héritage

� conteneur = instance d’une classe

� Seul le conteneur est en lecture et écriture

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : conteneur interactif (démo 1)

22

# Télécharge l'image 'busybox' depuis DockerHub$ docker pull busyboxUsing default tag: latestlatest: Pulling from library/busybox

c00ef186408b: Pull completeac6a7980c6c2: Pull completeDigest: sha256:e4f93f6ed15a0cdd342f5aae387886fba0ab98af0a102da6276eaf24d6e6ade0Status: Downloaded newer image for busybox:latest

# Création d'un conteneur$ docker run -it busybox /bin/sh # -i = interactif –t dans la console en cours/ #

# Liste le contenu du 'rootfs' du conteneur$ lsbin dev etc home proc root sys tmp usr var

# Liste les processus du conteneur/ # ps -ef

# Fermeture du conteneur (le conteneur se termine)/ # exit

# Affichage des conteneurs (en cours, arrêtés, stoppés...)$ docker ps –aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd2bc3ccd2ee1 busybox "/bin/sh" 26 minutes ago Exited (0) 23 minutes ago goofy_bhabha

� Commandes : run, ps

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : conteneur détaché (démo 2)

23

# Démarre un processus très long$ JOB=$(docker run -d busybox /bin/sh -c 'while true; do echo Hello Poitiers $(date); sleep 1; done')

# Affichage des informations$ docker logs $JOB...Hello Poitiers Thu Jan 7 15:09:01 UTC 2016Hello Poitiers Thu Jan 7 15:09:02 UTC 2016

# Vérification de l'état d'exécution$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES01d4dacd55e2 busybox "/bin/sh -c 'while" 1 minutes ago Up 25 seconds reverent_franklin

# Attacher un conteneur$ docker attach $JOB...Hello Poitiers Thu Jan 7 15:17:22 UTC 2016Hello Poitiers Thu Jan 7 15:17:23 UTC 2016 # Pour terminer un CTRL-C

# Vérification de l'état d'exécution$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES01d4dacd55e2 busybox "/bin/sh -c 'while" 9 minutes ago Exited (0) 44 s reverent_franklin

# Suppression d'un conteneur$ docker rm $JOB # Un conteneur doit être arrêté pour le supprimer ou forcer par l’option -f

� Commandes : run, logs, ps, attach

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : conteneur sans état (démo 3)

24

# Création de fichiers dans le répertoire /tmp$ JOB=$(docker run -d busybox

/bin/sh -c 'while true ; do /bin/touch /tmp/$(date +%H%M%S); sleep 60; done')

# Liste le contenu du répertoire /tmp$ docker exec $JOB /bin/ls /tmp074426074526

# Changement sur le système de fichier – C = Changement, A = Ajout, D = Delete$ docker diff $JOBC /tmpA /tmp/094126A /tmp/094226

# Suppression du conteneur$ docker rm -f $JOB01dbf7a101abc13a80a95fae41c78a3997de90fa9636c26a4c6498738c631c26

# Si nouveau conteneur les anciens fichiers ne sont plus là$ docker run -it busybox /bin/ls /tmp

# N'avez-vous jamais voulu faire cela ? ‘rm –rf /usr’ $ docker run -it busybox /bin/sh -c '/bin/rm -rf /usr;/bin/ls /'

� Commandes : run, exec, diff, rm

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : cinq types de commandes

25

1. Exécution d’un conteneur

2. Informations sur un conteneur

3. Système de fichiers d’un conteneur

4. Gestion des images

5. Gestion du repository DockerHub

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : commandes pour l’exécution

26

� attach : s’attacher à un conteneur� create : crée un conteneur sans le démarrer� exec : exécute une commande dans un conteneur � kill : tue un conteneur via un SIGKILL� network : gère le réseau sur Docker (sous commandes)� ps : affiche tous les conteneurs� rm : supprime un conteneur� run : exécute une commande dans un nouveau conteneur� start, stop : démarre ou arrête un conteneur� wait : bloque jusqu’à l’arrêt du conteneur et affiche le temps� pause, unpause : met en pause tous les processus� rename : change le nom d’un conteneur

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : commandes pour des informations

27

� events : donne des informations temps-réel des conteneurs

� info : informations sur le daemon Docker

� inspect : méta-données sur un conteneur

� logs : affiche les logs (sortie console) d’un conteneur

� port : liste les ports redirigés d’un conteneur

� stats : statistique temps-réel des conteneurs

� top : affiche comme top sur un conteneur

� version : affiche la version du daemon Docker

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : commandes pour le système de fichiers

28

� cp : copie un fichier/répertoire vers un conteneur

� diff : changements sur le système de fichier d’un conteneur

� export : exporte le contenu d’un conteneur (pas une image)

� import : importe le contenu d’une archive tar

� volume : gère les volumes (sous commandes)

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : commandes pour la gestion des images

29

� build : construit une image à partir d’un Dockerfile

� commit : construit une image à partir du conteneur

� history : montre l’historique de l’image

� images : liste les images disponibles

� load : charge une image depuis une archive tar

� rmi : supprime une image depuis la liste

� save : sauvegarder une image vers une archive tar

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : créer une image

30

� A chaque création d’un conteneur, le système de fichiers correspond à celui de l’image « parente »

� Lors de l’arrêt du conteneur les modifications apportées sont perdues

� Questions ? J’aimerais pouvoir conserver ce qui suit� Installations de programmes� Organisation de répertoires� Configuration (réseaux, programmes…)

� Solutions => créer une nouvelle image� Pour créer une nouvelle image

� Manuellement via la commande commit� Via l’utilisation d’un fichier Dockerfile

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : créer une image « manuellement » (démo 4)

31

# Création de fichiers dans le répertoire /tmp$ docker run --name demo4 -d busybox

/bin/sh -c 'while true ; do /bin/touch /tmp/$(date +%H%M%S); sleep 60; done’

# Changement sur le système de fichier – C = Changement, A = Ajout, D = Delete$ docker diff demo4A /tmp/094840A /tmp/094940

# Création d’une image appelée mickaelbaron/demo4$ docker commit demo4 mickaelbaron/demo4C40410395aedf8cfb8f55469a974a519ee764dd3a765e3c78df8df60316870ad # => Id de l’image

# Suppression du conteneur actuel$ docker rm -f demo4demo4

# Affiche la liste des images en cachedocker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEmickaelbaron/demo4 latest c40410395aed About a minute ago 1.113 MBbusybox latest ac6a7980c6c2 5 weeks ago 1.113 MB

# Création d’un conteneur à partir de la nouvelle image (re-exécute la précédente commande while…)$ docker run --name demo4 -d mickaelbaron/demo4

# Affichage du contenu $ docker exec demo4 /bin/ls /tmp094840 # Anciens fichiers094940095317 # Nouveau fichier

� Commandes : run, exec, diff, commit, images

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : créer une image depuis Dockerfile

32

� Un fichier Dockerfile pour créer automatiquement des images� Provisionner (installer des applications, copier des fichiers…)� Configuration (ouverture de port, commande en tâche de fond...)

� Command build pour construire une image

� Dockerfile composé d’instructions (détaillées dans la suite)� Format du fichier

� # pour les commentaires� INSTRUCTION arguments

� Chaque instruction est exécutée indépendament et suivie par un commit => image à chaque instruction

$ docker build –t imagename . -t pour donner un nom à l’image

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : Dockerfile FROM et MAINTENER

33

� L’instruction FROM permet d’indiquer l’image de base à partir

de laquelle l’image à construire s’appuiera (l’image parente)

� Doit être la première instruction du fichier Dockerfile

� Peut apparaître plusieurs fois pour des images multiples

� Exemple

� L’instruction MAINTAINER permet d’indiquer l’auteur

� Exemple

� MAINTAINER Mickael BARON

FROM java:8

Permet de spécifier <image>:<tag>

Dans ce cas il s’agit de la version de Java

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : Dockerfile RUN

34

� L’instruction RUN permet d’exécuter des commandes Linux dans une nouvelle couche pour être commitée dans l’image

� L’instruction RUN peut être utilisée plusieurs fois

� Des exemples avec deux formes possibles (détails après)

� : lancer le goal package de Maven (exec)

� Bonnes pratiques� Regrouper toutes les installations de package si possible� Ne pas faire update et ensuite un install dans un RUN

RUN ["mvn","package"]

RUN apt-get update && apt-get install -y \maven \git

: Mise à jour et installations (form)

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : Dockerfile deux formes pour les instructions

35

� Deux formes pour écrire des instructions dans un Dockerfile

� Pas forcément limitées à l’instruction RUN (voir plus tard)

Forme Shell RUNRUN <command>

• La commande est exécutée dans un shell (/bin/sh -c)

• À utiliser quand il y a plusieurs commandes à appeler à la suite dans une même couche

Forme ExecRUN ["command","param1","param2]

• La commande est directement appelée

• A utiliser quand il n’y a pas forcément accès à un shell

• Si possible utiliser cette forme d’écriture

VS

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : Dockerfile ADD

36

� L’instruction ADD permet de copier des ressources d’une source vers le système de fichiers du conteneur

� Les ressources peuvent être des fichiers, des répertoires ou des fichiers distants

� Si la ressource est un fichier archive dont le format est connu il sera automatiquement décompressé

� Exemple (ajoute un répertoire du hôte vers /work du conteneur)

� L’instruction COPY fait la même chose mais ne gère pas les archives et les fichiers distants

ADD pom.xml /work/pom.xml

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : Dockerfile CMD

37

� L’instruction CMD permet de fournir la commande par défaut lors de l’exécution d’un conteneur

� Elle ne peut être exécutée qu’une seule fois� Exemple

� À l’exécution du conteneur

� Possibilité de surcharger la commande lors de l’exécution

CMD ["java","-jar", "/target/myprogram.jar"]

Pour l’instruction CMD privilégier la

forme d’écriture de type exec

# Création d’un conteneur$ docker run –d myimage

# Vérifie la commande exécutée$ docker psCONTAINER ID IMAGE COMMAND CREATED ...50238de77614 myimage “java –jar /target/myprogram.jar“ 54 minutes ago ...

# Création d’un conteneur$ docker run –d myimage java –jar /target/myprogram.jar param1 param2

# Vérifie la commande exécutée$ docker psCONTAINER ID IMAGE COMMAND CREATED ...50238de77614 myimage “java –jar /target/myprogram.jar param1 param2“ 54 minutes ago ...

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : Dockerfile ENTRYPOINT

38

� L’instruction ENTRYPOINT fait comme CMD sauf qu’elle ne peut être surchargée lors de l’exécution du conteneur

� Elle ne peut être exécutée qu’une seule fois� Exemple

� À l’exécution du conteneur

� Impossibilité de surcharger la commande lors de l’exécution

ENTRYPOINT ["java","-jar", "/target/myprogram.jar"]

# Création d’un conteneur$ docker run –d myimage

# Vérifie la commande exécutée$ docker psCONTAINER ID IMAGE COMMAND CREATED ...50238de77614 myimage “java –jar /target/myprogram.jar“ 54 minutes ago ...

# Création d’un conteneur$ docker run –d myimage java –jar /target/myprogram.jar param1 param2

# Vérifie la commande exécutée$ docker psCONTAINER ID IMAGE COMMAND CREATED ...50238de77614 myimage “java –jar /target/myprogram.jar“ 54 minutes ago ...

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : Dockerfile CMD et ENTRYPOINT

39

� Possibilité de combiner l’instruction ENTRYPOINT et CMD� L’intérêt est pouvoir fixer un début de commande via

ENTRYPOINT et compléter la commande via CMD (défaut)� Exemple

� À l’exécution du conteneur

� Possibilité de surcharger le contenu de CMD

ENTRYPOINT ["java","-jar", "/target/myprogram.jar"]

CMD ["param1","param2"]

# Création d’un conteneur$ docker run –d myimage

# Vérifie la commande exécutée$ docker psCONTAINER ID IMAGE COMMAND CREATED ...50238de77614 myimage “java –jar /target/myprogram.jar param1 param2“ 54 minutes ago ...

# Création d’un conteneur$ docker run –d myimage param3

# Vérifie la commande exécutée$ docker psCONTAINER ID IMAGE COMMAND CREATED ...50238de77614 myimage “java –jar /target/myprogram.jar param3“ 54 minutes ago ...

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : Dockerfile EXPOSE

40

� L’instruction EXPOSE permet de définir quels sont les ports

réseaux du conteneur à exposer

� Ne peut être utilisé qu’une seule fois mais en précisant

plusieurs ports à exposer

� Pratique si vous avez un serveur web Tomcat en 8080 et que

vous souhaiter n’exposer que Tomcat

� Exemple

� EXPOSE 8080

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : Dockerfile (démo 5)

41

FROM maven:3.3.3-jdk-8MAINTAINER Mickael BARON

ADD pom.xml /work/pom.xmlWORKDIR /workRUN ["mvn", "dependency:go-offline"]

ADD ["src", "/work/src"]RUN ["mvn", "package"]

EXPOSE 8080ENTRYPOINT ["java", "-cp", "target/classes:target/dependency/*", "com.kumuluz.ee.EeApplication"]

� Préparation à la construction de l’image du microservice rest

Fichier Dockerfile du projet helloworldrestmicroservice

Si le pom.xml ne change pas le chargement des dépendances

ne se fera pas à chaque modification du code source

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : Dockerfile (démo 5) - suite

42

� Construction de l’image et création du conteneur de rest# Création d’une image à partir du précédent Dockerfile conteneur $ docker build -t mickaelbaron/helloworldrestmicroservice .Sending build context to Docker daemon 12.95 MBStep 1 : FROM maven:3.3.3-jdk-83.3.3-jdk-8: Pulling from library/maven523ef1d23f22: Pull complete...Digest: sha256:62995ea43d8554c7b581c2576fb53d8097039dae19fc68a11f485406a13380dfStatus: Downloaded newer image for maven:3.3.3-jdk-8---> 319dadddb414Step 2 : MAINTAINER Mickael BARON---> Running in 840480e4ec74---> f298b9092c72Removing intermediate container 840480e4ec74Step 3 : ADD pom.xml /work/pom.xml---> f9a9360b890cRemoving intermediate container 1ee48de07452Step 4 : WORKDIR /work---> Running in ee125209a9b9---> 7cfef739d3f7Removing intermediate container ee125209a9b9...Step 9 : ENTRYPOINT java -cp target/classes:target/dependency/* com.kumuluz.ee.EeApplication---> Running in 098f76f8eac9---> ac952da4967cRemoving intermediate container 098f76f8eac9Successfully built ac952da4967c

A chaque étape du Dockerfile une couche intermédiaire sera créée

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

on

Logshelloworldlogmicroservice

Emailhelloworldemailmicroservice

Twitterhelloworldtwittermicroservic

e

Ces microservices sont des souscripteurs (subscriber)

« Fil rouge » : HelloWorld

43

Interface webhelloworldwebmicroservice

Base de donnéesRedis

Bus d’événements

RabbitMQ

Synchrone

Asynchrone

POST/GET

lpushhmset

lrangehgetAll

Body= « ... »

Ce microservice est unpublieur (publisher)

Sept microservices, des petits noms pour les identifier par la suite

• Web• Rest• Redis• RabbitMQ• Log• Email• Twitter

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Channel = helloworld

Service web RESThelloworldrestmicroservice

Isoler conteur

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : persister les données avec les volumes

44

� Pour rappel un conteneur est volatile toutes les données produites sont perdues lors de la destruction du conteneur� Logs

� Données d’une base de données

� Fichiers intermédiaires…

� Comment s’assurer que si je recrée mon conteneur Redis je retrouverai mes données ? => utilisation des Volumes

� Il s’agit d’un dossier qui se trouve à la fois sur le hôte et sur le conteneur (un peu comme un dossier partagé)

� Les données restent sur le hôte même si le conteneur a été supprimé

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : persister les données avec les volumes

45

� Pour créer un volume, utilisation du paramètre -v lors de la création d’un conteneur

� Syntaxe�

� Créer un volume pour le conteneur redis# Récupération de l’image de Redis$ docker pull redis

# Création du conteneur à partir de l’image Redis# -v /var/redis:/data : associe /var/redis du hôte au répertoire /data du conteneur$ docker run --name redis -v /var/redis:/data -d redis redis-server --appendonly yes

# Vérification que le conteneur a été créé$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS 0b2d2671f0d6 redis "/entrypoint.sh redis" 2 minutes ago Up 2 minutes

# Vérification que le volume est opérationnel$ ls /var/redis -ltotal 0-rw-r--r-- 1 999 docker 0 Jan 20 21:14 appendonly.aof # Fichier créé par redis du conteneur.

-v hostdirectory:/containerdirectory

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

on

Logshelloworldlogmicroservice

Emailhelloworldemailmicroservice

Twitterhelloworldtwittermicroservic

e

Ces microservices sont des souscripteurs (subscriber)

« Fil rouge » : HelloWorld

46

Interface webhelloworldwebmicroservice

Bus d’événements

RabbitMQ

Synchrone

Asynchrone

POST/GET

lpushhmset

lrangehgetAll

Body= « ... »

Ce microservice est unpublieur (publisher)

Sept microservices, des petits noms pour les identifier par la suite

• Web• Rest• Redis• RabbitMQ• Log• Email• Twitter

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Channel = helloworld

Service web RESThelloworldrestmicroservice

Isoler conteur

Base de donnéesRedis

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : lier les conteneurs avec les links

47

� Les links est une première solution permettant de lier plusieurs conteneurs entre eux

� Dans notre exemple, le conteneur redis doit être lié au conteneur associé au microservice Rest

� Syntaxe (-l ou --link)�

� Comment ça fonctionne ?� À la création du conteneur où le link est défini, Docker va modifier le

fichier /etc/hosts en en associant l’IP du conteneur lié à valeurAlias

� Pour la composition de conteneurs il est d’usage d’utiliser Docker Compose (voir partie suivante)

--link nomDuConteneur:/valeurAlias

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : lier les conteneurs avec les links

48

Parler des variables créées lors du link

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : lier les conteneurs avec les links

49

� Utilisation des links pour relier les conteneurs redis et rest# Création du conteneur redis$ docker run --name redis -v /var/redis:/data -d redis redis-server --appendonly yes

# Création du conteneur rest# --link création du lien avec le conteneur redis# --env création d’une variable d’environnement REDIS_HOST avec redisalias comme valeur$ docker run --name rest –d --link redis:redisalias --env REDIS_HOST=redisalias \

mickaelbaron/helloworldrestmicroservice

# Vérification que les conteneurs sont démarrés$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8ea3292c609a hellorest... "java -cp target/clas" 3 seconds ago Up 2 seconds 8080/tcp rest0b2d2671f0d6 redis "/entrypoint.sh redis" 21 hours ago Up 3 hours 6379/tcp redis

# Afficher le fichier /etc/hosts pour voir la liaison de rest avec redis$ docker exec -it rest /bin/sh -c 'cat /etc/hosts’172.17.0.3 8ea3292c609a127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters172.17.0.2 redisalias 0b2d2671f0d6 redis

# Depuis rest le dialogue vers redis se fait via redisalias, pour preuve ...$ docker exec -it rest /bin/sh -c 'ping redisalias'PING redisalias (172.17.0.2): 56 data bytes64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.005 ms...

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

on

Logshelloworldlogmicroservice

Emailhelloworldemailmicroservice

Twitterhelloworldtwittermicroservic

e

Ces microservices sont des souscripteurs (subscriber)

« Fil rouge » : HelloWorld

50

Interface webhelloworldwebmicroservice

Bus d’événements

RabbitMQ

Asynchrone

POST/GET Body= « ... »

Ce microservice est unpublieur (publisher)

Sept microservices, des petits noms pour les identifier par la suite

• Web• Rest• Redis• RabbitMQ• Log• Email• Twitter

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Channel = helloworld

Service web RESThelloworldrestmicroservice

Isoler conteur

Base de donnéesRedis

lpushhmset

lrangehgetAll

Synchrone

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : rediriger les ports

51

� Actuellement nous avons deux conteneurs qui s’exécutent

� Pour communiquer avec le conteneur rest adresser une requête via son IP:8080

� La redirection de port permet va permettre d’accéder au conteneur en utilisant l’accès réseau du système hôte

� Syntaxe

� : mappe portHôte avec portConteneur

� : mappe tous les ports du conteneur avec l’hôte

# Vérification que les conteneurs sont démarrés$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8ea3292c609a hellorest... "java -cp target/clas" 3 seconds ago Up 2 seconds 8080/tcp rest0b2d2671f0d6 redis "/entrypoint.sh redis" 21 hours ago Up 3 hours 6379/tcp redis

-p portHôte:portConteneur

-P

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : rediriger les ports

52

# Sans redirection de port$ docker run --name rest --link redis:redisalias --env REDIS_HOST=redisalias \

-d mickaelbaron/helloworldrestmicroservice

# Recherche l’IP du conteneur$ $IP_REST = $(docker inspect rest | jq -r '.[0] | .NetworkSettings.IPAddress’)

# Appel le service web REST$ curl -H "Content-type: application/json" -X POST -d '{"message":"coucou"}' $IP_REST:8080/helloworld$ curl $IP_REST:8080/helloworld[{"rid":1,"message":"coucou","startDate":"Thu Jan 21 20:56:12 UTC 2016"}]

# Suppression du conteneur rest$ docker rm –f rest

# Avec redirection de port$ docker run --name rest -p 8080:8080 –d --link redis:redisalias --env REDIS_HOST=redisalias \

mickaelbaron/helloworldrestmicroservice

# Vérification que les ports ont été redirigés$ docker psCONTAINER ID IMAGE COMMAND STATUS PORTS NAMESca04734156cb hellorest... "java -cp target/clas" Up 3 seconds 0.0.0.0:8080->8080/tcp rest0b2d2671f0d6 redis "/entrypoint.sh redis" Up 6 hours 6379/tcp redis

# Appel le service web REST du conteneur rest via la redirection de port$ curl http://localhost:8080/helloworld[{"rid":1,"message":"coucou","startDate":"Thu Jan 21 20:56:12 UTC 2016"}]

� Redirection de ports avec run

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

on

Logshelloworldlogmicroservice

Emailhelloworldemailmicroservice

Twitterhelloworldtwittermicroservic

e

Ces microservices sont des souscripteurs (subscriber)

« Fil rouge » : HelloWorld

53

Interface webhelloworldwebmicroservice

Bus d’événements

RabbitMQ

Asynchrone

Body= « ... »

Ce microservice est unpublieur (publisher)

Sept microservices, des petits noms pour les identifier par la suite

• Web• Rest• Redis• RabbitMQ• Log• Email• Twitter

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Channel = helloworldBody= « ... »

Channel = helloworld

Service web RESThelloworldrestmicroservice

Isoler conteur

Base de donnéesRedis

lpushhmset

lrangehgetAll

Synchrone

POST/GET

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : aller plus loin

54

� Présentation rapide de Docker et de ses commandes

� A approfondir

� Gestion de la mémoire

� Gestion avancée du réseau

� Variables d’environnement

� Docker fournit Kitematic un outil graphique pour gérer

facilement la création de conteneurs => http://kitematic.com

� ImageLayers est un outil pour examiner l’historique d’une

image => https://imagelayers.io

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker : tips

55

� Pour supprimer tous les conteneurs arrêtés�

� Pour supprimer les images qui n’ont pas de nom�

� Connaître l’IP d’un conteneur (nécessite l’installation de jq)�

� Dans Dockerfile, pour run utiliser un « exec form ["..",".."] » car toutes les images n’ont pas forcément de shell

� Liens� https://www.ctl.io/developers/blog/post/15-quick-docker-tips

docker rm $(docker ps -a -q)

docker rmi $(docker images -f "dangling=true" -q)

docker inspect mycont | jq -r '.[0] | .NetworkSettings.IPAddress'

SOA – Microservices

Mickaël BARON – 2016 (Rév. Janvier 2017)mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

@mickaelbaron 56

Mise en œuvre – Communiquer avec RabbitMQ

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onRabbitMQ

57

SOA – Microservices

Mickaël BARON – 2016 (Rév. Janvier 2017)mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

@mickaelbaron 58

Mise en œuvre – Composer avec Docker Compose

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker Compose : généralités

59

� Docker Compose adresse le constat suivant# Création de l’ensemble des conteneurs$ docker run --name redis -v /var/redis:/data -d redis redis-server --appendonly yes$ docker run --name rabbitmq -d -p 5672:5672 -p 15672:15672 --hostname my-rabbit rabbitmq:management$ docker run --name log –d --link rabbitmq:rabbitmqalias mickaelbaron/helloworldlogmicroservice rabbitmqalias$ docker run --name rest -p 8080:8080 -d --link redis:redisalias --link rabbitmq:rabbitmqalias

--env REDIS_HOST=redisalias --env RABBIT_MQ_HOST=rabbitmqalias mickaelbaron/helloworldrestmicroservice$ docker run --name web -d -p 80:8080 mickaelbaron/helloworldwebmicroservice

� Docker Compose est à utiliser quand vous avez plus d’un conteneur à exécuter pour déployer une application

� A partir d’une commande Docker Compose s’occupe de construire et de démarrer les conteneurs

� La description de la composition est réalisée à partir d’un fichier de configuration docker-compose.yml

� L’outil Docker Compose doit être installé en plus de Docker engine

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker Compose : fichier docker-compose.yml

60

� Composition d’un fichier docker-compose.yml� Chaque paramètre de la ligne de commande se retrouve dans le fichier docker-compose.yml (pas de nouveau concept)

rabbitmq:image: rabbitmq:managementhostname: my-rabbitports:

- 5672:5672- 15672:15672

log:build: helloworldlogmicroservice/links:

- rabbitmq:rabbitmqaliascommand: rabbitmqalias

...

# Création de l’ensemble des conteneurs$ docker run --name rabbitmq -d -p 5672:5672 -p 15672:15672 --hostname my-rabbit rabbitmq:management$ docker run --name log –d --link rabbitmq:rabbitmqalias mickaelbaron/helloworldlogmicroservice rabbitmqalias

Fichier docker-compose.yml

Utilisation d’une image

L’image sera construite

automatiquement

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker Compose : docker-compose.yml (démo 6)

61

� Description de la composition des cinq conteneurs

redis:image: redisvolumes:

- /var/redis:/datacommand: redis-server --appendonly yes

rabbitmq:image: rabbitmq:managementhostname: my-rabbitports:

- 5672:5672- 15672:15672

log:build: helloworldlogmicroservice/links:

- rabbitmq:rabbitmqaliascommand: rabbitmqalias

rest:build: helloworldrestmicroservice/links:

- rabbitmq:rabbitmqalias- redis:redisalias

ports:- 8080:8080

environment:REDIS_HOST: redisaliasRABBIT_MQ_HOST: rabbitmqalias

web:build: helloworldwebmicroserviceports:

- 80:8080

Fichier docker-compose.yml

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker Compose : sous commandes

62

� L’exécution d’un fichier docker-compose.yml passe par la commande docker-composer et des sous commandes

� Si le nom du service (i.e. redis) n’est pas donné en paramètre les sous commandes s’appliquent sur tous les conteneurs• build : construit les images

• kill : kill -9 sur les conteneurs

• logs : affiche la sortie

• pause : met en pause

• ps : liste les conteneurs

• pull : importe les images

• restart : arrête et démarre

• rm : supprimer les conteneurs

• run : démarre les conteneurs

• scale : augmente le nombre

• start : démarre les conteneurs

• stop : arrête les conteneurs

• unpause : sort de pause

• up : build, créer et démarre

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker Compose : docker-compose.yml (démo 6 suite)

63

� Construction des images puis démarrage des conteneurs# Création de l’ensemble des conteneurs$ docker-compose up –dCreating microservices_web_1Creating microservices_redis_1Creating microservices_rabbitmq_1Creating microservices_log_1Creating microservices_rest_1

# Affiche la liste des conteneurs$ docker-compose psName Command State Ports

--------------------------------------------------------------------------------------------------------microservices_log_1 java -cp target/classes:ta ... Exit 1microservices_rabbitmq_1 /docker-entrypoint.sh rabb ... Up 15671/tcp, 0.0.0.0:15672->15672/...microservices_redis_1 /entrypoint.sh redis-serve ... Up 6379/tcpmicroservices_rest_1 java -cp target/classes:ta ... Up 0.0.0.0:8080->8080/tcpmicroservices_web_1 http-server /workdir/site ... Up 0.0.0.0:80->8080/tcp

# Affiche les logs du conteneur associé au service ‘web’$ docker-compose logs webAttaching to microservices_web_1web_1 | Starting up http-server, serving /workdir/siteweb_1 | Available on:web_1 | http:127.0.0.1:8080web_1 | Hit CTRL-C to stop the server

# La même chose en utilisant Docker engine mais en passant par le nom du conteneur ‘microservices_web_1’$ docker logs microservices_web_1Starting up http-server, serving /workdir/siteAvailable on:

http:127.0.0.1:8080Hit CTRL-C to stop the server

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onDocker Compose : les avantages et les inconvénients

64

� Avantages

� Traiter par lots l’arrêt et la suppression des conteneurs

� L’automatisation des commandes (plus facile pour la reprise)

� docker-compose logs => affichera toutes les sorties des consoles

� Inconvénients

� Faire attention à l’enchainement : l’ordre

� Faire attention à la disponibilité des conteneurs dépendants : une

base de données peut prendre un certains temps => prévoir un

système de reconnexion automatique (Healthcheck)

SOA – Microservices

Mickaël BARON – 2016 (Rév. Janvier 2017)mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr

@mickaelbaron 65

Mise en œuvre – Répartir avec Nginx

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onNginx

66

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onConclusion – Bilan – On a vu …

67

� Comment déployer une application Java EE dans uneapproche « container-less »

� Comment isoler une application Java EE avec un conteneur Docker

� Comment écrire un Dockerfile et construire une image

� Comment communiquer entre deux conteneurs

� Comment faire des communications synchrones et asynchrones entre des services

� Comment composer des conteneurs

SOA - Microservices - Outils - M. Baron - PageSOA - Microservices - Outils - M. Baron - Page

keul

keul

.blo

gspo

t.com

@m

ickae

lbar

onProchainement dans une nouvelle version

68

� Utilisation du framework self-contained Spring Boot

� Partie sur le bus d’événements avec RabbitMQ

� Partie sur la montée en charge docker-compose scale

� Partie sur le reverse-proxy et la répartition de charges avec

Nginx

� Partie sur le test de charge (outil AB par exemple)

� Déploiement sur plusieurs machines avec Docker Swarm