今天给大家介绍的是由Google出品的容器镜像构建类库--Jib, 通过Jib可以非常简单快速的为你的Java应用构建Docker 和 OCI 镜像, 无需深入学习docker, 无需编写Dockerfile, 以 Maven插件、Gradle插件和Java lib的形式提供。
三种使用Jib的方法:
- Maven插件:jib-maven-plugin;
- Gradle插件:jib-gradle-plugin;
- Java库:Jib Core;
Jib目标
1)Fast- 快速部署您的更改。Jib将您的应用程序分成多个层,从类中分离依赖项。现在您不必等待Docker重建整个Java应用程序 - 只需部署更改的层即可。
2)Reproducible- 使用相同内容重建容器图像始终生成相同的图像。不用担心再次触发不必要的更新。
3)Daemonless- 减少CLI依赖性。从Maven或Gradle中构建Docker镜像,然后推送到您选择的任何注册中心。不再编写Dockerfiles并调用docker build / push。
官网地址
github官网地址
https://github.com/GoogleContainerTools/jib
最新版本
<dependency>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.5.2</version>
</dependency>
基础镜像
docker pull openjdk:8-alpine3.9
重新打标签
docker tag openjdk:8-alpine3.9 192.168.198.155:5000/lagouedu/openjdk:8-alpine3.9
登录harbor-155私服
docker login 192.168.198.155:5000
username:admin
password:Harbor12345
上传镜像
docker push 192.168.198.155:5000/lagouedu/openjdk:8-alpine3.9
删除jenkinsagent-154镜像 '
docker rmi -f 192.168.198.155:5000/lagouedu/openjdk:8-alpine3.9 openjdk:8- alpine3.9
项目配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.5.2</version>
<configuration>
<!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字-->
<from>
<!--使用harbor-155上的openjdk镜像-->
<image>192.168.198.155:5000/lagouedu/openjdk:8- alpine3.9</image>
<!--harbor-155服务器的登录信息-->
<auth>
<username>admin</username>
<password>Harbor12345</password>
</auth>
</from>
<to>
<!--镜像名称和tag,使用了mvn内置变量${project.version},表示当 前工程的version-->
<image>192.168.198.155:5000/lagouedu/jenkinsdemo:${project.version}</image>
<auth>
<username>admin</username>
<password>Harbor12345</password>
</auth>
</to>
<container>
<!--配置jvm虚拟机参数-->
<jvmFlags>
<jvmFlag>-Xms512m</jvmFlag>
</jvmFlags>
<!--配置使用的时区-->
<environment>
<TZ>Asia/Shanghai</TZ>
</environment>
<!--要暴露的端口-->
<ports>
<port>8080</port>
</ports>
</container>
<!--可以进行HTTP-->
<allowInsecureRegistries>true</allowInsecureRegistries>
</configuration>
<!--将jib与mvn构建的生命周期绑定 mvn package自动构造镜像-->
<!--打包及推送命令 mvn -DsendCredentialsOverHttp=true clean package-->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build </goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
container元素介绍
container配置:
这个标签主要配置目标容器相关的内容,比如:
appRoot -> 放置应用程序的根目录,用于war包项目
args -> 程序额外的启动参数.
environment -> 用于容器的环境变量
format -> 构建OCI规范的镜像
jvmFlags -> JVM参数
mainClass -> 程序启动类
ports -> 容器开放端口
详细资料请参考官网地址:
https://github.com/GoogleContainerTools/jib/tree/master/jib-maven- plugin#container-object
controller
controller/JibDemoController
@RestController
public class JibDemoController {
@GetMapping("/")
public String hello() {
return "docker jib-maven-plugin jenkins hello!!!";
}
}
构建镜像
执行命令:
mvn clean package -Dmaven.test.skip=true jib:build
执行命令后报错,错误的原因是由于 from image 配置的基础镜像需要认证信息必须要增加
-DsendCredentialsOverHttp=true的参数。
再次执行命令:
mvn clean package -Dmaven.test.skip=true jib:build - DsendCredentialsOverHttp=true
三种构建参数
对于一个已在pom.xml中配置了jib插件的java工程来说,下面是个标准的构建命令
mvn compile jib:dockerBuild
注意上面的dockerBuild参数,该参数的意思是将镜像存入当前的镜像仓库,这样的参数一共有三种,列表说明。
image.png
镜像的时间问题
在使用命令mvn compile jib:dockerBuild构建本地镜像时,会遇到创建时间不准的问题:如下所示,lagou/jenkins:1.0是刚刚使用jib插件构建的镜像,其生成时间(CREATED字段)显示的是50 years ago:
在jenkinsagent-154服务器拉取镜像
docker pull 192.168.198.155:5000/lagouedu/jenkinsdemo:1.0
查看镜像
docker images
上面显示的镜像生成时间显然是不对的,改正此问题的方法是修改pom.xml,在jib插件的container节点内增加creationTime节点,内容是maven.build.timestamp的时间,如下所示:
<container>
<!--创建时间-->
<creationTime>${maven.build.timestamp}</creationTime>
</container>
修改保存后再次构建,此时新的镜像的创建时间已经正确
删除jenkinsagent-154服务器上镜像
docker rmi -f 192.168.198.155:5000/lagouedu/jenkinsdemo:1.0
在harbor-155服务器上删除镜像
在idea中再次构建镜像
mvn clean package -Dtest.skip=true jib:build -DsendCredentialsOverHttp=true
在jenkinsagent-154服务器拉取镜像
docker pull 192.168.198.155:5000/lagouedu/jenkinsdemo:1.0
查看镜像
docker images
运行容器
docker run -itd --name jenkinsdemo -p 8080:8080
192.168.198.155:5000/lagouedu/jenkinsdemo:1.0
测试容器:
http://192.168.198.154:8080/
多次构建后,积累的无用镜像
构建多次后,本地会遗留多个名为,tag也是的镜像。 这些都是上一次构建的结果,在经历了新一轮的构建后,其镜像名和tag被新镜像所有,所以自身只能显示名为,tag也是,清理这些镜像的命令是docker image prune,然后根据提示输入"y",镜像即可被清理:
docker image prune
提示信息如下
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
jenkins整合jib
gitlab服务器
- gitlab-152服务器上创建jibdemo项目。
- 使用idea开发工具将jibdemo项目上传gitlab服务器。
jenkins服务器
- jenkinsmaster-153创建pipeline-test04任务
Jenkinsfile文件
编写步骤
- 环境检测:检测jenkinsagent-154节点基础软件运行情况
- 拉取代码:从gitlab-152服务器拉取jildemo项目
- 编译构建:jenkinsagent-154执行maven命令;使用jib插件声明周期push镜像至harbor-155服务器4. 删除容器:删除jenkinsagent-154服务器jibdemo容器
- 删除镜像:删除jenkinsagent-154服务器jibdemo镜像
- 登录harbor:docker登录harbor-155服务器
- 拉取镜像:拉取jibdemo镜像
- 运行容器:运行jibdemo容器
脚本骨架
pipeline {
agent {
label 'jenkinsagent-154'
}
stages {
stage('检测环境') {
steps { sh label: '', script: '''java -version
mvn -v
git version
docker -v'''
}
}
stage('拉取代码'){
steps{echo 'gitlab拉取代码'
}
}
stage('编译构建'){
steps{echo '编译构建'
}
}
stage('删除容器'){
steps{echo '删除容器'
}
}
stage('删除镜像'){
steps{
echo '删除镜像'
}
}
stage('登录harbor'){
steps{
echo '登录harbor'
}
}
stage('拉取镜像'){
steps{
echo '拉取镜像'
}
}
stage('运行容器'){
steps{
echo '运行容器'
}
}
}
}
测试pipeline任务
立即构建
拉取代码
stage('拉取代码'){
steps{
echo 'gitlab拉取代码'
checkout([$class: 'GitSCM', branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'c8634952-4993-4455-b164-35427823144f', url:
'ssh://git@192.168.198.152:222/lagou/jibdemo.git']]])
}
}
编译构建
stage('编译构建'){
steps{
echo '编译构建'
sh label: '', script: 'mvn clean package -Dmaven.test.skip=true
jib:build -DsendCredentialsOverHttp=true'
}
}
删除容器
stage('删除容器'){
steps{
sh label: '', script: '''echo \'检查容器是否存在\'
containerid=`docker ps -a | grep -w jibdemo | awk \'{print $1}\'`
if [ "$containerid" != "" ];then
echo ‘容器存在,停止容器’
docker stop $containerid
echo ‘删除容器’
docker rm $containerid
fi'''
}
}
删除镜像
stage('删除镜像'){
steps{
sh label: '', script: '''echo \'检查镜像是否存在\'
imageid=`docker images | grep jibdemo | awk \'{print $3}\'`
if [ "$imageid" != "" ];then
echo \'删除镜像\'
docker rmi -f $imageid
fi'''
}
}
登录harbor
stage('登录harbor'){
steps{
echo '登录harbor'
sh label: '', script: 'docker login -u admin -p Harbor12345 192.168.198.155:5000'
}
}
拉取镜像
stage('拉取镜像'){
steps{
echo '拉取镜像'
sh label: '', script: 'docker pull 192.168.198.155:5000/lagouedu/jibdemo:1.0'
}
}
运行容器
stage('运行容器'){
steps{
echo '运行容器'
sh label: '', script: 'docker run -itd --name jibdemo -p 8080:8080
192.168.198.155:5000/lagouedu/jibdemo:1.0'
}
}
完整Jenkinsfile文件
pipeline {
agent {
label 'jenkinsagent-154'
}
stages {
stage('检测环境') {
steps {
sh label: '', script: '''java -version
mvn -v
git version
docker -v'''
}
}
stage('拉取代码'){
steps{
echo 'gitlab拉取代码'
checkout([$class: 'GitSCM', branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'c8634952-4993-4455-b164-35427823144f', url:
'ssh://git@192.168.198.152:222/lagou/jibdemo.git']]])
}
}
stage('编译构建'){
steps{
echo '编译构建'
sh label: '', script: 'mvn clean package -Dmaven.test.skip=true
jib:build -DsendCredentialsOverHttp=true'
}
}
stage('删除容器'){
steps{
sh label: '', script: '''echo \'检查容器是否存在\'
containerid=`docker ps -a | grep -w jibdemo | awk \'{print $1}\'`
if [ "$containerid" != "" ];then
echo ‘容器存在,停止容器’
docker stop $containerid
echo ‘删除容器’
docker rm $containerid
fi'''
}
}
stage('删除镜像'){
steps{
sh label: '', script: '''echo \'检查镜像是否存在\'
imageid=`docker images | grep jibdemo | awk \'{print $3}\'`
if [ "$imageid" != "" ];then
echo \'删除镜像\'
docker rmi -f $imageid
fi'''
}
}
stage('登录harbor'){
steps{
echo '登录harbor'
sh label: '', script: 'docker login -u admin -p Harbor12345 192.168.198.155:5000'
}
}
stage('拉取镜像'){
steps{
echo '拉取镜像'
sh label: '', script: 'docker pull 192.168.198.155:5000/lagouedu/jibdemo:1.0'
}
}
stage('运行容器'){
steps{
echo '运行容器'
sh label: '', script: 'docker run -itd --name jibdemo -p 8080:8080 192.168.198.155:5000/lagouedu/jibdemo:1.0'
}
}
}
}
网友评论