使用docker-maven-plugin插件构建镜像并推送至私服Harbor
lipiwang 2024-11-22 17:18 5 浏览 0 评论
前言
如下所示,建议使用 Dockerfile Maven 插件,但该插件也停止维护更新了。因此先暂时使用docker-maven-plugin插件。
一、开启Docker服务器的远程访问
1.1 开启2375远程访问
默认的dokcer是不支持远程访问的,需要加点配置,开启Docker的远程访问
# 首先查看docker配置文件所在位置
systemctl status docker
# 会输出如下内容:
● docker.service - Docker Application Container Engine
Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-12-17 14:22:23 CST; 18min ago
Docs: http://docs.docker.com
Main 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>-->
<!-- <!– 指定容器内部端口, 可以不写, 不写默认是项目中pom文件的端口 –>-->
<!-- <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:https://juejin.im/post/6868060821927723021
- 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
相关推荐
- ubuntu单机安装open-falcon极度详细操作
-
备注:以下操作均由本人实际操作并得到验证,喜欢的同学可尝试操作安装。步骤一1.1环境准备(使用系统:ubuntu18.04)1.1.1安装redisubuntu下安装(参考借鉴:https://...
- Linux搭建promtail、loki、grafana轻量日志监控系统
-
一:简介日志监控告警系统,较为主流的是ELK(Elasticsearch、Logstash和Kibana核心套件构成),虽然优点是功能丰富,允许复杂的操作。但是,这些方案往往规模复杂,资源占用高,...
- 一文搞懂,WAF阻止恶意攻击的8种方法
-
WAF(Web应用程序防火墙)是应用程序和互联网流量之间的第一道防线,它监视和过滤Internet流量以阻止不良流量和恶意请求,WAF是确保Web服务的可用性和完整性的重要安全解决方案。它...
- 14配置appvolume(ios14.6配置文件)
-
使用AppVolumes应用程序功能,您可以管理应用程序的整个生命周期,包括打包、更新和停用应用程序。您还可以自定义应用程序分配,以向最终用户提供应用程序的特定版本14.1安装appvolume...
- 目前流行的缺陷管理工具(缺陷管理方式存在的优缺点)
-
摘自:https://blog.csdn.net/jasonteststudy/article/details/7090127?utm_medium=distribute.pc_relevant.no...
- 开源数字货币交易所开发学习笔记(2)——SpringCloud
-
前言码云(Gitee)上开源数字货币交易所源码CoinExchange的整体架构用了SpringCloud,对于经验丰富的Java程序员来说,可能很简单,但是对于我这种入门级程序员,还是有学习的必要的...
- 开发JAX-RPC Web Services for WebSphere(下)
-
在开发JAX-RPCWebServicesforWebSphere(上)一文中,小编为大家介绍了如何创建一个Web服务项目、如何创建一个服务类和Web服务,以及部署项目等内容。接下来小编将为大...
- CXF学习笔记1(cxf client)
-
webservice是发布服务的简单并实用的一种技术了,个人学习了CXF这个框架,也比较简单,发布了一些笔记,希望对笔友收藏并有些作用哦1.什么是webServicewebService让一个程序可...
- 分布式RPC最全详解(图文全面总结)
-
分布式通信RPC是非常重要的分布式系统组件,大厂经常考察的Dubbo等RPC框架,下面我就全面来详解分布式通信RPC@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》...
- Oracle WebLogic远程命令执行0day漏洞(CVE-2019-2725补丁绕过)预警
-
概述近日,奇安信天眼与安服团队通过数据监控发现,野外出现OracleWebLogic远程命令执行漏洞最新利用代码,此攻击利用绕过了厂商今年4月底所发布的最新安全补丁(CVE-2019-2725)。由...
- Spring IoC Container 原理解析(spring中ioc三种实现原理)
-
IoC、DI基础概念关于IoC和DI大家都不陌生,我们直接上martinfowler的原文,里面已经有DI的例子和spring的使用示例《InversionofControlContainer...
- Arthas线上服务器问题排查(arthas部署)
-
1Arthas(阿尔萨斯)能为你做什么?这个类从哪个jar包加载的?为什么会报各种类相关的Exception?我改的代码为什么没有执行到?难道是我没commit?分支搞错了?遇到问题无法在...
- 工具篇之IDEA功能插件HTTP_CLENT(idea2021插件)
-
工具描述:Java开发人员通用的开发者工具IDEA集成了HTTPClient功能,之后可以无需单独安装使用PostMan用来模拟http请求。创建方式:1)简易模式Tools->HTTPCl...
- RPC、Web Service等几种远程监控通信方式对比
-
几种远程监控通信方式的介绍一.RPCRPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.meth...
- 《github精选系列》——SpringBoot 全家桶
-
1简单总结1SpringBoot全家桶简介2项目简介3子项目列表4环境5运行6后续计划7问题反馈gitee地址:https://gitee.com/yidao620/springbo...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)