使用maven进行集成docker打包成镜像以及推送到docker私服

先水几句

我不会开场啊…默默无闻的送码人.不是吧不是吧.现在还有人用maven打包,然后手动上传jar.然后进行部署吗?你out了.还是用Jenkins集成gitlab进行CI/CD.但是今天要说的是,使用maven进行集成docker插件进行打包镜像.(强行拉回正题,水文真的是除了敲代码之外极佳的爱好了 /捂脸)
docker的好处自然不比赘述.直接准备进入正题.
公司项目就准备使用docker+k8s进行项目部署.周一给我分了一个任务.就是将项目进行发布到docker,并且推送到自建的私服.搭建私服的步骤就不再说了.网上有很多优秀的博客.跟着博客走,搭建起来问题不大.
好,假装已经开好头了.接下来进入正题

docker插件

目前比较流行的maven-docker插件的话.有几种.spotify和fabric8io.我查阅了一些博客后,发现spotify是使用比较多的.所以今天,我们也是使用这款插件来进行打包.

实际使用

1.安装docker,并开启远程访问

怎么安装docker也不多说了.应该是比较简单了.正常安装后,正常启动.然后修改一下配置文件.开启docker的远程访问.

vi /lib/systemd/system/docker.service

然后会出现一段配置,如下图所示:
在这里插入图片描述
修改上面的框出来的地方.修改成我这样.
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
(我就知道程序员懒,直接复制给你们 )
然后 :wq 保存退出.
然后就刷新配置

systemctl daemon-reload

重启docker

service docker restart

然后呢,就自己curl测试一下,看是否成功了.

curl http://your's ip:2375/version

出现下面这段描述,就表示成功了.不然的话,就回头重新看看是不是哪里配置错了.比较简单.就不多说了.
在这里插入图片描述

maven添加docker插件

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <imageName>${project.artifactId}:latest</imageName>
                    <baseImage>java</baseImage>  <!--基于java构建-->
                    <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
                    <dockerHost>http://your's ip:2375</dockerHost>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <forceTags>true</forceTags>  <!--重复构建相同镜像则覆盖镜像-->
                </configuration>
            </plugin>

将上述代码写入项目的pom.xml文件中,添加到下的标签下.
然后maven import.如果是基于idea开发的话,那么在maven tabs中就可以出现这个插件了.
在这里插入图片描述
然后双击docker:builder 就可以实现打包到docker生成镜像images.
然后通过docker run xxx. 就可以将镜像生成容器,进行项目部署了.
或者使用命令行 mvn clean package docker:build 也可以进行操作

将docker命令绑定到maven命令

上面已经可以成功发布镜像到docker容器中了.如果不想这样操作.(因为麻烦),省事,想在maven打包的时候进行发布镜像呢.我们可以通过将docker的一些命令进行绑定到maven的某些命令上.
继续操作pom.xml.
使用标签可以让我们很容易将docker命令绑定到maven命令上.

			<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <executions>
                    <execution>
                        <id>build-image</id>     <!--定义一个执行命令的id-->
                        <phase>package</phase>   <!--绑定mvn的哪个命令-->
                        <goals>
                            <goal>build </goal>   <!--要执行的命令 -->
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <imageName>${project.artifactId}:latest</imageName>
                    <baseImage>java</baseImage>  <!--基于java构建-->
                    <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
                    <dockerHost>http://your's ip:2375</dockerHost>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <forceTags>true</forceTags>  <!--重复构建相同镜像则覆盖镜像-->
                </configuration>
            </plugin>

分别使用,,,,,来将docker命令绑定到maven的某个命令上.
这里我们操作了将docker:build 绑定到maven package命令上.
这样的话.我们就可以不用再进行点击maven package 然后又麻烦的再点击docker:build了.
命令行操作的话,也就简化成了 mvn clean package

推送到docker私服仓库

如果我们需要把镜像推送到仓库.首先我们需要给镜像打一个标签.tag(不细说了,因为我不会,假装大家伙都知道,我就是个菜鸡)否则打包会报错

在这里插入图片描述
这边的话呢.就需要我们先使用docker tag xxx 为该镜像打一个标签. 然后再使用docker push进行推送了.
但是上一小节说到可以将docker命令绑定到maven命令上.所以借助插件.也不需要我们进行手动的命令操作了. 上代码

			<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <executions>
                    <execution>
                        <id>build-image</id>     <!--定义一个执行命令的id-->
                        <phase>package</phase>   <!--绑定mvn的哪个命令-->
                        <goals>
                            <goal>build </goal>   <!--要执行的命令 -->
                        </goals>
                    </execution>
                    <execution>
                        <id>image-tag</id>
                        <phase>package</phase>
                        <goals>
                            <goal>tag</goal>      <!--tag命令,相当于docker的tag命令-->
                        </goals>
                        <configuration>
                            <image>${project.artifactId}</image>   <!--镜像名-->
                            <newName>192.168.170.9:5000/${project.artifactId}:latest</newName>   <!--打的标签名-->
                        </configuration>
                    </execution>
                    <execution>
                        <id>package-push</id>
                        <phase>package</phase>
                        <goals>
                            <goal>push</goal>    <!--相当于docker的push命令-->
                        </goals>
                        <configuration>
                            <imageName>私服 ip:私服端口/${project.artifactId}:latest</imageName>  <!--要push的镜像名-->
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <imageName>${project.artifactId}:latest</imageName>
                    <baseImage>java</baseImage>  <!--基于java构建-->
                    <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
                    <dockerHost>http://your's ip:2375</dockerHost>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <!--                        <serverId>docker-hub</serverId>     &lt;!&ndash;setting.xml中设置的id&ndash;&gt;-->
                    <forceTags>true</forceTags>  <!--重复构建相同镜像则覆盖镜像-->
                </configuration>
            </plugin>

解释一下呢,就是在maven的package命令继续绑定一个tag命令和一个push命令.看着比较简单. 就不细说.主要要注意的点就是push命令中的镜像名.前面加上私服ip和私服端口(别问我为什么,踩坑了) 不加上则是推送到docker.io中央仓库.
然后ip+端口后的名称和tag配置的名称保持一致,就可以了.

遗漏

插件也可以使用Dockerfile进行打包.这个也就是借助maven的可以将DockerFile读取进来进行执行.比较简单也就不细说了.
一篇博客,我感觉应该还是已经把整个流程说完了.其他的流程应该也就是照猫画虎.看着很简单,不过对我来说还是踩了不少坑啊.借此记录一番.同时还是要说一声.一定要多看文档.如果我刚开始的时候有仔细的查阅一下文档,可能可以更快更好的实现整个过程.插件在github.可以自己搜索查阅.
希望有说错说叉的地方.有大佬进行指点一下不胜感激.
借用大佬说的话结尾:你知道的东西越多,你不知道的东西就越多

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐