Docker笔记(七)使用Docker部署Spring Boot项目

本文介绍如何使用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可以看到上传的镜像

相关推荐
gadiaola1 分钟前
【SSM面试篇】Spring、SpringMVC、SpringBoot、Mybatis高频八股汇总
java·spring boot·spring·面试·mybatis
茫忙然14 分钟前
【WEB】Polar靶场 Day7 详细笔记
笔记
麦兜*1 小时前
Spring Boot 集成Reactive Web 性能优化全栈技术方案,包含底层原理、压测方法论、参数调优
java·前端·spring boot·spring·spring cloud·性能优化·maven
天上掉下来个程小白1 小时前
MybatisPlus-06.核心功能-自定义SQL
java·spring boot·后端·sql·微服务·mybatisplus
今天背单词了吗9802 小时前
算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·笔记·考研·算法·蒙特卡洛算法
逐花归海.2 小时前
『 C++ 入门到放弃 』- 多态
开发语言·c++·笔记·程序人生
小马爱打代码3 小时前
Spring Boot:将应用部署到Kubernetes的完整指南
spring boot·后端·kubernetes
致***锌3 小时前
期权交易完整版教程简介
笔记
棱镜研途3 小时前
学习笔记丨卷积神经网络(CNN):原理剖析与多领域Github应用
图像处理·笔记·学习·计算机视觉·cnn·卷积神经网络·信号处理
Jiangnan_Cai4 小时前
Linux 系统 docker 部署 Dify
linux·docker·大模型·dify