Les Crash-Devs d'un Passionné

Démarrer avec Jhipster dans Docker

/Catégorie/java

Temps de lecture : 14 minutes

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) 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

enable_virtualization_bios.png

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 STATUS PORTS NAMES

7bb6c6b690fd postgres:9.5.4 "/docker-entrypoint.s" 3 months ago 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)

clipboard
Copier le code
1
2
3
4
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

shared_drive_docker_for_windows.png

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é !

homepage_jhipster.png

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