当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2023-03-22
当初为了学习Docker和自动化运维方面的知识,在家里的机器中也部署了一整套运维工具。不得不说这Docker镜像几乎就是磁盘杀手,就一个完整的openj9 jdk镜像就已经差不多500MB了。还好不

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

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

  • 砍掉Gitlab,自己本机开发本机部署搞什么Gitlab,没多大意义磁盘一坏该没的还是没了;
  • 砍掉Nexus,代码版本库都没有了还要代码包管理库干什么;
  • 砍掉Jenkins,都可以用Maven直接命令打包完成,就不需要Jenkins做持续集成了;
  • 砍掉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 2375nc: connectx to localhost port 2375 (tcp) failed: Connection refusednc: 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进行构建并上传私库了。

上一篇:JDK源码——try catch finally异常
下一篇:没有了
网友评论