【Java】Vert.x使用Maven构建Docker镜像并上传私库
当初为了学习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 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进行构建并上传私库了。
转载自:https://juejin.cn/post/7212808687982673975