Votre navigateur n'est pas à jour !

Merci de mettre à jour votre navigateur pour utiliser mon blog. Mettre à jour mon navigateur maintenant

×

Java - Démarrer avec Jhipster dans Docker

Date de publication 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.

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
Vérifier l'activation la virtualisation du BIOS
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 Activer le partage de disque pour docker for windows

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 coocotte

Rendez 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é !
Activer le partage de disque pour docker for windows

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-optional
npm install --no-optional
bower install 
gulp install
blog comments powered by Disqus