Java -Démarrer avec Jhipster dans Docker
25 avr. 2017
Ce tuto va aborder les thèmes jhipster et docker.
Je pars du principe que Java 8 et Virtual Box (uniquement si vous utilisez docker <1.12) sont installés sous votre environnement Windows.
Il y existe une nouvelle solution Docker pour les versions Windows 10. Elle permet de lancer docker en démon et d'accéder à docker via l'invite de commande. C'est celle que j'ai choisi : Docker for Windows
Ou alors téléchargez la version Toolbox de Docker si vous souhaitez utiliser Virtual Box.
A partir de docker 1.12 docker machine utilise la virtualisation de Microsoft HyperV avec son Docker For Windows. HyperV est installé nativement sur le PC hôte et on peut ainsi s'affranchir de l'installation de VirtualBox.
Docker Machine est un outil de gestion et provisionning de vos hôtes dockerisés (hôte avec Docker Engine (=docker) dessus)
IMPORTANT il ne faut pas installer VirtualBox car il présente des incompatibilités lorsque vous utilisez HyperV.
Une fois les installations faites, on crée la machine virtuelle default avec le driver hyperv. Vous pouvez aussi le faire avec le driver virtualbox dans le cas où vous êtes sur une vieille version de Docker < 1.12.

Si vous utilisez une console autre que la console de docker (Docker Quickstart Terminal) pour Docker < 1.12 il faut
copier le résultat de cette commande dans la console afin d'ajouter des variables environnements
Pour la suite j'utiliserai tout le temps l'invite de commande de windows avec le démon Docker for Windows démarré.
On lance le docker postegresql
On peut vérifier que la mention 0.0.0.0:5432->5432 est présente pour votre container
Nous allons vérifier que nous pouvons accéder à postgresql
Si vous avez l'erreur précédente, connectez vous sur le container
On réessaye à nouveau de se connecter
On vérifie la connexion
Si vous avez d'autres erreurs regardez la console de log de docker
C'est bon on passe maintenant à jhipster !
Je crée le dossier suivant : C://Users/votreUser/Documents/jhipster
Récupérez l'image docker de jhipster
Nous allons maintenant faire une copie sur notre dépôt docker.
Pour cela il faut créer un dépôt sous le hub docker, je l'appelle general03/coocotte
Je fais ensuite mon tag qui est la copie de jhipster
Je saisis mes identifiants que j'utilise pour me connecter à docker hub
Pour ensuite poussez le contenu dans mon docker hub
Lancez l'image docker. Il va copier les sources de general03/coocotte dans C://Users/votreUser/Documents/jhipster. Vous avez remarqué dans la commande suivante que le lien sous windows ne ressemble pas à celui que vous saisissez dans votre explorateur, il faut utiliser la syntaxe suivante : //c/Users/votreUser/Documents/jhipster
--link coocotte-postgresql:postgresql est important car il permet de faire le lien entre le container postgre et le connecteur JDBC de l'application. Le nom de l'alias est la chaine de caractère suivant les deux-points(:).
Il faut aussi utiliser cette alias dans notre fichier application-dev.yml (adaptez ce fichier si vous êtes sur un autre profile, par défaut c'est celui de dev qui est pris)
Si vous avez cette erreur
Et maintenant nous allons rentrer dans le conteneur
Rendez vous à l'emplacement de l'application
Répondez aux questions permettant de configurer votre application. Pensez à choisir Postegres car on a configuré cette base de données juste avant.
Si vous rencontrez des erreurs npm vous pouvez réinitialiser les dépendances
Il reste plus qu'à installer les dépendances maven
On patiente un peu et on obtient notre template de site déjà tout prêt avec Angular Js et Sprint Boot configuré !

Dans les dernières versions de npm il y a un bug sur Windows il faut passer sur npm 3.10.7 ou mettre le package qui pose problème en facultatif dans le fichier package.json
blog comments powered by Disqus
Je pars du principe que Java 8 et Virtual Box (uniquement si vous utilisez docker <1.12) sont installés sous votre environnement Windows.
1) Prérequis
Nous allons passer par docker pour encapsuler notre application. Le but même de docker est de sauvegarder notre application dans un container docker et seulement notre appli. La base de données ou toute autre chose sera dans un autre conteneur. C'est tout le principe de docker : isolé chaque partie pour faire des micros services.Il y existe une nouvelle solution Docker pour les versions Windows 10. Elle permet de lancer docker en démon et d'accéder à docker via l'invite de commande. C'est celle que j'ai choisi : Docker for Windows
Ou alors téléchargez la version Toolbox de Docker si vous souhaitez utiliser Virtual Box.
A partir de docker 1.12 docker machine utilise la virtualisation de Microsoft HyperV avec son Docker For Windows. HyperV est installé nativement sur le PC hôte et on peut ainsi s'affranchir de l'installation de VirtualBox.
Docker Machine est un outil de gestion et provisionning de vos hôtes dockerisés (hôte avec Docker Engine (=docker) dessus)
IMPORTANT il ne faut pas installer VirtualBox car il présente des incompatibilités lorsque vous utilisez HyperV.
Une fois les installations faites, on crée la machine virtuelle default avec le driver hyperv. Vous pouvez aussi le faire avec le driver virtualbox dans le cas où vous êtes sur une vieille version de Docker < 1.12.
$ docker-machine create --driver hyperv default
Pensez à activer le paramétrage de virtualisation du BIOS, c'est indispensable pour faire tourner virtualbox. Vous pouvez vérifier qu'il est bien activé en vous rendant dans le gestionnaire de tâches 
Si vous utilisez une console autre que la console de docker (Docker Quickstart Terminal) pour Docker < 1.12 il faut
copier le résultat de cette commande dans la console afin d'ajouter des variables environnements
$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\gordon\.docker\machine\machines\default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env default
Pour la suite j'utiliserai tout le temps l'invite de commande de windows avec le démon Docker for Windows démarré.
2) Installation de la base de données
On va commencer par récupérer l'image Postgresql car ça sera mon SGBD.$ docker pull postgres
Une image docker est en lecture seule (elle est stockée sous un registry qui est une librairie d'image) et se contruit avec le Dockerfile. Le container est l'instance de cette image.On lance le docker postegresql
$ docker run --name coocotte-postgresql -p 5432:5432 -e POSTGRES_USER=coocotte -d postgres
Le paramètre -p 5432:5432 de postgre permet d'exposer le port 5432 pour attaquer le container. Si on ne précise pas le port on est moins restrictif, le container acceptera tous les ports.On peut vérifier que la mention 0.0.0.0:5432->5432 est présente pour votre container
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED
7bb6c6b690fd postgres:9.5.4 "/docker-entrypoint.s" 3 months ago
STATUS PORTS NAMES
Up 13 seconds 0.0.0.0:5432->5432/tcp coocotte-postgresql
Nous allons vérifier que nous pouvons accéder à postgresql
$ docker run -it --rm --link coocotte-postgresql:postgres postgres psql -h postgres -U postgres
postgres=# psql -U postgre
ERREUR 'FATAL: role "coocotte" does not exist'
Si vous avez l'erreur précédente, connectez vous sur le container
$ docker run -it --rm --link coocotte-postgresql:postgres postgres psql -h postgres -U postgres
Puis on crée l'utilisateur (attention, ne pas oublier le ; à la fin)postgres=# create user coocotte with password 'coocotte';
On peut vérifier le résultat avec la commande postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
coocotte | Superuser | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
On réessaye à nouveau de se connecter
postgres=# psql -U postgre
FATAL: database "coocotte" does not exist
Cette fois on crée la base (attention, ne pas oublier le ; à la fin)postgres=# create database coocotte;
Cette fois sera la bonne et une fois dans le container avec la commande $ docker run -it --rm --link coocotte-postgresql:postgres postgres psql -h postgres -U postgres
vous pouvez visualiser les databases postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
coocotte | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
On vérifie la connexion
postgres=# psql -h localhost -p 5432 -d docker -U coocotte --password
Si vous avez d'autres erreurs regardez la console de log de docker
$ docker logs coocotte-postgresql
C'est bon on passe maintenant à jhipster !
3) Installation de Jhipster
Créez le dossier où seront placés les sources. Attention sous windows il faut placer le dossier sous C:/Users/votreUser pour que docker ai accès au système de fichier de votre PC.Je crée le dossier suivant : C://Users/votreUser/Documents/jhipster
Récupérez l'image docker de jhipster
$ cd jhipster/app/
$ docker pull jhipster/jhipster
Nous allons maintenant faire une copie sur notre dépôt docker.
Pour cela il faut créer un dépôt sous le hub docker, je l'appelle general03/coocotte
Je fais ensuite mon tag qui est la copie de jhipster
$ docker tag jhipster/jhipster general03/coocotte
Je saisis mes identifiants que j'utilise pour me connecter à docker hub
$ docker login
Pour ensuite poussez le contenu dans mon docker hub
$ docker push general03/coocotte
Lancez l'image docker. Il va copier les sources de general03/coocotte dans C://Users/votreUser/Documents/jhipster. Vous avez remarqué dans la commande suivante que le lien sous windows ne ressemble pas à celui que vous saisissez dans votre explorateur, il faut utiliser la syntaxe suivante : //c/Users/votreUser/Documents/jhipster
$ docker run --link coocotte-postgresql:postgresql --name coocotte \
-v //c/Users/votreUser/Documents/jhipster/app:/home/jhipster/app \
-v //c/Users/votreUser/Documents/jhipster/.m2:/home/jhipster/.m2 \
-p 8080:8080 -p 9000:9000 -p 3001:3001 -d -t general03/coocotte
Le port 9000 est utilisé pour BrowserSync et 3001 pour BrowserSync UI lorsque vous utilisez la commande gulp.--link coocotte-postgresql:postgresql est important car il permet de faire le lien entre le container postgre et le connecteur JDBC de l'application. Le nom de l'alias est la chaine de caractère suivant les deux-points(:).
Il faut aussi utiliser cette alias dans notre fichier application-dev.yml (adaptez ce fichier si vous êtes sur un autre profile, par défaut c'est celui de dev qui est pris)
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:postgresql://postgresql:5432/coocotte
username: coocotte
Si vous avez cette erreur
docker: Error response from daemon: C: drive is not shared. Please share it in Docker for Windows Settings.
il faut activer le lecteur C comme partage 
Et maintenant nous allons rentrer dans le conteneur
$ docker exec -it coocotte bash
Utilisez bash car /bin/sh n'est pas disponible pour le container coocotteRendez vous à l'emplacement de l'application
$ cd /home/jhipster/app
pour installer les dépendances$ yo jhipster
Répondez aux questions permettant de configurer votre application. Pensez à choisir Postegres car on a configuré cette base de données juste avant.
...
Server application generated successfully.
Run your Spring Boot application:
./mvnw
Client application generated successfully.
Inject your front end dependencies into your source code:
gulp inject
Generate the AngularJS constants:
gulp ngconstant:dev
Or do all of the above:
gulp install
Si vous rencontrez des erreurs npm vous pouvez réinitialiser les dépendances
$ npm i generator-jhipster -g
$ npm i
Il reste plus qu'à installer les dépendances maven
$ ./mvnw
...
Une fois termine un message comme celui s'affiche
----------------------------------------------------------
Application 'coocotte' is running! Access URLs:
Local: http://localhost:8080
External: http://172.17.0.2:8080
----------------------------------------------------------
On patiente un peu et on obtient notre template de site déjà tout prêt avec Angular Js et Sprint Boot configuré !

Dans les dernières versions de npm il y a un bug sur Windows il faut passer sur npm 3.10.7 ou mettre le package qui pose problème en facultatif dans le fichier package.json
"optionalDependencies": {
"fsevents": "*"
},
Puis lancer le build à nouveau avec le flag --no-optionalnpm install --no-optional
bower install
gulp install