使用docker-maven-plugin插件构建镜像并推送至私服Harbor

前言

如下所示,建议使用 Dockerfile Maven 插件,但该插件也停止维护更新了。因此先暂时使用docker-maven-plugin插件。


一、开启Docker服务器的远程访问

1.1 开启2375远程访问

默认的dokcer是不支持远程访问的,需要加点配置,开启Docker的远程访问

# 首先查看docker配置文件所在位置
systemctl status docker# 会输出如下内容:
● docker.service - Docker Application Container EngineLoaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)Active: active (running) since Thu 2020-12-17 14:22:23 CST; 18min agoDocs: http://docs.docker.comMain PID: 25113 (dockerd)

确定docker配置文件位置在:/etc/systemd/system/docker.service

然后编辑修改docker配置文件:

vi /lib/systemd/system/docker.service

找到包含ExecStart的这行,添加如下内容:

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \

其中,2375端口为docker远程服务端口,包含了docker可视化工具portainer,以及远程上传镜像的功能。

1.2 添加harbor镜像配置

编辑docker的配置文件:

vi /etc/docker/daemon.json
# 添加harbor镜像地址
{ "insecure-registries": ["192.168.0.20:81"]
}

1.3 重启docker服务

# 后台配置重新加载
systemctl daemon-reload 
# 重启docker服务
systemctl restart docker.service
# 此处可能会出现docker无法启动情况,可能是由于docker.service配置文件修改错误,重新修改一次然后重新执行上述命令即可#查看配置的端口号(2375)是否开启(非必要)
netstat -nlpt

1.4 验证是否开启成功

查看端口是否开启

#如果找不到netstat命令,使用yum install net-tools安装
[root@administrator ~]# netstat -antp | grep dockerd 
tcp6       0      0 :::2375                 :::*                    LISTEN      4514/dockerd  

直接curl看是否生效,测试通过localhost是否能使用Docker Engine API

curl http://127.0.0.1:2375/info
​curl http://localhost:2375/version
访问:http://ip:2375/version测试远程能否通过主机IP使用Docker Engine API

二、IDEA-Maven打包镜像

2.1 修改maven的配置文件settings.xml

在maven的配置文件中,添加harbor私服的用户名及密码:

 <servers><server><id>harbor</id><username>harbor</username><password>123456</password><configuration><email>123456@aliyun.com</email></configuration></server>
</servers>

2.2 修改SpringBoot项目中的pom.xml

添加属性配置,属性配置,在后面的插件配置里有引用这个:

  • docker.repostory 是docker私服地址,harbor配置完默认端口就是80,可以不带端口号。但是我将之改成81了
  • docker.registry.name 即是在harbor中配置的镜像仓库名,必须一致!这里我配的是test,因为harbor中配置的镜像仓库名也是test。
<properties><!--docker插件--><!-- docker私服地址,Harbor配置完默认地址就是80,默认不带端口号。但是我这里是81 --><docker.repostory>192.168.10.11:81</docker.repostory><!--项目名,需要和Harbor中的项目名称保持一致 --><docker.registry.name>test</docker.registry.name>
</properties>

3.3 docker-maven-plugin插件配置

  • serverId 指定之前在maven的settings.xml中配置的server节点,这样maven会去找其中配置的用户名密码和邮箱
  • registryUrl 指定上面配置的properties属性,即是harbor私服的访问url,注意我设置的使用81端口,默认是80端口
  • imageName 指定上传harbor私服的镜像名,必须和harbor上的url、镜像仓库名保持一致。其中的docker.registry.name就是上面配置的properties属性

3.3.1 方式一:纯插件操作方式构建镜像

<build><plugins><!-- 解决资源文件的编码问题 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><configuration><encoding>UTF-8</encoding></configuration></plugin><!-- maven打source包 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><executions><execution><id>attach-sources</id><!--<phase>verify</phase>--><goals><!--jar, jar-no-fork--><goal>jar</goal></goals></execution></executions></plugin><!-- spring Boot在编译的时候, 是有默认JDK版本的, 这里自定义指定JDK版本 --><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>11</source><target>11</target><encoding>UTF-8</encoding></configuration></plugin><!--拷贝依赖jar到指定的目录--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory><overWriteReleases>false</overWriteReleases><overWriteSnapshots>false</overWriteSnapshots><overWriteIfNewer>true</overWriteIfNewer></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><!-- maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容, --><addClasspath>true</addClasspath><!-- 指定依赖包所在目录。 --><classpathPrefix>lib/</classpathPrefix><!-- 指定MANIFEST.MF中的Main-Class, --><mainClass>org.fiend.SpringBootDockerApp</mainClass><useUniqueVersions>false</useUniqueVersions></manifest></archive><excludes><!--<exclude>*.properties</exclude>--><!--<exclude>*.yml</exclude>--><!--<exclude>*.xml</exclude>--><!--<exclude>org/fiend/controller/HomeController.class</exclude>--></excludes></configuration></plugin><!-- ===================================== docker ================================== --><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.2</version><executions><execution><id>build-image</id><!--用户只需执行mvn package, 就会自动执行mvn docker:build--><phase>package</phase><goals><goal>build</goal></goals></execution></executions><configuration><!--maven的 settings.xml文件添加如下配置:<server><id>harbor</id><username>admin</username><password>admin123</password><configuration><email>admin@example.org</email></configuration></server>--><serverId>harbor</serverId><registryUrl>http://${docker.repostory}</registryUrl><!--必须配置dockerHost标签(除非配置系统环境变量DOCKER_HOST)--><dockerHost>http://192.168.31.133:2375</dockerHost><!--指定基础镜像jdk1.8--><!--<baseImage>jdk:1.8</baseImage>--><baseImage>k8s-harbor:10001/my-project/openjdk11:jre-11.0.12_7-alpine</baseImage><!--Building image 192.168.0.20/demo1--><imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version}</imageName><!--指定标签 这里指定的是镜像的版本,默认版本是latest--><imageTags><imageTag>${project.version}</imageTag></imageTags><!-- 指定 Dockerfile 路径--><!--镜像制作人本人信息 --><!--<maintainer>1090239782@qq.com</maintainer>--><!--切换到工作目录--><workdir>/home</workdir><!--执行容器运行的命令,添加如下指令, 打包成镜像后会自动启动容器--><!--<runs>--><!--    <run>sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories</run>--><!--    <run>apk update</run>--><!--    <run>apk add tzdata</run>--><!--    <run>cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime</run>--><!--    <run>echo "Asia/Shanghai" > /etc/timezone</run>--><!--</runs>--><cmd>["java", "-version"]</cmd><!--${project.build.finalName}.jar是打包后生成的jar包的名字--><entryPoint>["java", "-jar", "-Xms896m", "-Xmx896m", "${project.build.finalName}.jar"]</entryPoint><!--<exposes>--><!--    &lt;!&ndash; 指定容器内部端口, 可以不写, 不写默认是项目中pom文件的端口 &ndash;&gt;--><!--    <expose>8080</expose>--><!--</exposes>--><!-- jar包位置--><resources><resource><targetPath>/home</targetPath><!-- target目录下--><directory>${project.build.directory}</directory><!--通过jar包名找到jar包--><include>${project.build.finalName}.jar</include></resource><resource><targetPath>/home/lib</targetPath><!-- target目录下--><directory>${project.build.directory}/lib</directory><!--<include>*.jar</include>--></resource></resources></configuration></plugin></plugins></build>

接下来只要先点击clean清除之前的所有打包的文件,然后再点击package打包文件即可完成镜像的构建,真正的一键部署

由于将 <phase>package</phase> 注释掉了,因此需要执行 docker:build 命令构建镜像:

如果要将镜像推送至Harbor仓库,执行docker:push命令:

删除docker镜像命令(不是删除Harbor中的镜像), docker:removeImage:

重新构建镜像时,记得先执行此命令,删除原来的镜像。

到此镜像构建成功,接下来使用Idea的Docker插件,创建容器跑起来(或者去Docker机器执行命令行)

通过ip访问

此种方式,直接通过Maven的package命令,即可实现镜像的制作,但是要推送镜像到harbor私服,还需执行docker:push,即:

点击push,将镜像推送到harbor私服中

3.3.2 方式二:结合Dockerfile文件构建镜像

<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.0.0</version><configuration><serverId>my-hub</serverId><registryUrl>http://${docker.repostory}</registryUrl><!--必须配置dockerHost标签(除非配置系统环境变量DOCKER_HOST)--><dockerHost>http://192.168.10.11:2375</dockerHost><!--Building image 192.168.10.11/demo1--><imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version}</imageName><!-- 指定 Dockerfile 路径--><dockerDirectory>${basedir}/</dockerDirectory><!-- jar包位置--><resources><resource><targetPath>/ROOT</targetPath><!-- target目录下--><directory>${project.build.directory}</directory><!--通过jar包名找到jar包--><include>${pack-name}</include></resource></resources></configuration>
</plugin>

那么Dockerfile文件中的jar包名相应需要修改:

FROM java:8
WORKDIR /ROOT
ADD /ROOT/demo1-2.jar /ROOT/
ENTRYPOINT ["java", "-jar", "demo1-2.jar"]

点击pakage打包,target 上生成了springboot工程的jar包

完了之后,点击docker bulid 构建工程镜像

然后点击push,将镜像推送到harbor私服中

3.4 docker-maven-plugin操作容器

此部分内容参考:

  • 掘金:MacroZheng:还在手动部署SpringBoot应用?试试这个自动化插件! - 掘金
  • docker-maven-plugin不仅可以操作镜像,还可以操作容器,比如我们以前需要使用如下Docker命令来运行容器;
docker run -p 8080:8080 —name mall-tiny-fabric \
—link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/mall-tiny-fabric/logs:/var/logs \
-d 192.168.3.101:5000/mall-tiny/mall-tiny-fabric:0.0.1-SNAPSHOT
  • 现在我们只需在插件中配置即可,在<image>节点下添加<run>节点可以定义容器启动的行为:
<!--在<image>节点下添加<run>节点可以定义容器启动的行为, 该配置不会自动启动打包后的镜像-->
<image><!--定义容器启动行为--><run><!--设置容器名,可采用通配符--><containerNamePattern>${project.artifactId}</containerNamePattern><!--设置端口映射--><ports><port>8600:8600</port></ports><!--设置容器间连接--><!--<links>--><!--    <link>mysql:db</link>--><!--</links>--><!--设置容器和宿主机目录挂载--><!--<volumes>--><!--    <bind>--><!--        <volume>/etc/localtime:/etc/localtime</volume>--><!--        <volume>/mydata/app/${project.artifactId}/logs:/var/logs</volume>--><!--    </bind>--><!--</volumes>--></run>
</image>
  • 之后直接使用docker:start命令即可启动了;
# mvn docker:start
[root@linux-local mydata]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95ce77c0394b 192.168.3.101:5000/mall-tiny/mall-tiny-fabric:0.0.1-SNAPSHOT “java -jar /mall-tin…” 32 seconds ago Up 31 seconds 0.0.0.0:8080->8080/tcp mall-tiny-fabric
  • 停止容器使用docker:stop命令即可;
mvn docker:stop
  • 删除容器使用docker:remove命令,是不是很方便!
mvn docker:remove

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/101141.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php函数

函数是什么&#xff1f; 函数(function)是一段完成指定任务的已命名代码块。函数可以遵照给它的一组值或参数完成特定的任务&#xff0c;并且可能返回一个值。在PHP中有两种函数&#xff1a;自定义函数与系统函数。 函数就是可以完成固定功能的语句或语句集合&#xff0c;可以单…

Mac发现有的软件不能上网的破解之法

1、Mac上打开终端 terminal &#xff0c;获取 root 权限。 sudo -i 2、编辑 hosts 文件 vim /private/etc/hosts 3、找到被禁止软件的数据请求域名&#xff0c;然后删除相关行&#xff0c;快捷件dd&#xff0c;然后:wq保存退出 比如百度 127.0.0.1 pan.baidu.com ##sec 印…

前端编辑页面修改后和原始数据比较差异

在软件研发过程中&#xff0c;会遇到很多编辑页面&#xff0c;有时编辑页面和新增页面长的基本上一样&#xff0c;甚至就是一套页面供新增和编辑共用。编辑页面的场景比较多&#xff0c;例如&#xff1a; 场景一、字段比较多&#xff0c;但实际只修改了几个字段&#xff0c;如…

【网络层协议】ARP攻击与欺骗常见的手段以及工作原理

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、ARP攻击的常见手段 第一种&#xff1a;IP…

罗勇军 →《算法竞赛·快冲300题》每日一题:“超级骑士” ← DFS

【题目来源】http://oj.ecustacm.cn/problem.php?id1810http://oj.ecustacm.cn/viewnews.php?id1023https://www.acwing.com/problem/content/3887/【题目描述】 现在在一个无限大的平面上&#xff0c;给你一个超级骑士。 超级骑士有N种走法&#xff0c;请问这个超级骑士能否…

python刷小红书流量(小眼睛笔记访问量),metrics_report接口,原理及代码,以及x-s签名验证2023-08-21

一、什么是小眼睛笔记访问量 如下图所示&#xff0c;为笔记访问量。 二、小眼睛笔记访问量接口 1、url https://edith.xiaohongshu.com/api/sns/web/v1/note/metrics_report 2、payload data{"note_id": note_id,"note_type": note_type,"report_t…

SOFARPC(笔记)

文章目录 一、快速开始1.1 SOFARPC1.2 基于SOFABoot 二、注册中心三、通讯协议2.1 Bolt基本发布调用方式超时控制协议泛化调用序列化协议自定义线程池 2.2 RESTful基本使用 2.3 其他协议四、架构 附录 官方样例下载地址-sofa-boot-guides 可查看 SOFARPC 方式快速入门 一、快…

HTML5+CSS3+JS小实例:环形文字动画特效

实例:环形文字动画特效 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

深度解读波卡 2.0:多核、更有韧性、以应用为中心

本文基于 Polkadot 生态研究院整理&#xff0c;有所删节 随着波卡 1.0 的正式实现&#xff0c;波卡于 6 月 28 日至 29 日在哥本哈根举办了年度最重要的会议 Polkadot Decoded 2023&#xff0c;吸引了来自全球的行业专家、开发者和爱好者&#xff0c;共同探讨和分享波卡生态的…

C语言好题解析(四)

目录 选择题一选择题二选择题三选择题四选择题五编程题一 选择题一 已知函数的原型是&#xff1a; int fun(char b[10], int *a); 设定义&#xff1a; char c[10];int d; &#xff0c;正确的调用语句是&#xff08; &#xff09; A: fun(c,&d); B: fun(c,d); C: fun(&…

Hbuilder打包后推流拉流都没有画面

背景&#xff1a;我在使用数据线连接手机测试的时候&#xff0c;推流拉流都是正常的额&#xff0c;云打包后&#xff0c;跳转到视频接听页面&#xff0c;就是空白的。 解决方法&#xff1a; manifest.json->APP模块配置->直播推流权限勾上&#xff08;推流&#xff09; 还…

leetcode 516. 最长回文子序列(JAVA)题解

题目链接https://leetcode.cn/problems/longest-palindromic-subsequence/description/?utm_sourceLCUS&utm_mediumip_redirect&utm_campaigntransfer2china 目录 题目描述&#xff1a; 暴力递归&#xff1a; 动态规划&#xff1a; 题目描述&#xff1a; 给你一个…

docker之Consul环境的部署

目录 一、Docker consul的介绍 1.1 template模板(更新) 1.2 registrator&#xff08;自动发现&#xff09; 1.3 agent(代理) 二.consul的工作原理 三.Consul的特性 四.Consul的使用场景 五.搭建Consul的集群 5.1 需求 5.2 部署consul 5.3 主服务器部署[192.168.19.10…

RunnerGo性能测试时如何从数据库获取数据

我们在做性能测试或者场景测试时往往需要从数据库中获取一些真实的系统数据让我们配置的场景更加贴合实际。而RunnerGo也是在最近的大版本更新中推出连接数据库功能&#xff0c;本篇文章也给大家讲解一下具体的操作方法和实际应用场景。 配置数据库 首先进入RunnerGo页面&…

家庭装修设计施工团队进度小程序开发演示

传统装修企业获客难、获客成本高、竞争激烈&#xff0c;我们也是基于整个装修市场整体的需求&#xff0c;从用户角度出发帮助装修设计企业设计制作这款小程序。可以让传统装修企业搭上互联网的快车&#xff0c;形成线上获客裂变&#xff0c;降低获客成本提高客户信任度和签单率…

在mac下,使用Docker安装达梦数据库

前言&#xff1a;因为业务需要安装达梦数据库 获取官网下载tar包&#xff08;达梦官网的下载页面https://www.dameng.com/list_103.html&#xff09;&#xff0c;或者通过命令 一、下载tar包 命令下载&#xff1a;wget -O dm8_docker.tar -c https://download.dameng.com/eco/…

Php“牵手”淘宝商品SKU信息数据采集方法,淘宝API接口申请指南

淘宝天猫商品属性sku信息接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取商品的详细信息&#xff0c;包括商品的标题、描述、图片&#xff0c;销量&#xff0c;sku信息等信息。在电商平台的开发中&#xff0c;商品属性接口API是非常常用的 API&#x…

皮爷咖啡基于亚马逊云科技的数据架构,加速数据治理进程

皮爷咖啡&#xff08;Peet’s Coffee&#xff09;是美国精品咖啡品牌&#xff0c;于2017年进入中国&#xff0c;为中国消费者带来传统经典咖啡饮品&#xff0c;并特别呈现更加丰富的品质咖啡饮品体验。通过深入应用亚马逊云科技云原生数据库产品Amazon Redshift以及Amazon DMS等…

Docker 三要素

文章目录 Docker 简介Docker客户端Docker服务器Docker 镜像Docker 容器 Docker 简介 学习完容器的相关概念&#xff0c;开始学习docker的核心组件分别是Docker客户端、Docker服务器、Docker镜像、Docker容器、仓库。 学习之前&#xff0c;我们先思考一个问题&#xff0c;目前…

关于ros工作空间devel下setup.bash的理解

在创建了ros的工作空间之后 在工作空间的devel文件夹中存在几个setup.*sh形式的环境变量设置脚本 使用source命令运行这些脚本文件&#xff0c;则工作空间的环境变量设置可以生效&#xff08;如可以找到该工作空间内的项目&#xff09;。 source devel/setup.bash 设置环境变量…