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.
Le middleware et la bibliothèque utilisent les éléments suivants.
Pour les lecteurs suivants:
Au 16 juillet 2018, il y avait l'entrée suivante sur Qiita avec le mot-clé Jib.
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 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'
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);
}
}
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!
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.
$ 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
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".
Essayons la partie qui enregistre le conteneur créé dans le référentiel.
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
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.
(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.
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
}
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]
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"]}
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".
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