Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式

前置说明

  • 最为原始的打包方式
  • spring-boot-maven-plugin插件
  • jib-maven-plugin插件
  • dockerfle-maven-plugin插件

最为原始的方式

也就是使用Docker的打包命令去打包,麻烦,我这里不多说。

spring-boot-maven-plugin插件打包

SpringBoot自己内置了一个Docker镜像打包工具,在spring-boot-starter-parent中,我们无需多余的设置。

优点:不需要写DockerFile,Spring建议的安全、内存、性能等问题都不需要管。

jib-maven-plugin插件

来自Google的一款打包插件。

优点:不需要本地安装Docker,也不需要写DockerFileJib 可以直接推送到指定的Docker仓库。

dockerfle-maven-plugin插件

需要写DockerFile也需要本地Docker环境,但是恰恰是最好用的,最稳定的,最自由把控的。

优点:稳定,不受网络限制,DockerFile自己写,自由度很高,想怎么改怎么改,个人推荐这个。

SpringBoot打包镜像

我们无需引入依赖,SpringBoot自带了。

打包命令:

mvn spring-boot:build-image

但是我不喜欢用命令,IDEA都给你可视化了,何必敲命令呢?而且命令还需要设置Maven环境变量。

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第1张图片

就和打JAR包一样,我们点一下就可以。

但是SpringBoot的打包会因为网络(不通畅),而导致失败。

打包完成是这样:

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第2张图片

我们去查看本地镜像有没有。

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第3张图片

运行测试一下。

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第4张图片

说实话我运行失败了,因为我项目里面有一下东西它不好搞,比如微信支付的证书文件和KEY文件,一般的SpringBoot项目可以,但是我这个恰恰不行,我需要自己写DockerFile去创建卷映射才好。

JIB打包镜像

配置插件依赖:

        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.8.1version>
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                    <encoding>UTF-8encoding>
                configuration>
            plugin>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <version>2.3.7.RELEASEversion>
                <configuration>
                    <mainClass>com.toemail.smtp.ToEmailApplicationmainClass>
                configuration>
                <executions>
                    <execution>
                        <id>repackageid>
                        <goals>
                            <goal>repackagegoal>
                        goals>
                    execution>
                executions>
            plugin>
            <plugin>
                <groupId>com.google.cloud.toolsgroupId>
                <artifactId>jib-maven-pluginartifactId>
                <version>3.3.1version>
                <configuration>
                    
                    <from>
                        
                        <image>java:8u172-jre-alpineimage>
                    from>
                    <to>
                        
                        <image>demo:${project.version}image>
                    to>
                    
                    <container>
                        
                        <jvmFlags>
                            <jvmFlag>-Xms4gjvmFlag>
                            <jvmFlag>-Xmx4gjvmFlag>
                        jvmFlags>
                        
                        <ports>
                            <port>8899port>
                        ports>
                    container>
                configuration>
            plugin>

我这里用的目前最新版本。

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第5张图片

另外,很多配置我都写了注释,如果你想了解更多可以查一下JIB的相关文档。

命令

mvn compile com.google.cloud.tools:jib-maven-plugin:2.3.0:dockerBuild

IDEA

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第6张图片

报错

如果出现这错误:

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第7张图片

就添加以下配置:

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第8张图片

还是报错

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第9张图片

好像是它这个官方仓库需要认证登录,我靠,我真不喜欢这破插件,垃圾(暗暗骂道)。

突然解决

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第10张图片

这个镜像,需要指定具体仓库URL地址的。

但是我现在这个不行,所以我要换一个阿里的仓库。

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第11张图片

改成了这样:

<to>
  <image>registry.cn-qingdao.aliyuncs.com/jibjava/jibfirstimage>
to>

阿里云有时候私有仓库需要密码,也可以换成其他私有仓库。

		
            registry.cn-qingdao.aliyuncs.com/jibjava/jibfirst
            
              阿里云账号
              阿里云密码
            
          

XML标签详解

from:拉取的镜像的配置,默认为gcr.io/distroless/java
to:要生成的镜像的配置
image:拉取或生成的镜像名称
auth: 认证信息,分别为用户名和密码
container: 容器的属性
jvmFlgs: JVM 容器的参数,和 Dockerfile 的 ENTRYPOINT作用相同
mainClass: 启动类限定名
args: main 方法的传入参数
ports: 容器暴露的端口,和 Dockerfile 的EXPOSE作用相同

成功

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第12张图片

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第13张图片

DockerFileMaven打包

DockerFile

FROM c9katayama/java8:latest
# 创建目录
RUN mkdir -p /dashboard
# 拷贝文件
COPY dashboard.jar /dashboard/dashboard.jar
# 暴露端口
EXPOSE 8099
# 启动命令
CMD ["java", "-jar", "/dashboard/dashboard.jar"]

DockerFile不多说,请自行学习。

依赖展示:

			<plugin>
                <groupId>com.spotifygroupId>
                <artifactId>docker-maven-pluginartifactId>
                <version>0.4.11version>
                <dependencies>
                    <dependency>
                        <groupId>javax.activationgroupId>
                        <artifactId>javax.activation-apiartifactId>
                        <version>1.2.0version>
                        <scope>compilescope>
                    dependency>
                dependencies>
                <configuration>
                    <imageName>${docker.image.prefix}/${project.artifactId}imageName>
                    <dockerDirectory>src/main/dockerdockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/targetPath>
                            <directory>${project.build.directory}directory>
                            <include>${project.build.finalName}.jarinclude>
                        resource>
                    resources>
                    <imageTags>
                        <imageTag>${project.version}imageTag>
                        <imageTag>latestimageTag>
                    imageTags>
                configuration>
            plugin>

但是这一段插件的XML别用,因为这是rocketmq可视化控制台的官方写的,你可以自己配置。

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第14张图片

正常的一般插件的XML就这样:

		<plugin>
            <groupId>com.spotifygroupId>
            <artifactId>docker-maven-pluginartifactId>
            <version>1.0.0version>
            <configuration>
                <imageName>${project.artifactId}:${project.version}imageName>
                
                <dockerDirectory>${basedir}/dockerdockerDirectory> 
                
                <resources>
                    <resource>
                        <targetPath>/ROOTtargetPath>
                        <directory>${project.build.directory}directory>
                        <include>${project.build.finalName}.jarinclude>
                    resource>
                resources>
            configuration>
        plugin>

其余配置可以自行浏览器搜索一下:docker-maven-plugin配置项

构建命令

mvn package

尝试打包

我这里直接IDEA点击打包,讨厌命令。

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第15张图片

注意:需要本地有Docker,并且开启远程连接,WindowsDocker安装小简上一篇文章写过的,可以看看,Linux的没写。

好用多了,一次成功。

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第16张图片

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_第17张图片

还是这个最好用,推荐!!!

总结

小简选择的是最后一个,第一个也还行吧,但是Google那个不需要本地有Docker环境,第一个我还是开着魔法(梯子)打包的,最后一个挺好的。

看情况选择的,很久没更新啦!越来越懒了,嘿嘿,下篇再见。

你可能感兴趣的:(其他技术,Java,java,spring,boot,docker)