我不会开场啊…默默无闻的送码人.不是吧不是吧.现在还有人用maven打包,然后手动上传jar.然后进行部署吗?你out了.还是用Jenkins集成gitlab进行CI/CD.但是今天要说的是,使用maven进行集成docker插件进行打包镜像.(强行拉回正题,水文真的是除了敲代码之外极佳的爱好了 /捂脸)
docker的好处自然不比赘述.直接准备进入正题.
公司项目就准备使用docker+k8s进行项目部署.周一给我分了一个任务.就是将项目进行发布到docker,并且推送到自建的私服.搭建私服的步骤就不再说了.网上有很多优秀的博客.跟着博客走,搭建起来问题不大.
好,假装已经开好头了.接下来进入正题
目前比较流行的maven-docker插件的话.有几种.spotify和fabric8io.我查阅了一些博客后,发现spotify是使用比较多的.所以今天,我们也是使用这款插件来进行打包.
怎么安装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
出现下面这段描述,就表示成功了.不然的话,就回头重新看看是不是哪里配置错了.比较简单.就不多说了.
<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的某些命令上.
继续操作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
如果我们需要把镜像推送到仓库.首先我们需要给镜像打一个标签.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> <!–setting.xml中设置的id–>-->
<forceTags>true</forceTags> <!--重复构建相同镜像则覆盖镜像-->
</configuration>
</plugin>
解释一下呢,就是在maven的package命令继续绑定一个tag命令和一个push命令.看着比较简单. 就不细说.主要要注意的点就是push命令中的镜像名.前面加上私服ip和私服端口(别问我为什么,踩坑了) 不加上则是推送到docker.io中央仓库.
然后ip+端口后的名称和tag配置的名称保持一致,就可以了.
插件也可以使用Dockerfile进行打包.这个也就是借助maven的可以将DockerFile读取进来进行执行.比较简单也就不细说了.
一篇博客,我感觉应该还是已经把整个流程说完了.其他的流程应该也就是照猫画虎.看着很简单,不过对我来说还是踩了不少坑啊.借此记录一番.同时还是要说一声.一定要多看文档.如果我刚开始的时候有仔细的查阅一下文档,可能可以更快更好的实现整个过程.插件在github.可以自己搜索查阅.
希望有说错说叉的地方.有大佬进行指点一下不胜感激.
借用大佬说的话结尾:你知道的东西越多,你不知道的东西就越多