手动部署SpringBoot应用比较繁琐,且容易出错,合理使用相关插件能提高工作效率,降低出错概率。本文主要介绍三种自动化构建Docker镜像的Maven插件使用,开发工具使用idea。
- io.fabric8.docker-maven-plugin
- com.spotify.dockerfile-maven-plugin
- org.springframework.boot.spring-boot-maven-plugin [SpringBoot官方插件]
以下分别介绍这三种插件的使用方法
io.fabric8.docker-maven-plugin
- 添加插件依赖包在pom.xml添加以下代码,当前最新的版本为0.37.0
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.37.0</version>
<plugin>
</plugins>
</build>
添加后在idea 右侧工具栏可以看到相关的插件命令
- 添加生成docker镜像的配置项,在以上plugin节点下添加即可
<configuration>
<!-- Docker 推送镜像仓库地址-->
<pushRegistry>http://12.78.18.15:5000</pushRegistry>
<images>
<image>
<!--推送到私有镜像仓库,镜像名需要添加仓库地址-->
<name>12.78.18.15:5000/${project.name}:${project.version}</name>
<!--定义镜像构建行为-->
<build>
<dockerFileDir>${project.basedir}</dockerFileDir>
</build>
<!--定义容器启动行为-->
<run>
<!--设置容器名,可采用通配符-->
<containerNamePattern>${project.artifactId}</containerNamePattern>
<!--设置端口映射-->
<ports>
<port>8082:8082</port>
</ports>
<!--设置容器间连接-->
<links>
<link>mysql:db</link>
</links>
<!--设置容器和宿主机目录挂载-->
<volumes>
<bind>
<volume>/etc/localtime:/etc/localtime</volume>
</bind>
</volumes>
</run>
</image>
</images>
</configuration>
私有镜像仓库搭建可参考:https://www.jianshu.com/p/bbbf93b29b78
dockerfile相关的配置这里使用Dockerfile文件
- Dockerfile内容
# 该镜像需要依赖的基础镜像
FROM lpicanco/java11-alpine
# 将当前maven目录生成的文件复制到docker容器的/目录下
COPY target/fabric-docker-1.0-SNAPSHOT.jar /
# 声明服务运行在8082端口
EXPOSE 8082
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/fabric-docker-1.0-SNAPSHOT.jar"]
# 指定维护者的名字
MAINTAINER climber
- 插件使用
-
生成镜像
生成镜像前要先将项目打包,否则会找不到jar文件而报错
双击"docker:builder" 即可完成镜像的生成
- 推送镜像到私有仓库
在上传前请再先登录私有仓库
docker login --username=lipandeng 12.7.18.150:5000
然后双击"docker:push"即可
-
容器操作
容器中有关联mysql容器,所以先启动mysql容器,然后双击“docker:start/stop/remove”来实现容器的启动/停止/销毁操作
- 其它
也可在生产包的时候同时生成镜像文件,添加如下配置
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
这样就不用单独再双击“docker:build”了,在双击package,生成包成功后接着就生成了新的镜像
com.spotify.dockerfile-maven-plugin
Spotify官方已经不再推荐使用 docker-maven-plugin ;推荐使用 com.spotify.dockerfile-maven-plugin
-
配置pom.xml
在pom.xml添加 com.spotify.dockerfile-maven-plugin 插件配置<properties> <docker.image.prefix>12.78.18.15:5000</docker.image.prefix> </properties> <build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <executions> <!--运行mvn package时,会自动执行build目标,构建Docker镜像; 运行mvn deploy命令时,会自动执行push目标,将Docker镜像push到Docker仓库--> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>${docker.image.prefix}/spotify-dockerfile</repository> <tag>${project.version}</tag> <!--在settings.xml中配置server--> <useMavenSettingsForAuth>true</useMavenSettingsForAuth> <!--可以指定一个或多个变量,传递给Dockerfile,在Dockerfile中通过ARG指令进行引用--> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> </plugins> </build>
idea 右侧栏即可显示相关操作命令
-
编写Dockerfile
这里说明下插件特有的新功能,可使用pom.xml中指定的变量# 此处的JAR_FILE正式pom.xml中指定的buildArgs->JAR_FILE ARG JAR_FILE COPY target/${JAR_FILE} /app.jar
-
构建docker images
使用该插件构建Docker镜像,需要有一个安装好的Docker运行环境,且需要在运行该插件的机器上定义DOCKER_HOST环境变量,配置访问Docker的URL
linux 下配置export DOCKER_HOST=tcp://localhost:2375
window下配置环境变量,自行配置即可
接下来,就可以运行maven命令来构建Docker镜像了,使用idea右侧工具栏响应的命令双击即可mvn package 或者 mvn dockerfile:build
-
推送到私有镜像仓库
作者使用的非docker hub,而是自己搭建的,且需要用户验证,pom.xml配置如下
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
同时在maven的settings.xml中的servers下增加一个server配置:
<servers> <server> <id>12.78.182.15:5000</id> <username>lipandeng</username> <password>123456</password> </server> </servers>
注意server.id即是上边配置的docker.image.prefix
push 镜像mvn dockerfile:push
查看镜像库即可验证上传是否成功
org.springframework.boot.spring-boot-maven-plugin
子项目:springboot-docker
springboot 2.3.X+ , maven plugin支持将应用程序打包成Docker镜像,无需额外的Dockerfile,只需要一条命令即可,不需要任何改动,这里我们用最新版的2.5.3
使用方法:
- 配置pom.xml
<properties> <docker.image.prefix>12.78.18.15:5000</docker.image.prefix> </properties> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <image> <!--镜像名称--> <name>${docker.image.prefix}/${project.name}:${project.version}</name> <!--生成镜像后是否推送到镜像仓库--> <publish>true</publish> </image> <docker> <!--docker环境远程管理地址,非镜像仓库地址--> <host>http://localhost:2375</host> <!--不使用TLS访问--> <tlsVerify>false</tlsVerify> <!--Docker推送镜像仓库配置--> <publishRegistry> <!--推送镜像仓库用户名--> <username>test</username> <!--推送镜像仓库密码--> <password>123456</password> <!--推送镜像仓库地址--> <url>http://${docker.image.prefix}</url> </publishRegistry> </docker> </configuration> </plugin>
- 生成镜像&推送到私有镜像仓库
mvn spring-boot:build-image
也可在idea,直接双击SpringBoot插件的build-image命令即可一键打包并推送到镜像仓库
生成镜像工程中由于需要从github下载文件,大概率会不成功,需要多次尝试。
最后在本地和私有镜像仓库均有docker镜像,表示buiild-image已经完成。
总结
- io.fabric8.docker-maven-plugin 比较灵活(可dockerfile也可pom.xml配置)、支持直接操作容器,且仍在持续更新,推荐使用。
- com.spotify.dockerfile-maven-plugin 支持dockerfile 近两年无更新,不支持操作容器。
- org.springframework.boot.spring-boot-maven-plugin springboot官方插件,无需额外安装,但需要从github下载相关层文件,失败率高,需要多次尝试。