SpringBoot项目使用docker-maven-plugin插件构建docker镜像以及推送到docker hub或docker registry私服
本文介绍的方式是使用docker-maven-plugin的方式构建SpringBoot的docker镜像以及推送到私服或docker hub服务器上。
我们知道docker可将应用程序和基础设施层隔离,可更快地打包、测试以及部署应用程序。本文主要介绍SpringBoot项目如何构建docker镜像以及推送到私服或者docker hub服务器上。
本文介绍的方式是使用docker-maven-plugin的方式构建SpringBoot的docker镜像以及推送到私服或docker hub服务器上。
Docker环境配置
本地环境配置
docker-maven-plugin 插件默认连接本地 Docker 地址为:localhost:2375,如果我们本地开发环境有docker环境并准备使用本地开发环境的docker,只需要先设置下本地开发环境的环境变量。
DOCKER_HOST=tcp://<host>:2375
服务器环境配置
如果使用CentOS服务器上的docker环境 (CentOS上安装docker环境),则需要在服务器上修改 docker 配置,开启允许远程访问 docker 的功能,开启方式很简单,修改 /usr/lib/systemd/system/docker.service 文件,ExecStart中加入如下内容:
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
修改好配置后,使用如下命令重启docker生效:
systemctl daemon-reload
systemctl restart docker
IDEA测试docker连接
IDEA 中我们可以测试服务器上的docker环境是否连接成功,打开 File->Settings->Build,Execution,Deployment->Docker
,然后配置一下 Docker 的远程连接地址:
配置一下 Docker 的地址,配置完成后,提示 Connection successful 信息,表示 Docker 已经连接上了。
SpringBoot项目引入docker-maven-plugin插件
pom.xml配置
项目中引入docker-maven-plugin插件,在pom.xml引入插件并做相应的配置:
<project>
<!-- other setting-->
<build>
<plugins>
<plugin>
<!-- https://mvnrepository.com/artifact/com.spotify/docker-maven-plugin -->
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<executions>
<!-- 当mvn执行install操作的时候,执行docker的build和push -->
<execution>
<id>buildAndPush</id>
<phase>install</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 连接到 带docker环境的linux服务器 编译image -->
<dockerHost>http://192.168.**.***:2375</dockerHost>
<!-- push到 docker hub 开始 -->
<!-- serverId 这个是配置在maven的setting.xml中私服的登录账户信息-->
<serverId>docker-hub</serverId>
<retryPushCount>1</retryPushCount>
<retryPushTimeout>2000</retryPushTimeout>
<registryUrl>https://index.docker.io/v1/</registryUrl>
<!-- 格式:私有仓库/镜像名称:版本号, 如果要执行push操作, 那么镜像名称必须为私有仓库为前缀,不然无效。-->
<imageName>flyduck128/${project.artifactId}</imageName>
<!-- push到 docker hub 结束 -->
<!-- 指定tag版本 -->
<imageTags>
<imageTag>v1.0</imageTag>
</imageTags>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<!-- optionally overwrite tags every time image is built with docker:build -->
<forceTags>true</forceTags>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.zip</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
Docker命令可以绑定到maven各阶段命令中。该示例配置中我们在execution上将docker的build和push命令绑定在了maven的install阶段命令中。当springboot项目执行maven的install命令阶段,会执行docker的build和push命令。
如果需要推送到docker hub或者私服,还需要在本地的maven目录的setting.xml中配置相应的server:
<server>
<id>docker-hub</id>
<username>flyduck128</username>
<password>***</password>
<configuration>
<email>***@qq.com</email>
</configuration>
</server>
如果我们不需要推送到docker hub或者私服,可以不配置docker的push命令以及相应的推送配置:
<!-- push到 docker hub 开始 -->
<!-- serverId 这个是配置在maven的setting.xml中私服的登录账户信息-->
<serverId>docker-hub</serverId>
<retryPushCount>1</retryPushCount>
<retryPushTimeout>2000</retryPushTimeout>
<registryUrl>https://index.docker.io/v1/</registryUrl>
<!-- 格式:私有仓库/镜像名称:版本号, 如果要执行push操作, 那么镜像名称必须为私有仓库为前缀,不然无效。-->
<imageName>flyduck128/${project.artifactId}</imageName>
<!-- push到 docker hub 结束 -->
Dockerfile文件配置
Dockerfile文件放入项目的/src/main/docker目录,在上面的pom.xml中dockerDirectory节点中保持一致。Dockerfile文件配置如下:
FROM openjdk:8
MAINTAINER flyduck 'flyduck@flyduck.com'
ENV APP_HOME=/usr/local/app
ENV PROJECT_HOME=${APP_HOME}/springboot-docker-1.0-SNAPSHOT
COPY springboot-docker-1.0-SNAPSHOT.zip springboot-docker.zip
RUN mkdir -p ${APP_HOME} && mv springboot-docker.zip ${APP_HOME}
RUN cd ${APP_HOME} && unzip springboot-docker.zip && rm -rf springboot-docker.zip
RUN chmod 777 ${PROJECT_HOME}/bin/dockerrun.sh
EXPOSE 7003
ENTRYPOINT sh ${PROJECT_HOME}/bin/dockerrun.sh
Dockerfile镜像制作逻辑如下:
- 项目的运行依赖 Java 环境,所以镜像基于 openjdk:8镜像来构建。
- 容器中创建/user/local/app目录,将打包的zip文件拷贝到容器中,并移动到/user/local/app目录,然后解压zip文件到/user/local/app目录。
- 将程序的端口通过EXPOSE暴露出来。
- 最后就是配置一下启动命令,由于我们springboot项目使用的zip打包发布的方式,所以启动的方式和默认springboot项目有些区别。这里我们单独将启动配置放入dockerrun.sh文件,然后通过运行dockerrun.sh文件的方式启动程序。
dockerrun.sh运行程序配置如下:
# app home
APP_HOME=/usr/local/app/springboot-docker-1.0-SNAPSHOT
# java jar
PROJECT_NAME=${APP_HOME}/springboot-docker-1.0-SNAPSHOT.jar
#spring init load application properties or yml
CONF_FILE=${APP_HOME}/config/application.yml
# java opts.
JAVA_OPTS="-Xms64m -Xmx64m -Xmn64m"
#pid file
PID_CONF=${APP_HOME}/pid/process.pid
java ${JAVA_OPTS} -Djava.ext.dirs=${APP_HOME}/lib:$JAVA_HOME/jre/lib/ext -Dspring.config.location=${CONF_FILE} -jar ${PROJECT_NAME}
构建镜像以及推送到服务器
在IDEA中直接点击install,会先打包springboot项目,然后在dockerHost配置的服务器上构建镜像,最后推送到registerUrl配置的docker私服或者hub docker上。
项目install完成后,登录linux服务器,可以看到镜像已经构建成功:
登录docker hub网站,可以看到镜像已经推送到docker hub上:
总结
本文主要介绍如何在IDEA中将SpringBoot项目构建docker镜像并推送到私服或者docker hub上,本文通过使用docker-maven-plugin插件的方式,连接docker环境的linux服务器构建docker镜像,并推送到docker hub上。如果需要推送到私服上,只需要将pom.xml中推送的配置修改私服的配置即可。示例代码已经上传至Gitee上,感兴趣的小伙伴可以直接获取查看。
参考
Maven 插件之 docker-maven-plugin 的使用
Github上docker-maven-plugin源码地址
docker与Spring boot的集成:docker-maven-plugin使用
Maven 插件之 docker-maven-plugin 的使用
docker-maven-plugin的github地址
使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上 - 码农教程
更多推荐
所有评论(0)