本文介绍如何使用Docker打包并部署Spring Boot多模块项目。
其中本文涉及的Docker的私库是用Nexus3搭建的。
使用Docker部署Spring Boot项目有三种方式
(1)使用 spring-boot-maven-plugin内置的build-image.
(2)使用 Google 的 jib-maven-plugin。
(3)使用 docker-maven-plugin。
以下是三种方式总结
方式 | 需要启动docker | 需要Dockerfile | fat jar |
---|---|---|---|
spring boot | 是 | 否 | 是 |
jib(Google) | 否 | 否 | 是 |
docker-maven | 是 | 是 | 否 |
这3个里面最方便的是 SpringBoot 原生的方式,什么都不需要自己做,直接就能用。缺点是需要本地安装并启动Docker,并且下载依赖用Google的,要翻墙,不然会打包失败。另外只能打fat jar,依赖和配置分离的不支持。
最有特点的是Jib,不需要本地安装 Docker和Dockerfile,可以直接推送到指定的仓库,而且使用起来也很简单。需要在pom.xml中配置。
看起来最麻烦的就是 docker-maven-plugin 这个插件了,需要写 Dockerfile和本地安装并启动Docker,还得添加配置,但是,实际上他是最好用的,因为前2个与网络环境有关系,即使你配置了 Docker 镜像,也会报错。
1、使用docker-maven-plugin
1.1 打包时同时打镜像
在pom.xml添加插件docker-maven-plugin依赖,docker要开放2375端口
xml
<build>
<finalName>demo-center</finalName>
<plugins>
<!--docker 插件-->
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.44.0</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--将插件绑定在package阶段,换言之,只要执行mvn package ,就会自动执行mvn docker:build-->
<!--等同于命令:mvn clean package docker:build -Dmaven.test.skip=true -->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- Docker远程管理地址-->
<dockerHost>tcp://172.28.168.223:2375</dockerHost>
<!--私服地址不使用可以不配置-->
<!--<registry>私服地址</registry>-->
<images>
<image>
<!--格式:<harbor_host>/<harbor_project_name>/<image_name>:<tag>-->
<name>172.28.168.223:5180/library/${project.artifactId}:${project.version}</name>
<build>
<args>
<!--为Dockerfile中提供参数-->
<TAR_FILE>target/${project.build.finalName}-release.tar.gz</TAR_FILE>
<APP_NAME>${project.build.finalName}</APP_NAME>
</args>
<!--dockerFile位置-->
<dockerFileDir>${project.basedir}</dockerFileDir>
</build>
</image>
</images>
</configuration>
</plugin>
</plugins>
</build>
编写Dockerfile(放在插件所在pom的目录)
text
FROM openjdk:8-jdk-alpine
# 指定时区
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo Asia/Shanghai > /etc/timezone
# 创建目录
RUN mkdir /app
# 添加阿里的arthas
# ADD arthas /app/arthas
# 插件变量
ARG TAR_FILE
ARG APP_NAME
# 复制tar包
COPY ${TAR_FILE} /app/${APP_NAME}.tar.gz
WORKDIR /app
# 解压tar
RUN tar -xvf ${APP_NAME}.tar.gz
# 标明开放端口,并不做真实映射
EXPOSE 9080
# 执行启动脚本
WORKDIR /app/${APP_NAME}/bin
ENTRYPOINT ["sh", "startup.sh"]
运行打包命令mvn package
到docker服务查看docker images
,发现项目的镜像已打包成功
1.2 maven deploy时推送镜像到harbor
在上面的插件配置中增加以下内容
完整的插件配置如下:
xml
<build>
<finalName>auth-center</finalName>
<plugins>
<!--docker 插件-->
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.44.0</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--将插件绑定在package阶段,换言之,只要执行mvn package ,就会自动执行mvn docker:build-->
<!--等同于命令:mvn clean package docker:build -Dmaven.test.skip=true -->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>push-image</id>
<!--将插件绑定在package阶段,换言之,只要执行mvn deploy ,就会自动执行mvn docker:push-->
<!--等同于命令:mvn clean deploy docker:push -Dmaven.test.skip=true -->
<phase>deploy</phase>
<goals>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- Docker远程管理地址-->
<dockerHost>tcp://172.28.168.223:2375</dockerHost>
<!-- Docker推送镜像仓库harbor地址 -->
<pushRegistry>http://172.28.168.223:5180</pushRegistry>
<!--harbor私有仓库的用户名与密码-->
<authConfig>
<username>admin</username>
<password>Harbor12345</password>
</authConfig>
<images>
<image>
<!--格式:<harbor_host>/<harbor_project_name>/<image_name>:<tag>-->
<name>172.28.168.223:5180/library/${project.artifactId}:${project.version}</name>
<build>
<args>
<!--为Dockerfile中提供参数-->
<TAR_FILE>target/${project.build.finalName}-release.tar.gz</TAR_FILE>
<APP_NAME>${project.build.finalName}</APP_NAME>
</args>
<!--dockerFile位置-->
<dockerFileDir>${project.basedir}</dockerFileDir>
</build>
</image>
</images>
</configuration>
</plugin>
</plugins>
</build>
运行mvn clean deploy
会同时把包上传到maven仓库、镜像上传到harbor
登录Harbor可以看到上传的镜像