J’ai decouvert Docker récemment durant ma mission à Bruxelles au sein de l’acteur Buyway, leader sur le marché en solution de crédit. L’idée d’écrire une brève introduction sur le sujet m’est arrivée durant ma collaboration avec l’analyste Redouane. Dans cet article, vous apprendrez à créer une image Docker pour exécuter une application Spring Boot. Je vais d’abord vous donner une brève présentation de docker, puis nous allons créer une image Docker pour notre application spring Boot et l’exécuter en local. Enfin, nous allons sauvegarder notre image dans le docker hub.
لنذهب
Une introduction rapide à Docker
Docker est une plate-forme logicielle qui permet aux développeurs de développer, d’exporter et d’exécuter des applications n’importe où avec l’aide de conteneurs.
Maintenant, qu’est-ce que c’est qu’un conteneur et quels problèmes docker résout-il grâce à ces derniers?
Eh bien, comprenons cela en posant quelques questions. Est-ce que l’un des éléments suivants vous semble familier?
- « Il fonctionne sur ma machine !! »
- “Je pense que votre version de Tomcat est obsolète!
- «Je ne souhaite pas installer 10 bibliothèques et outils différents avant de pouvoir exécuter votre application. Ne peut-elle pas être livrée sous une forme empaquetée avec toutes les bibliothèques et les outils dont elle a besoin? ”
- «Nous avons des applications écrites dans différents langages, outils, bibliothèques système et environnements. Existe-t-il un moyen de les faire fonctionner indépendamment sur la même infrastructure? ”
Je parie que certaines de ces questions vous parlent.
Docker résout ces problèmes en créant un package léger, autonome et exécutable de votre application, qui inclut tout le nécessaire pour l’exécuter, notamment le code, l’exécution, les bibliothèques, les outils, les environnements et les configurations.
Ces packages exécutables autonomes sont appelés images docker. Et une instance en cours d’une image est appelée un conteneur docker.
Désormais, ces images de conteneur peuvent être partagées, expédiées et exécutées n’importe où dans n’importe quel environnement. Ils se comporteront exactement de la même manière, quel que soit l’environnement dans lequel ils évoluent.
De plus, vous pouvez exécuter plusieurs conteneurs ayant des configurations complètement différentes sur la même infrastructure. Tous les conteneurs sont complètement isolés et fonctionnent indépendamment les uns des autres.
Cool, n’est-ce pas? Eh bien, voyons comment exécuter une application spring boot dans un conteneur Docker. Mais avant cela, installez docker community edition sur votre plate-forme.
Spring Boot avec Docker: dockérisation d’une application Spring Boot
1. Télécharger l’application à Dockerizer
Dans cet article, nous allons dockériser une application de gestion d’Agenda construite avec Spring Boot. Vous pouvez télécharger l’application à partir de mon repo github officiel ftounga:
Ou alors n’importe quelle autre application spring boot de votre choix:
2. Définir une image Docker avec Dockerfile
Accédez au répertoire racine de l’application et créez un nouveau fichier nommé Dockerfile.
Dockerfile est l’endroit où nous définissons l’image Docker et spécifions toutes les configurations requises pour exécuter l’application. Voici le fichier Dockerfile pour notre application spring Boot.
Le DockerFile est très simple et déclaratif. Parcourons chaque ligne du fichier Docker et comprenons les détails.
- FROM: une image docker peut utiliser une autre image disponible dans le registre docker en tant qu’image de base ou image parent. Dans l’exemple ci-dessus, nous utilisons l’image openjdk: 8-jdk-alpine comme image de base. Il s’agit d’une image d’exécution OpenJDK 8 très légère utilisant Alpine Linux. (Il est parfait pour les petits microservices Java.)
- LABEL: L’instruction LABEL permet d’ajouter des métadonnées à l’image. Dans le dockerfile ci-dessus, nous avons ajouté des informations sur le maintainer de l’image via l’instruction LABEL.
- VOLUME: les volumes sont un mécanisme permettant de conserver les données générées par le conteneur sur le système d’exploitation hôte et de partager des répertoires à partir du système d’exploitation hôte avec le conteneur.
L’instruction VOLUME crée un point de montage sur le conteneur avec le chemin spécifié. Lorsque vous exécutez le conteneur, vous pouvez spécifier le répertoire sur le système d’exploitation de l’hôte, sur lequel le point de montage sera mappé. Après cela, tout ce que le conteneur écrit dans le chemin monté est écrit dans le répertoire mappé sur le système d’exploitation hôte.
L’un des cas d’utilisation des volumes les plus courants consiste à stocker les fichiers de logs générés par le conteneur sur le système d’exploitation hôte. Par exemple, supposons que votre application écrit les fichiers de log dans un emplacement /var/log/app.log.
Vous pouvez monter un VOLUME avec le chemin / var / log dans le dockerfile, puis spécifier le répertoire du système d’exploitation hôte auquel ce point de montage sera mappé lors de l’exécution du conteneur. Après cela, vous pourrez accéder aux logs à partir du répertoire mappé sur le système d’exploitation hôte.
Dans le dockerfile ci-dessus, nous avons créé un point de montage avec chemin / tmp car c’est à cet endroit que l’application spring boot crée des répertoires de travail pour Tomcat par défaut. Bien que cela ne soit pas nécessaire pour cette application. En effet qui se soucie des repertoires de tomcat? En générale pas grand monde. Mais si vous souhaitez stocker des éléments tels que les logs d’accès tomcat, les VOLUMES sont très utiles.
Vous pouvez en apprendre plus sur les volumes via la documentation officielle.
- EXPOSE: Comme son nom l’indique, cette instruction vous permet d’exposer un certain port au monde extérieur.
- ARG: L’instruction ARG définit une variable avec une valeur par défaut. Vous pouvez remplacer la valeur par défaut de la variable en la transmettant au moment de la génération.
Une fois définie, la variable peut être utilisée par les instructions qui la suivent.
- ADD: L’instruction ADD permet de copier de nouveaux fichiers et répertoires dans l’image Docker.
- ENTRYPOINT: C’est ici que vous configurez la manière dont l’application est exécutée à l’intérieur du conteneur.
3. Construire l’image Docker
Maintenant que nous avons défini le fichier Dockerfile, construisons une image de menu fixe pour notre application.
Avant de créer l’image de menu fixe, vous devez vous assurer d’avoir empaqueté l’application sous la forme d’un fichier jar à l’aide de maven. Vous pouvez taper la commande suivante à partir du répertoire racine du projet pour générer votre jar
La commande ci-dessus crée un fichier jar dans le répertoire cible du projet.
Construisons maintenant l’image docker en tapant la commande suivante:
C’est tout. Vous pouvez maintenant voir la liste de toutes les images docker sur votre système en utilisant la commande suivante:
Cela devrait afficher notre image de docker nouvellement construite.
4. Exécution de l’image docker
Une fois que vous avez une image docker, vous pouvez la lancer à l’aide de la commande d’exécution ceci:
Dans la commande d’exécution, nous avons spécifié que le port 8080 du conteneur doit être mappé sur le port 5000 du système d’exploitation hôte.
Une fois l’application démarrée, vous devriez pouvoir y accéder à l’adresse http: // localhost: 5000.
Le conteneur est au premier plan et une pression sur CTRL + C l’arrêtera. Voyons maintenant comment exécuter le conteneur en arrière-plan.
Exécution de l’image docker en arrière-plan, en mode détaché.
Vous pouvez utiliser l’option -d dans la commande docker run pour exécuter le conteneur en arrière-plan.
La commande ci-dessus démarre le conteneur en arrière-plan et vous donne l’ID du conteneur. Vous pouvez voir la liste de tous les conteneurs en cours d’exécution sur votre système à l’aide de la commande suivante:
5. Pousser l’image docker vers le hub
Poussons maintenant notre image docker fraîchement construite sur le hub de docker afin que d’autres personnes puissent la télécharger et l’utiliser.
- Connectez-vous avec votre identifiant Docker
- Tagger l’image
Pour envoyer une image locale au registre de docker, vous devez associer l’image locale à un référentiel du registre docker. La notation pour le référentiel sur le registre docker est nom d’utilisateur / référentiel: tag.
Pour tagger une image, nous utilisons la commande docker tag:
Par exemple, voici comment nous pouvons tagger l’image de notre application Spring boot en local
Assurez-vous de remplacer mon nom d’utilisateur ftounga par votre identifiant docker dans la commande ci-dessus.
Une fois le tag terminé, vous pouvez taper docker image ls dans le terminal pour afficher la nouvelle image taggée.
Pousser l’image sur le docker hub
Enfin, utilisez la commande push de docker pour pousser l’image taggée sur le docker hub comme ceci
Encore une fois, n’oubliez pas de remplacer le nom d’utilisateur ftounga par votre identifiant docker.
Et c’est tout! L’image sera maintenant publiée sur le hub de docker au lien suivant: https://hub.docker.com/ftounga/spring-boot-websocket-chat-demo/
6- Extraire l’image du docker hub et l’exécuter
Après avoir publié l’image sur le docker hub, n’importe qui peut extraire cette image et l’exécuter dans son environnement. Tapez la commande suivante pour extraire et exécuter l’image sur votre machine.
La commande docker run extrait l’image du docker hub si elle n’est pas disponible localement, puis l’exécute.
Vous voyez comme il est facile de partager votre image avec d’autres. Les gens n’ont pas besoin d’installer quoi que ce soit pour exécuter votre application. Ils ont juste besoin de tirer l’image et de l’exécuter avec docker.
Automatisation de la création et de la publication d’images Docker à l’aide de dockerfile-maven-plugin
Vous pouvez tout automatiser, de la création de l’image du docker à la publication sur docker hub à l’aide de dockerfile-maven-plugin.
Ajoutez le plugin au fichier pom.xml avec les configurations suivantes
La configuration du plug-in comprend le nom du référentiel distant et le tag du repo. Veuillez remplacer le nom d’utilisateur ftounga par votre identifiant docker dans la balise <repository>.
Nous passons également l’argument JAR_FILE à l’intérieur de l’élément <buildArgs>. Rappelez-vous que nous avions ajouté l’instruction ARG JAR_FILE au fichier Dockerfile? L’argument passé ici va remplacer cette valeur.
Voici comment vous pouvez construire l’image docker en utilisant le plugin Docker-file-maven
La commande ci-dessus empaquette d’abord l’application sous la forme d’un fichier jar, puis construit l’image docker.
Enfin, vous pouvez envoyer l’image dans le registre docker à l’aide de la commande dockerfile: commande push
Maintenant, pour l’automatiser davantage, nous avons enregistré les goals dockerfile: build et dockerfile: push dans la phase d’installation du cycle de vie de construction de maven à l’aide de la balise <executions>.
Ainsi, chaque fois que vous exécutez mvn install, les goals build et push de dockerfile-maven-plugin sont exécutés et votre image docker est construite et transmise au hub automatiquement.
Le dockerfile-maven-plugin utilise les informations d’authentification stockées dans les fichiers de configuration ~ /.dockercfg ou ~ /.docker/config.json pour transmettre l’image à votre profil. Ces fichiers de configuration sont créés lorsque vous vous connectez à docker via la commande docker login
Vous pouvez également spécifier les détails de l’authentification dans les fichiers maven settings.xml ou pom.xml. Consultez le fichier Readme officiel du plug-in pour plus d’informations à ce sujet.
Conclusion
L’application que nous avons dockerisée dans cet article est très simple. Elle n’utilise aucune base de données et ne communique pas avec d’autres services. Dans le prochain article, nous allons apprendre à dockériser un service complexe avec une base de données à l’aide de docker-compose. En attendant, vous pouvez en savoir plus sur docker-compose depuis la documentation officielle
See you my niggaz.