【Java】Vert.x使用Maven构建Docker镜像并上传私库

  • Post author:
  • Post category:java


当初为了学习Docker和自动化运维方面的知识,在家里的机器中也部署了一整套运维工具。不得不说这Docker镜像几乎就是磁盘杀手,就一个完整的openj9 jdk镜像就已经差不多500MB了。还好不搞Nightly Build,不然一下子空间就全没了。

随着后面做的尝试越来越多,整套环境运行起来越来越臃肿(加了Nexus、加了Gitlab、加了Jenkins、加了Portainer……),这时我不得不考虑更加轻量化的解决方案。直到我发现原来可以通过Maven的Pom配置打包成Docker镜像时,我决定大刀阔斧做了以下修改:

  1. 砍掉Gitlab,自己本机开发本机部署搞什么Gitlab,没多大意义磁盘一坏该没的还是没了;

  1. 砍掉Nexus,代码版本库都没有了还要代码包管理库干什么;

  1. 砍掉Jenkins,都可以用Maven直接命令打包完成,就不需要Jenkins做持续集成了;

  1. 砍掉Portainer,这个可砍可不砍,纯粹是因为资源不够了所以砍掉了而已;

一套操作下来发现,居然还能战几年。果然是“穷”则变变则通。

要实现Maven构建Docker镜像关键还在于Pom文件,我这边的Pom文件是这样写的:

<properties>
	...
	
	<!-- docker参数 --><!-- 这里是maven docker组件的版本号 -->
	<docker-maven.version>0.36.0</docker-maven.version><!-- 这里是镜像仓库的仓库名称 -->
	<docker.image.registry>vtx</docker.image.registry><!-- 这里是目标仓库的ip和端口地址 -->
	<target-ip.repo>192.168.100.152:5000</target-ip.repo>
	<!-- docker私有仓库机器的tcp2375端口指向 -->
	<docker-host.name>tcp://192.168.100.152:2375</docker-host.name><!-- 这里是私有仓库用户名 -->
	<docker.username>yzh</docker.username><!-- 这里是私有仓库密码 -->
	<docker.password>Pwd</docker.password>
    ...
</properties>
...

<build><plugins>
    ... 
    <plugin><groupId>io.fabric8</groupId><artifactId>docker-maven-plugin</artifactId><version>${docker-maven.version}</version><configuration><!-- 远程docker守护进程url --><dockerHost>${docker-host.name}</dockerHost><!-- 远程push权限 --><authConfig><push><username>${docker.username}</username><password>${docker.password}</password></push></authConfig><images><image><!-- 镜像名称(这里注意要包含远程目标仓库的访问前缀) --><!-- 例子中的是192.168.100.152:5000,不然它会找docker.io上面的 --><name>${target-ip.repo}/${docker.image.registry}/${project.artifactId}:${project.version}</name><!-- 构建内容 --><build><!-- 基础镜像(采用了jdk11 openj9版本) --><from>adoptopenjdk:11-openj9</from><!-- 作者名称 --><maintainer>yzh0623@outlook.com</maintainer><!-- 镜像开放端口 --><ports><port>8197</port></ports><!-- 镜像内挂载目录 --><volumes><volume>/tmp</volume></volumes><!-- 镜像内工作目录 --><workdir>/usr/local/share</workdir><!-- dockerfile中jar包启动参数 --><entryPoint><exec><arg>java</arg><arg>-jar</arg><arg>${project.artifactId}-${project.version}.jar</arg><arg>-XX:MaxGCPauseMillis=200</arg><arg>-Xloggc:/tmp/${project.artifactId}/gc.log</arg><arg>-XX:+PrintGCDetails</arg><arg>-XX:+PrintGCDateStamps</arg><arg>-XX:+UnlockExperimentalVMOptions</arg><arg>-XX:+UseG1GC</arg><arg>-Djava.security.egd=file:/dev/./urandom</arg><arg>-XX:+UseCGroupMemoryLimitForHeap</arg><arg>-XX:MaxRAMFraction=1</arg><arg>-XX:+HeapDumpOnOutOfMemoryError</arg><arg>-cluster</arg></exec></entryPoint><!-- 原始包位置与镜像的前期准备 --><assembly><!-- 上传模式 --><mode>dir</mode><!-- 上传目录 --><targetDir>/usr/local/share</targetDir><!-- jar包描述 --><descriptorRef>artifact</descriptorRef></assembly></build></image></images></configuration><!-- docker操作执行 --><executions><!-- 镜像打包(本地产生镜像) --><execution><id>push-image</id><!-- 对应maven指令package --><phase>package</phase><!-- 执行docker命令build\push --><goals><!-- 先build,后push --><goal>build</goal><goal>push</goal></goals><configuration><imageName>${target-ip.repo}/${docker.image.registry}/${project.artifactId}:${project.version}</imageName></configuration></execution></executions></plugin></plugins></build>复制代码

(这里我是针对Vert.x应用进行直接Docker构建,如果是Springboot项目还需要进行一些调整。)在一开始的时候可能各位还会报出以下这个问题,如下图:

Failed to execute goal io.fabric8:docker-maven-plugin:0.33.0:build (build-image) on project phw2-bi-vtx: Cannot create docker access object: Connect to 127.0.0.1:2375 [/127.0.0.1] failed: Connection refused (Connection refused) -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal io.fabric8:docker-maven-plugin:0.33.0:build (build-image) on project phw2-bi-vtx: Cannot create docker access object
复制代码

这个问题有可能是因为2375端口(Docker对外开发端口)没有开启导致的,通过一下语句查看一下2375端口是否有打开:

# 查看2375端口是否开启
nc -vz -w 2 localhost 2375

nc: connectx to localhost port 2375 (tcp) failed: Connection refused
nc: connectx to localhost port 2375 (tcp) failed: Connection refused
复制代码

这个时候需要通过启动特殊镜像进行端口开启,如下图:

docker run -it -d \
--name=socat \
-p 2375:2375 \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart=always \
bobrik/socat:latest \
TCP4-LISTEN:2375,fork,reuseaddr \
UNIX-CONNECT:/var/run/docker.sock
复制代码

接下来就能够正常使用Maven进行构建并上传私库了。

作者:kida_yuan

链接:

https://juejin.cn/post/7212808687982673975



版权声明:本文为BASK2312原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。