eXo Platform dans un Docker container !
Nous allons voir qu’il est très facile d’exécuter eXo Platform dans un container Docker, de rendre les données persistantes entre 2 redémarrages d’un container et de brancher son déploiement sur une base de données MySQL.
Pour pouvoir tester le contenu de cet article il vous faut :
- Docker 1.11+ (utilisez Docker4Mac ou Docker4Windows si vous êtes sur un de ces 2 environnements qui ne supportent pas nativement Docker)
- Docker Compose 1.7+
- un accès internet (pour télécharger les images Docker)
- du café (car c’est encore plus long de télécharger des images Docker que de faire un build avec Maven 😉 )
Tout d’abord, faisons au plus simple et démarrons eXo Platform édition Community dans un container Docker. Pour cela, nous allons utiliser l’image Docker exoplatform/exo-community avec ses réglages par défaut (ça peut être un peu long la première fois le temps que l’image Docker soit téléchargée) :
docker run -ti --rm --name exo \ -p 8080:8080 \ exoplatform/exo-community:4.3
Au bout de quelques dizaines de secondes, vous voyez apparaître dans les logsServer startup in 58220 ms . A ce moment là, eXo Platform est initialisé et vous pouvez tester votre installation en vous rendant sur http://localhost:8080/
Que va-t-il se passer maintenant si vous arrêtez et recréez votre container ? et bien vos données auront disparues car elles étaient stockées directement dans ce container. Pour palier à ce problème, nous allons utiliser des volumes Docker afin de stocker les données persistantes en dehors du container. Commençons par créer 2 volumes :
docker volume create --name=data docker volume create --name=logs
et redémarrons eXo Platform dans notre container en utilisant ces volumes :
docker run -ti --rm --name exo \ -p 8080:8080 \ -v data:/srv/exo \ -v logs:/var/log/exo \ exoplatform/exo-community:4.3
Désormais les données persistantes d’eXo Platform (indexes JCR, Values Storage, …) seront stockées dans le volume data et les logs dans le volume logs. Vous pouvez donc arrêter et supprimer votre container et en redémarrer un nouveau, toutes les données que vous aurez déjà saisi resteront disponibles. Bon ça y est ? Je peux passer en production puisque mes données survivent à un redémarrage ? Eh bien non, surtout pas, car il vous manque une base de données utilisable en production !!!
En effet, sans paramétrage particulier, notre image Docker démarre une base de données HSQLDB qui fonctionne très bien pour des tests, mais qui ne doit pas être utilisée en production. Nous allons donc utiliser MySQL 5.5 comme base de données (eXo Platform supporte d’autres types de SGBD). Commençons par démarrer un serveur MySQL dans un Docker container :
# MySQL data volume creation docker volume create --name=mysql_data # MySQL server start with an exo schema docker run -d --name mysql \ -v mysql_data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -e MYSQL_DATABASE=exo \ -e MYSQL_USER=exo \ -e MYSQL_PASSWORD=exo \ mysql:5.5 # Check MySQL logs docker logs mysql
Maintenant que la base de données est prête, nous pouvons démarrer eXo Platform en configurant l’image pour qu’elle utilise MySQL. Cette image, fournie par eXo, expose un ensemble de paramètres permettant d’adapter le comportement de l’image au moment de la création du container (pour une liste détaillée de ces paramètre vous pouvez vous référer à sa documentation en ligne) :
# creating new clean volumes for eXo Platform persistent data docker volume create --name=exo_data docker volume create --name=exo_logs # starting eXo Platform configured with MySQL docker run -ti --rm --name exo \ -p 8080:8080 \ -v exo_data:/srv/exo \ -v exo_logs:/var/log/exo \ --link mysql:mysql \ -e EXO_DB_TYPE=mysql \ -e EXO_DB_NAME=exo \ -e EXO_DB_USER=exo \ -e EXO_DB_PASSWORD=exo \ -e EXO_DB_HOST=mysql \ -e EXO_ADDONS_LIST=exo-jdbc-driver-mysql \ exoplatform/exo-community:4.3
Et voilà ! notre instance eXo Platform est maintenant connectée à une base de données MySQL et toutes les données utilisateurs résisteront à une recréation de vos containers. Connectez-vous à votre nouvel intranet social, invitez du monde et collaborez :
Bon c’est très bien tout ça, vous pouvez désormais déployer en production, mais ça reste tout de même compliqué à démarrer. Pour simplifier encore plus tout ça nous allons utiliser Docker Compose pour pouvoir contrôler notre environnement complet en une ligne de commande beaucoup plus simple.
Pour cela, arrêtons et supprimons tout d’abord les containers précédemment démarrés :
# stop eXo Platform running container docker stop exo # stop MySQL running container docker stop mysql docker rm mysql
Ensuite créons un fichier docker-compose.yml avec le contenu suivant :
version: '2' services: exo: image: exoplatform/exo-community:4.3 environment: EXO_DB_TYPE: mysql EXO_DB_NAME: exo EXO_DB_USER: exo EXO_DB_PASSWORD: exo EXO_DB_HOST: mysql EXO_ADDONS_LIST: exo-jdbc-driver-mysql expose: - "8080" ports: - "8080:8080" volumes: - exo_data:/srv/exo - exo_logs:/var/log/exo links: - mysql depends_on: - mysql mysql: image: mysql:5.5 environment: MYSQL_ROOT_PASSWORD: my-secret-pw MYSQL_DATABASE: exo MYSQL_USER: exo MYSQL_PASSWORD: exo volumes: - mysql_data:/var/lib/mysql volumes: exo_data: external: name: exo_data exo_logs: external: name: exo_logs mysql_data: external: name: mysql_data
Il ne nous reste plus qu’à démarrer l’ensemble (base de donnée MySQL et eXo Platform ) avec la simple commande suivante : docker-compose -f ./docker-compose.yml up .
Après ce redémarrage avec Docker Compose, vous retrouverez les données précédemment créées.
Il y a encore beaucoup d’autres choses à faire autour de eXo Platform et Docker alors restez à l’écoute de notre blog …
Pour aller plus loin :
- plus d’options pour configurer votre container eXo Platform : https://hub.docker.com/r/exoplatform/exo-community/
- plus d’options pour configurer votre container MySQL : https://hub.docker.com/_/mysql/