Transformez facilement les applications Java en conteneurs Docker avec Jib ~ Construisez avec gradle et enregistrez-vous dans le référentiel local

Aperçu

Dans cette entrée, je vais essayer la procédure pour transformer facilement une application Java dans un conteneur Docker en utilisant Jib publié par Google.

Le contenu que nous vérifions est presque le même que celui du site du plug-in Gradle de Jib, mais les deux points suivants sont différents.

supposition

Le middleware et la bibliothèque utilisent les éléments suivants.

Public cible

Pour les lecteurs suivants:

Entrées connexes

Au 16 juillet 2018, il y avait l'entrée suivante sur Qiita avec le mot-clé Jib.

Préparation de l'environnement de développement

JDK

Obtenez «jdk-8u171-macosx-x64.dmg» sur le site source de la distribution et démarrez le programme d'installation à partir du fichier dmg.

spring (CLI)

Installez le programme de ligne de commande pour créer un exemple d'application. (Ce n'est pas obligatoire. Il suffit de faire référence à l'exemple sur GitHub.)

Installez avec sdkman.

$ sdk install springboot

Préparez l'application

Préparez le code source de l'application qui peut être construit avec Gradle à l'aide de la CLI de Spring Boot.

$ spring init -d=web --build=gradle jib-test Using service at https://start.spring.io Project extracted to '/Users/hiroki/jib-test'

Remise à neuf

La classe principale du projet a été modifiée comme suit pour fonctionner comme RestController. (Je suis désolé pour l'omission) Cette source est stockée sur GitHub en tant que Tag 1.0.

package com.example.jibtest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    @RequestMapping("/")
    @GetMapping
	public String hello() {
        return "Hello World!";
    }

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

Assurez-vous que l'application peut s'exécuter

Lancez l'application avec gradlew.

$ cd jib-test
$ ./gradrew bootRun

Assurez-vous que l'application s'exécute sur le port 8080 dans votre environnement local.

$ curl http://localhost:8080/
Hello World!

Construire

En supposant que vous êtes prêt et que le démon Docker est en cours d'exécution, utilisez gradle pour créer le conteneur.

「gcr.io/distroless/java」が利用されていることがわかります。

$ gradle jibDockerBuild
Tagging image with generated image reference jib-test:0.0.1-SNAPSHOT. If you'd like to specify a different tag, you can set the jib.to.image parameter in your build.gradle, or use the --image=<MY IMAGE> commandline flag.
warning: Base image 'gcr.io/distroless/java' does not use a specific image digest - build may not be reproducible

Containerizing application to Docker daemon as jib-test:0.0.1-SNAPSHOT...

Getting base image gcr.io/distroless/java...
Building dependencies layer...
Building resources layer...
Building classes layer...
Finalizing...
Loading to Docker daemon...
(Ce qui suit est omis)

Assurez-vous d'avoir une image. (Hmm, n'est-ce pas mignon que l'horodatage soit étrange? Puisque cette année est 2018, il semble que j'ai en quelque sorte soustrait de 1970 en termes de calcul.) La taille était de 134 Mo.

$ docker images | grep jib-test
jib-test            0.0.1-SNAPSHOT      2ce8c6f47c83        48 years ago        134MB

Je vais le démarrer. Notez que nous exposons le port 8080 à l'hôte et spécifions la version "0.0.1-SNAPSHOT" construite avec le plug-in Gradle.

$ docker run -p 8080:8080 -it jib-test:0.0.1-SNAPSHOT 

Assurez-vous que votre application fonctionne de la même manière qu'avant la conteneurisation.

$ curl http://localhost:8080/
Hello World!

se sentir bien. Les projets jusqu'à présent sont stockés dans GitHub en tant que "Add-Gradle-Plugin".

Puisqu'il fonctionne sans distrol, le binaire JavaVM existe,

$ docker exec -it 481fc8ea9d2a java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-1~deb9u1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

/ bin / bash n'existe pas.

$ docker exec -it 481fc8ea9d2a /bin/bash
OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown

Sous le répertoire de construction, il y avait un répertoire appelé jib-cache, dans lequel se trouvait un fichier tar.gz d'une taille d'une douzaine de Mo.

Contenu du fichier tar.gz sous build / jib-cache
$ tar tvf dc3bf5c6afa437de068b6d692f7bd72e29fd7501577c2886c946f719fc3be05f.tar.gz
-rw-r--r--  0 0      0       65100  1  1  1970 app/libs//classmate-1.3.4.jar
-rw-r--r--  0 0      0     1133563  1  1  1970 app/libs//hibernate-validator-6.0.10.Final.jar
-rw-r--r--  0 0      0       66519  1  1  1970 app/libs//jackson-annotations-2.9.0.jar
-rw-r--r--  0 0      0      323848  1  1  1970 app/libs//jackson-core-2.9.6.jar
-rw-r--r--  0 0      0     1349339  1  1  1970 app/libs//jackson-databind-2.9.6.jar
-rw-r--r--  0 0      0       33395  1  1  1970 app/libs//jackson-datatype-jdk8-2.9.6.jar
-rw-r--r--  0 0      0       99987  1  1  1970 app/libs//jackson-datatype-jsr310-2.9.6.jar
-rw-r--r--  0 0      0        8645  1  1  1970 app/libs//jackson-module-parameter-names-2.9.6.jar
-rw-r--r--  0 0      0       26586  1  1  1970 app/libs//javax.annotation-api-1.3.2.jar
-rw-r--r--  0 0      0       66469  1  1  1970 app/libs//jboss-logging-3.3.2.Final.jar
-rw-r--r--  0 0      0        4596  1  1  1970 app/libs//jul-to-slf4j-1.7.25.jar
-rw-r--r--  0 0      0      255485  1  1  1970 app/libs//log4j-api-2.10.0.jar
-rw-r--r--  0 0      0       17519  1  1  1970 app/libs//log4j-to-slf4j-2.10.0.jar
-rw-r--r--  0 0      0      290339  1  1  1970 app/libs//logback-classic-1.2.3.jar
-rw-r--r--  0 0      0      471901  1  1  1970 app/libs//logback-core-1.2.3.jar
-rw-r--r--  0 0      0       41203  1  1  1970 app/libs//slf4j-api-1.7.25.jar
-rw-r--r--  0 0      0      297518  1  1  1970 app/libs//snakeyaml-1.19.jar
-rw-r--r--  0 0      0      366340  1  1  1970 app/libs//spring-aop-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0      660545  1  1  1970 app/libs//spring-beans-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0      930680  1  1  1970 app/libs//spring-boot-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0     1162436  1  1  1970 app/libs//spring-boot-autoconfigure-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0         592  1  1  1970 app/libs//spring-boot-starter-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0         645  1  1  1970 app/libs//spring-boot-starter-json-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0         613  1  1  1970 app/libs//spring-boot-starter-logging-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0         591  1  1  1970 app/libs//spring-boot-starter-tomcat-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0         588  1  1  1970 app/libs//spring-boot-starter-web-2.0.3.RELEASE.jar
-rw-r--r--  0 0      0     1090739  1  1  1970 app/libs//spring-context-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0     1226075  1  1  1970 app/libs//spring-core-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0      280032  1  1  1970 app/libs//spring-expression-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0       21703  1  1  1970 app/libs//spring-jcl-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0     1254656  1  1  1970 app/libs//spring-web-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0      789866  1  1  1970 app/libs//spring-webmvc-5.0.7.RELEASE.jar
-rw-r--r--  0 0      0     3115994  1  1  1970 app/libs//tomcat-embed-core-8.5.31.jar
-rw-r--r--  0 0      0      240244  1  1  1970 app/libs//tomcat-embed-el-8.5.31.jar
-rw-r--r--  0 0      0      256776  1  1  1970 app/libs//tomcat-embed-websocket-8.5.31.jar
-rw-r--r--  0 0      0       93107  1  1  1970 app/libs//validation-api-2.0.1.Final.jar

Autoriser la création d'un conteneur sur chaque build

Cela peut être réalisé en utilisant la fonction gradle avec le plug-in gradle et en spécifiant la dépendance de la tâche.

Changez la version avec guild.gradle pour qu'elle devienne un alias.

version = '0.0.2-SNAPSHOT'

Construire.

./gradlew build -x test
(Omission)
Containerizing application to Docker daemon as jib-test:0.0.2-SNAPSHOT...

Getting base image gcr.io/distroless/java...
Building dependencies layer...
Building resources layer...
Building classes layer...
Finalizing...
Loading to Docker daemon...

Container entrypoint set to [java, -cp, /app/libs/*:/app/resources/:/app/classes/, com.example.jibtest.DemoApplication]

Built image to Docker daemon as jib-test:0.0.2-SNAPSHOT

Les projets jusqu'à présent sont stockés dans GitHub sous "Add-Gradle-Plugin".

Utiliser un référentiel privé local

Essayons la partie qui enregistre le conteneur créé dans le référentiel.

Préparer un référentiel privé

Utilisez le Container for Private Registry publié par docker.

$ docker run -d -p 5000:5000 --restart always --name registry registry:2

Assurez-vous que le conteneur de référentiel privé fonctionne.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
8378d3fa853c        registry:2          "/entrypoint.sh /etc…"   2 minutes ago       Up 2 minutes        0.0.0.0:5000->5000/tcp   registry

<détails> <résumé> Essayez de vendre manuellement la balise et de la pousser vers votre référentiel local. </ résumé>

$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry 2 b2b03e9146e1 9 days ago 33.3MB graalvm latest 751a11aa3b93 3 weeks ago 985MB centos centos7 49f7960eb7e4 5 weeks ago 200MB jib-test 0.0.1-SNAPSHOT 2ce8c6f47c83 48 years ago 134MB jib-test 0.0.2-SNAPSHOT 2ce8c6f47c83 48 years ago 134MB

$ docker tag jib-test:0.0.1-SNAPSHOT localhost:5000/jib-test-0.0.1

$ docker push localhost:5000/jib-test-0.0.1 The push refers to repository [localhost:5000/jib-test-0.0.1] 2c5e48a8f567: Pushed 6ef8c795d7a5: Pushed 72bcd5740b92: Pushed 40930fb97dd9: Pushed 6189abe095d5: Pushed a9872a8d1d84: Pushed latest: digest: sha256:b61de386936e2a5726d91445c1af080c4a32762cd6745298f2872c0fb413b222 size: 1575 hirokis-MBP:jib-test hiroki$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry 2 b2b03e9146e1 9 days ago 33.3MB graalvm latest 751a11aa3b93 3 weeks ago 985MB centos centos7 49f7960eb7e4 5 weeks ago 200MB jib-test 0.0.1-SNAPSHOT 2ce8c6f47c83 48 years ago 134MB jib-test 0.0.2-SNAPSHOT 2ce8c6f47c83 48 years ago 134MB localhost:5000/jib-test-0.0.1 latest 2ce8c6f47c83 48 years ago 134MB

Modifier les paramètres du démon Docker

Activez l'accès non sécurisé à votre registre privé avec le démon docker.

Sous macOS, cliquez sur l'icône Docker dans la barre de menu en haut de l'écran et sélectionnez l'onglet «Démon» dans le menu «Préférences». Cochez "Fonctionnalités expérimentales" et ajoutez "localhost: 5000" aux registres non sécurisés. Appuyez sur "Appliquer et redémarrer" et attendez que le démon Docker redémarre.

docker_option.png

(Supplément) Cette entrée utilise macOS, mais pour Linux etc., [Autour de ça] de Stackoverflow.com/questions/32808215/where-to-set-the-insecure-registry] -flag-on-mac-os) peut être utile.

Spécifiez les options

Voir la [page des plugins de gradle] de Jib (https://github.com/GoogleContainerTools/jib/tree/master/jib-gradle-plugin#export-to-a-docker-context) pour "allowInsecureRegistries" Spécifiez les paramètres. La valeur par défaut est false, donc l'exécution de la tâche Jib sans option entraînera une erreur. Définissez le paramètre sur true afin d'utiliser le registre local à des fins de test. _ Veuillez noter que ceci est uniquement à des fins de test et qu'il ne s'agit pas d'un paramètre de production. _

jib {
  allowInsecureRegistries = true
}

Construire un conteneur

Essayez de pousser vers votre référentiel privé local avec la tâche jib de gradle.

warning: Base image 'gcr.io/distroless/java' does not use a specific image digest - build may not be reproducible

Containerizing application to localhost:5000/jib-test-0.0.2...

Retrieving registry credentials for localhost:5000...
Getting base image gcr.io/distroless/java...
Building dependencies layer...
Building resources layer...
Building classes layer...
Finalizing...

Container entrypoint set to [java, -cp, /app/libs/*:/app/resources/:/app/classes/, com.example.jibtest.DemoApplication]

Assurez-vous que le conteneur est stocké

Vérifiez le contenu du registre privé avec la commande curl. Contient jib-test-0.0.2.

$ curl -X GET http://localhost:5000/v2/_catalog
{"repositories":["jib-test-0.0.1","jib-test-0.0.2"]}

Essayez de bouger

Déplaçons le conteneur enregistré dans le registre privé ci-dessus.

$ docker run -p 8080:8080 -it localhost:5000/jib-test-0.0.2 

Vérifiez l'opération de la même manière que précédemment dans cette entrée.

$ curl http://localhost:8080/
Hello World!

Les projets jusqu'à présent sont stockés dans GitHub sous "Add-Gradle-Plugin".

Résumé

Dans cette entrée, nous avons vu comment conteneuriser facilement des applications Java à l'aide de Jib, d'un conteneur ou d'un outil et du plug-in Gradle de Jib. J'ai lancé un référentiel privé et confirmé que je pouvais enregistrer un conteneur avec la commande jib de Gradle.

Au moment de la rédaction de cet article, Jib est en cours de développement, et certaines fonctionnalités sont sur la feuille de route mais non réalisées, comme la conteneurisation des fichiers WAR. Son application ou non dépend des circonstances du projet, mais le travail de conteneurisation est Il semble utile de considérer l'application, car la simplicité présente des avantages.

Recommended Posts

Transformez facilement les applications Java en conteneurs Docker avec Jib ~ Construisez avec gradle et enregistrez-vous dans le référentiel local
Transformez facilement les applications Java en Docker avec Jib
Créez et testez des applications Java + Gradle avec Wercker
Comment créer un environnement Docker avec Gradle pour IntelliJ
[Édition définitive 2018] [conteneurisation Java 11] Après avoir réduit la taille de l'application Spring Boot à la limite, créez-la avec Jib et poussez-la vers ECR
[Java] [Maven] Modèle de pom.xml pour enregistrer le fichier jar tiers dans le référentiel local
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment créer un serveur Jenkins avec un conteneur Docker sur CentOS 7 de VirtualBox et accéder au serveur Jenkins à partir d'un PC local
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Comment développer et enregistrer une application Sota en Java
Java: démarrez WAS avec Docker et déployez votre propre application
Construire DynamoDB local avec Docker
[Android] Convertissez Map en JSON à l'aide de GSON avec Kotlin et Java
Créer un environnement local Couchbase avec Docker
Construire un projet Java avec Gradle
Créez un environnement de développement d'applications Web qui utilise Java, MySQL et Redis avec Docker CE pour Windows
Bonjour tout le monde en Java et Gradle
Créer un environnement de débogage sur un conteneur - Créer un environnement de développement local pour les didacticiels Rails avec Docker -
Création d'un projet (et d'un référentiel GitHub) à l'aide de Java et Gradle avec IntelliJ IDEA
Commencer par installer Docker sur EC2 et exécuter Yellowfin dans un conteneur
Comment migrer une application Web créée dans un environnement Docker local vers AWS
Comment démarrer un conteneur Docker avec un volume monté dans un fichier de commandes
Faisons une application TODO avec Java 2 Je veux créer un modèle avec Spring Initializr et créer Hello world
Créer une image Spring Boot + Docker avec Gradle
Application Java CICS-Run - (3) Gestion de build avec Gradle
Convertir des fichiers SVG en fichiers PNG en Java
La construction du conteneur Docker ne parvient pas à installer php-radis
De Java à C et de C à Java dans Android Studio
Conversion de JSON en TSV et TSV en JSON avec Ruby
Comment créer un environnement Rails 6 avec Docker
Tester, créer et pousser des images Docker vers GitHub Container Registry à l'aide d'actions GitHub
Créez un environnement Apache et Tomcat avec Docker. À propos, coopération Maven & Java
J'ai essayé de convertir Java Bean et XML avec le formateur XML de Jackson à cette époque