【构建docker镜像之插件篇】使用插件实战演示:docker-maven-plugin和jib-maven-plugin
1、说明:
docker容器化部署是非常流行的,Java应用如果要运行在docker环境,就要制作包含该应用的docker镜像,可以手动使用dockerfile和docker-compose制作镜像,也可以使用插件docker-maven-plugin和jib-maven-plugin制作镜像;本文只讲这两种插件的使用以及需要注意的一些细节;以springboot项目为例,详细介绍下这两种用法!
2、jib-maven-plugin实现方式
2.1 搭建springboot项目
搭建过程在此不过多演示,如果想自己尝试,或者查看我的源码,可以去我的仓库下载:springboot-docker
2.2 编写pom.xml配置
<properties>
<java.version>1.8</java.version>
<!--通过registry搭建的私有镜像仓库地址-->
<registryUrl>192.168.100.64:5000</registryUrl>
</properties>
<!--使用jib插件-->
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.3.0</version>
<configuration>
<!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字-->
<from>
<!--使用私有仓库镜像,tag是8-->
<image>${registryUrl}/java:8</image>
<!-- 也可以使用docker hub提供的,有时下载不下来 -->
<!-- <image>docker.io/library/java:8</image>-->
</from>
<to>
<!--镜像名称和tag,其中使用了mvn内置变量${project.version},表示当前工程的version-->
<image>${registryUrl}/dxiaodang/jib:${project.version}</image>
<!--或者也可以使用tags标签单独指定version -->
<!--<tags>
<tag>${project.version}</tag>
</tags>-->
</to>
<!--私服是http不是https,默认jib不推送到非https的私服,私服添加,公服不添加-->
<allowInsecureRegistries>true</allowInsecureRegistries>
<!--容器相关的属性-->
<container>
<!--jvm内存参数-->
<jvmFlags>
<jvmFlag>-Xms4g</jvmFlag>
<jvmFlag>-Xmx4g</jvmFlag>
<jvmFlag>-Duser.timezone=Asia/Shanghai</jvmFlag>
</jvmFlags>
<!--暴露的端口-->
<ports>
<port>8080</port>
</ports>
<!--设置镜像的创建时间为系统时间-->
<useCurrentTimestamp>true</useCurrentTimestamp>
</container>
</configuration>
</plugin>
️ 注意点(本文的精髓)️
- from节点设置基础镜像,获取的方式有三种:
- 使用openjdk官方镜像
- 使用自己的私有仓库的镜像,并将base镜像放入到私有仓库;私有仓库搭建请参考:docker搭建私有镜像仓库
- 使用docker hub提供的
- 镜像打包方式分为三种:
- build:镜像推送到远程仓库;可以推送到docker hub上,也可以推送到自己的私有仓库;
- 如果镜像要推送到自己的私有仓库,镜像名称必须满足私有仓库的要求:registry_url:port/ImageName:tag
- 设置本地docker服务支持http:修改docker配置文件:/etc/docker/daemon.json,在json中增加内容"insecure-registries": ["192.168.100.64:5000"]
- dockerBuild:镜像存入当前镜像仓库,
- buildTar:镜像生成tar文件,保存在项目的target目录下,在任何docker环境执行 docker load < jib-image.tar即可导入到本地镜像仓库
- dockerBuild和buildTar打包的前提是本地需要安装docker,看了好多博客都没有提到这点,导致打包一直报错
- 将jib打包与mvn构建的生命周期绑定
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
- 镜像生成时间:<useCurrentTimestamp>标签,可以设置镜像的创建时间,但是2.3.0版本的插件是没有这个参数的,要不然就报错了,亲测
2.3 验证测试
2.3.1 个人私有仓库是否存在?

2.3.2 私有仓库pull镜像

2.3.3 启动

2.3.3 测试:curl localhost:8098

2、docker-maven-plugin实现方式
2.1 搭建springboot项目
搭建过程在此不过多演示,如果想自己尝试,或者查看我的源码,可以去我的仓库下载:springboot-docker
2.2 编写pom.xml配置
<!--docker-maven-plugin插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的镜像名-->
<imageName>dangbo/${project.name}</imageName>
<!--指定tag标签-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 指定 Dockerfile 路径 ${project.basedir}:项目根路径下-->
<dockerDirectory>${project.basedir}</dockerDirectory>
<!--指定远程 docker api地址-->
<dockerHost>http://192.168.100.64:2375</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--jar 包所在的路径 此处配置的 即对应 target 目录-->
<directory>${project.build.directory}</directory>
<!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!-- 以下两行是为了docker push到DockerHub使用的。 -->
<!--<serverId>docker-hub</serverId>-->
<!--<registryUrl>https://index.docker.io/v1</registryUrl>-->
</configuration>
</plugin>
2.3 编写Dockerfile文件
# 项目所依赖的镜像
FROM java:8
# 将maven构建好的jar添加到镜像中
ADD target/*.jar app.jar
# 暴露的端口号,用于标记信息,和容器内程序保持一致,使运维人员知道容器都要暴露哪些端口
EXPOSE 31945
# 镜像所执行的命令
ENTRYPOINT ["java","-jar","/app.jar"]
️ 注意点️
- docker需要开启2375端口,提供外部访问docker:修改docker配置文件并重启
- 配置文件:
/lib/systemd/system/docker.service - 重启命令:
systemctl restart docker - 命令:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
2.4 打包镜像
由于将插件绑定在mvn package上,直接执行命令即可:mvn clean package -Dmaven.test.skip=true
2.5 验证测试
2.5.1 查看镜像是否存在

2.5.2 启动

2.5.3 测试接口

本次分享就到此结束,如果有不对的地方,请大家评论区留言,谢谢!!!
【构建docker镜像之插件篇】使用插件实战演示:docker-maven-plugin和jib-maven-plugin的更多相关文章
- Docker镜像管理基础篇
Docker镜像管理基础篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker Images Docker镜像还有启动容器所需要的文件系统及其内容,因此,其用于创建并启 ...
- Docker 镜像之进阶篇
笔者在<Docker 基础 : 镜像>一文中介绍了 docker 镜像的基本用法,本文我们来介绍 docker 镜像背后的技术原理. 什么是 docker 镜像 docker 镜像是一个只 ...
- IDEA推送docker镜像到私服/利用dockerfile-maven-plugin插件在springboot中上传镜像到远程的docker服务器、远程仓库
利用dockerfile-maven-plugin插件在springboot中上传镜像到远程仓库 这篇文章讲解在开发工具中把打包好的jar编译成docker镜像,上传到远程的docker服务 ...
- docker镜像的获取、查看、删除、docker镜像管理、docker容器管理
在不想弄乱本地及其环境下该如何进行系软件的安装? 下载安装docker工具 获取该软件的docker镜像(你以后想要用各种工具,基本都能够搜索docker search nginx:版本号到合适的镜像 ...
- 关于 Docker 镜像的操作,看完这篇就够啦 !(下)
紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...
- 构建docker镜像
一.通过docker commit命令构建镜像 docker commit 构建镜像可以想象为是将运行的镜像进行重命名另存一份.我们先创建一个容器,并在容器里做出修改,就像修改代码一样,最后再将修改提 ...
- 使用Visual Studio 2017构建.Net Core的Docker镜像
1 Docker 镜像优化 微软在为开发人员生成 Docker 镜像时,提供以下三种主要方案: 用于开发 .NET Core 应用的 镜像 用于构建生成 .NET Core 应用的 镜像 用于运行 ...
- 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些.前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I ...
- [转] 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
原文地址:https://www.cnblogs.com/tianshifu/p/8127837.html 前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少 ...
- Docker镜像的构建(五)
目录 构建镜像 1.使用 commit 命令构建 1.1 运行一个要进行修改的容器 1.2 安装 Apache 软件包 1.3 提交定制容器 2.使用 Dockerfile 构建 2.1 我们的第一个 ...
随机推荐
- Intellij IDEA 开启 RunDashboard
1. 关闭 Intellij IDEA (2018以下的版本无效),打开 workspace.xml 找到 RunDashboard 节点.添加如果配置 <option name=" ...
- FileLock 多进程文件锁
FileLock是文件锁,它能保证同一时间只有一个进程(程序)能够修改它,或者都只可以读,这样就解决了多进程间的同步文件,保证了安全性.但是需要注意的是,它进程级别的,不是线程级别的,他可以解决多个进 ...
- JAVA性能优化- IntelliJ插件:java内存分析工具(JProfiler)
JProfiler(Java性能分析神器) v11.1.4 下载 安装目录不要有空格 安装成功后,在 Intellij 里面选择对应的 jprofiler.exe 路径 点击下图JProfiler图标 ...
- 解决ttrss(Tiny Tiny RSS)中fever无法使用的问题
问题描述 在ttrss刚搭建好的时候,进行了如下操作: 随后键入了密码(fever密码) 最后,按照官方给的提示,在Fluent Reader中测试,弹出如下错误信息: 解决方案 复制官方给的链接,删 ...
- 开发 | Git 提交规范
以下是 \(commit\) 提交规范,主要是在提交代码时标识本次提交的属性 feat: 新功能(feature) fix: 修补bug docs: 文档(documentation) style: ...
- SpringBoot 项目实战 | 瑞吉外卖 Day04
该系列将记录一份完整的实战项目的完成过程,该篇属于第四天 案例来自B站黑马程序员Java项目实战<瑞吉外卖>,请结合课程资料阅读以下内容 该篇我们将完成以下内容: 文件上传下载 新增菜品 ...
- Canal 组件简介与 vivo 帐号实践
互联网应用随着业务的发展,部分单表数据体量越来越大,应对服务性能与稳定的考虑,有做分库分表.数据迁移的需要,本文介绍了vivo帐号应对以上需求的实践. 一.前言 Canal 是阿里巴巴开源项目,关于什 ...
- 深度学习基础课:“判断性别”Demo需求分析和初步设计(下2)
大家好~我开设了"深度学习基础班"的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序 线上课程资料: 本节课录像回放1 本节课录像回 ...
- JS单线程的理解
一.首先需要区分几个概念: 1. 进程和线程的概念: 进程:指在系统中运行的一个应用程序,目的就是担当分配系统资源(CPU时间.内存等)的基本单位 线程:系统分配处理器时间资源的基本单元,建立在进程的 ...
- freeswitch的多租户模式
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 现在的VOIP服务越来越倾向于云端服务,包括呼叫中心云服务,线路云平台. 而云平台对多个客户的服务就需要做好隔离,包括数据隔离.线路 ...