1、优化前:
目前构建docker镜像都是先执行mvn clean package打包之后,将target目录下的jar包放到服务器上,再通过Dockerfile去build成镜像,步骤多,而且每次都需要登录服务器进行操作,十分麻烦。
2、优化后:
在Spring Boot项目中引入docker-maven-plugin进行相关配置,之后就可以在项目根目录下执行mvn clean package docker:build -DpushImage,就可以在服务器上的docker生成镜像,并且推送到远程仓库上,十分方便,不用每次都登录服务器进行操作。
在进行项目引入docker-maven-plugin之前,先进行docker的配置,使我们能够通过2375端口访问到docker。
Docker的2375端口是默认关闭的,如果我们要使用到它,就需要进行以下的配置:
1、安装有docker的服务器,修改docker.service文件:
vi /etc/systemd/system/docker.service
具体文件所在地,得看你安装docker的位置,如果不知道自己安装在哪里了,执行以下指令去查找:
sudo find / -name docker.service
2、修改docker.service
找到文件以下内容:
ExecStart=/usr/bin/dockerd
修改为:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
3、重启docker服务
systemctl daemon-reload
systemctl restart docker
4、查看端口是否开启
netstat -anp | grep 2375
如果没有被占用,就什么都不显示
5、如果通过以上配置,发现2375没有开启的话,那么请尝试修改daemon.json文件:
vi /etc/docker/daemon.json
具体文件所在地,得看你安装docker的位置,如果不知道自己安装在哪里了,执行以下指令去查找:
sudo find / -name daemon.json
在配置文件添加上hosts项:
{
"insecure-registries":["xx.xx.xx.xx:5000"],
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
通过以上操作,基本可以打开2375端口,并且可以通过该端口连接上docker,如果还是不行,那么请通过网络查找原因及解决方法了哈。
注意:以上开发的2375端口访问docker的方式是不安全的,如果想要安全的访问,请自行百度了解。
一般我们的镜像除了放在docker上,还可以将其推送到docker registry上,其他服务器上的docker就可以在该docker registry上拉取镜像。
关于docker registry的安装及配置,请参考我的另外一篇博客,这里就不重复去写了:
https://blog.csdn.net/Staba/article/details/124550444?spm=1001.2014.3001.5502
在父工程pom.xml配置如下,如果你不愿意将插件在父工程的pom.xml中进行管理与配置,那么就将以下配置去掉pluginManagemt标签,然后放在子工程中的pom.xml中即可
dev
true
${project.version}
dev
http://开发环境服务器ip:2375
开发环境docker registry服务器ip:5000
test
${project.version}
test
http://测试环境服务器ip:2375
测试环境docker registry服务器ip:5000
prod
${project.version}
prod
http://生产环境服务器ip:2375
生产环境docker registry服务器ip:5000
org.springframework.boot
spring-boot-maven-plugin
${spring-boot.version}
com.spotify
docker-maven-plugin
1.2.2
${docker.host}
${docker.registry}/${project.artifactId}:${imageVersion}-${tag.suffix}
${project.basedir}/src/main/docker
/
${project.build.directory}
${project.build.finalName}.jar
${docker.registry}
3
2000
如果指定了
xxx
your username
your password
you email
2、子工程引入插件,因为docker相关配置都在父工程中写好了,子工程中无须重复写,只需引入插件
org.springframework.boot
spring-boot-maven-plugin
com.spotify
docker-maven-plugin
3、在
FROM java
VOLUME /tmp
ENV LANG C.UTF-8
COPY *.jar app.jar
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Djava.util.Arrays.useLegacyMergeSort=true", "-jar","app.jar"]
4、在子项目根路径上执行mvn clean package -P dev -DimageVersion='1.0.9' docker:build –DpushImage指令,即可将target目录下的jar包构建成镜像,并且推送到docker registry上。
参数解析:
-P dev -> 由于我们在Profile标签中指定了不同环境中使用不同服务器上的docker,所有由该参数指定我们哪个环境的配置生效,默认是dev生效(配置了)。
-DimageVersion='1.0.9' -> 在配置中我们这个属性默认值是当前项目版本,通过该参数指定我们打包镜像的tag最终版本,因为懒的每次去改pom中的version标签,于是自定义一个属性,通过命令行传入版本
docker:build -> 打包完jar之后就会指定docker build指令,将jar包构建成镜像
–DpushImage –> 构建完镜像之后就会将镜像推送到docker registry仓库上
-DpushImageTag -> 如果在中指定了tag,且在中没有:tag信息,使用pushImageTag去推送标签指定的tags镜像
当然,如果你懒的去敲docker相关的指令,可以与maven插件的各执行周期绑定,那么就请在executions中进行绑定配置。
通过执行以上的指令,就可以在控制台上看到镜像build的过程以及推送的过程。