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

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

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

  1. 砍掉Gitlab,自己本机开发本机部署搞什么Gitlab,没多大意义磁盘一坏该没的还是没了;
  2. 砍掉Nexus,代码版本库都没有了还要代码包管理库干什么;
  3. 砍掉Jenkins,都可以用Maven直接命令打包完成,就不需要Jenkins做持续集成了;
  4. 砍掉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>[email protected]</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进行构建并上传私库了。

猜你喜欢

转载自blog.csdn.net/kida_yuan/article/details/129683441