Atelier "Introduction à docker avec maven"

  • Auteurs : Jérome Blanchard
  • Durée : 1H
  • Mots Clés : docker, maven

Résumé

Il s'agit de mettre en oeuvre docker via maven dans un application web java.

Après une rapide prise en main de docker, nous allons prendre le code d'une application web java gérée par maven et adapter le pom.xml afin de permettre la génération automatique d'un docker. Pour aller plus loin, nous verrons également comment intégrer docker comme support pour l’exécution des tests avec maven.

Pré-requis

  • Java 8
  • Maven 3

Support

Manipulations de base de Docker

Récupérer et démarrer une image

Beaucoup de fournisseurs de serveurs ou d'applications publient des images docker. Ces images sont généralement publiées sur le hub officiel de docker : https://hub.docker.com/ Il peut donc être intéressant de se créer un compte sur ce hub afin de profiter de toutes les fonctionnalités qu'il apporte et d'éventuellement pouvoir publier vos propres images docker.

Dans notre cas, il existe une image déjà prête de tomcat. Pour pouvoir l'utiliser, il faut d'abord la télécharger dans le catalogue local des images :

  docker pull tomcat:7-jre8

Une fois l'ensemble des états téléchargés, l'image est disponible localement :

  docker images

Chaque image docker peut avoir plusieurs versions (tags). Lorsque le tag n'est pas spécifié, docker utilise la dernière version disponible (latest).

Pour démarrer une instance de l'image (conteneur) il faut utiliser la commande :

  docker run tomcat:7-jre8

Une nouvelle instance de ce conteneur est alors lancée dans le shell courant. Quitter le shell stoppera le conteneur.

Contrôler les conteneurs

Dans un autre shell il est possible de voir la liste des conteneurs en corus d'execution :

  docker ps

On remarque que le conteneur possède un ID unique mais aussi un nom. Il y a également un port publié. Si l'on essaye d'accéder à ce port sur le localhost, rien ne répond. Ce port est en fait ouvert mais sur un @IP spéciale attribuée par docker au conteneur dans un sous réseaux dédié. Les conteneur peuvent communiquer entre eux sur ce sous réseaux mais la publication sur l'hôte d'un port nécessite un opération de mapping (sorte de NAT) entre un port de l'hôte et un port du conteneur.

Pour trouver l’@IP du conteneur, il faut utiliser une autre commande, depuis un autre shell :

  docker inspect <nom ou id du conteneur>

Une fois que vous avez identifié l’@IP, essayez de vous connecter sur le port 8080 de cette adresse en http.

Pour tuer le conteneur il y a deux options, CTRL+C dans le shell d'origine pour tuer le process ou depuis un autre shell avec la commande :

  docker stop <nom ou id du conteneur>  
  docker ps

On remarque que la commande docker ps ne renvoie que la liste des conteneur actifs. Pour avoir la liste de TOUS les conteneur il faut ajouter le paramètre -a (–all). Le conteneur est arrêté mais il n'est pas supprimé pour autant, pour le supprimer définitivement (et toutes ces données avec) il faut utiliser la commande :

  docker rm <nom ou id>

Ajouter des options au démarrage

Nous allons donc tenter de démarrer une nouvelle instance de cette image de tomcat mais avec d'autres options :

  • lancer en tâche de fond
  • attacher le port 8080 du conteneur au port 8888 de l'hôte
  docker run --help

Accéder aux conteneur actifs

Quand un conteneur tourne en tâche de fond il est impossible de voir ce qu'il se passe. Il est possible de rattacher le terminal sur un conteneur qui tourne avec la commande :

  docker attach <nom ou id>

Ceci n'a pour effet que d'afficher la console du conteneur dans notre console. Il est possible d'exécuter des commandes dans le conteneur (voir des logs, modifier des configs…) depuis l'hôte. Il est alors possible de demande un tail ou même d'ouvrir un nouveau shell

  docker exec -i -t <nom ou id> /bin/bash

Voilà pour l'essentiel des commandes permettant de manipuler des conteneur docker. Nous allons voir maintenant comment créer notre propre conteneur.

Installation de Java

Télécharger et installer Java 8 :

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Décompresser et mettre à jour les variables d'envrionnement

  sudo nano /etc/environment

ou à partir de apt :

  sudo apt-get install openjdk-8-jdk

Tester l'installation :

  java -version

Installation de maven

Télécharger et installer maven :

http://apache.crihan.fr/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz

Décompresser et mettre à jour le fichier /etc/environment

  MAVEN_HOME=/opt/maven
  JAVA_HOME=/opt/java-8
  PATH="/opt/java-8/bin:/opt/maven/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Tester l'installation :

  mvn --version

Mettre en place le projet de base maven

Récupérer les sources du projet :

  git clone https://bitbucket.org/jayblanc/ortolang-ffmpeg.git

ou

  wget https://bitbucket.org/jayblanc/ortolang-ffmpeg/get/46df93a9cd46.zip

Compiler et construire le projet :

  mvn clean package

Vérifier que le fichier war de l'application est bien généré dans le dossier target

Intégrer la génération d'un DockerFile avec le fichier war

Il faut utiliser un plugin maven :

  https://github.com/spotify/docker-maven-plugin

Modifier le pom.xml pour utiliser ce plugin et ajouter le configuration nécessaire :

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>0.4.10</version>
  <configuration>
    <imageName>ortolang-ffmpeg</imageName>
    <baseImage>tomcat:7-jre8</baseImage>
    <entryPoint>["catalina.sh", "run"]</entryPoint>
    <resources>
      <resource>
        <targetPath>/usr/local/tomcat/webapps/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.war</include>
      </resource>
    </resources>
  </configuration>
</plugin>

Compiler et construire le projet et générer l'image docker:

  mvn clean package docker:build

Vérifier que l'image est bien disponible dans les images locales

  docker images

Lancer l'image ainsi générée

  docker run -d -p 8888:8080 ortolang-ffmpeg
 
manifestations/009-docker/blanchard2.txt · Dernière modification: 2016/06/02 15:05 par jayblanc@gmail.com
 
Recent changes RSS feed Powered by PHP Powered by Pxxo Driven by DokuWiki