docker系列-第七篇docker构建springboot应用

niugang0920      2022-05-17     133

关键词:

1.基于Dockerfile构建SpringBoot镜像

1.1准备工作

将SpringBoot项目通过maven打成jar包

mvn clean package #使用maven打包项目

1.2使用Dockerfile构建镜像

  • step1 在存放jar所在目录下创建Dockerfile文件

    touch Dockerfile
  • step2 编辑Dockerfile增加以下内容

    FROM java:8
    MAINTAINER  niugang<863263957@qq.com>
    RUN mkdir -p /opt/springapp
    ADD   demo-0.0.1.jar  /opt/springapp
    EXPOSE 8088
    ENTRYPOINT ["java","-jar","/opt/springapp/demo-0.0.1.jar"]
  • step3 构建镜像

    docker build -t springbootdemo:1.0 .
  • step4 启动容器

    docker run -d  -p 8088:8088 --name sb springbootdemo:1.0 

    在启动容器是可以添加数据卷,程序日志映射到宿主机,方便后期排查问题

    注意:在启动过程中,一直起不起来,然后通过前台启动查看了日志。

    报了如下错误:

    WARNING: IPv4 forwarding is disabled. Networking will not work.

    解决:

    #需要做如下配置

    解决办法:

    vim/etc/sysctl.conf

    net.ipv4.ip_forward=1 #添加这段代码

    #重启network服务

    systemctl restart network && systemctl restart docker

    #查看是否修改成功 (备注:返回1,就是成功)

    [root@docker-node2 ~]# sysctl net.ipv4.ip_forward
    net.ipv4.ip_forward = 1

  • step5 调用你的springboot应用,验证其是否正确

2.使用Maven插件构建Docker镜像

Maven是一个强大的项目管理与构建工具。如果可以使用Maven构建Docker镜像,以下几款Maven的Docker插件比较常用。
插件名称 官方地址
docker-maven-plugin https://github.com/spotify/docker-maven-plugin

上面插件可以从github看到此插件已经不再推荐了。推荐使用

https://github.com/spotify/dockerfile-maven 具体操作步骤上面有介绍

docker-maven-plugin https://github.com/fabric8io/docker-maven-plugin
docker-maven-plugin https://github.com/bibryam/docker-maven-plugin

2.1直接配置方式

  • step 1

    在你的springboot应用的pom.xml中增加如下配置

     <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.4.13</version>
                    <configuration>
                        <!--用于指定镜像名称-->
                        <imageName>niugang/springboot:3.0</imageName>
                        <!--用于指定基础镜像,类似于Dockerfile中的FROM指令。-->
                        <baseImage>java</baseImage>
                        <!--类似于Dockerfile的ENTRYPOINT指令-->
                        <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                        <resources>
                            <resource>
                                <!--将打包后的资源文件复制到该目录-->
                                <targetPath>/</targetPath>
                                <!--需要复制的文件所在目录,maven打包的应用jar包保存在target目录下面-->
                                <directory>${project.build.directory}</directory>
                                <!--需要复制的文件,打包好的应用jar包。-->
                                <include>${project.build.finalName}.jar</include>
                            </resource>   
                        </resources>
                    </configuration>
                </plugin>l

    简要说明一下插件的配置:

    • imageName:用于指定镜像名称,其中niugang是仓库名称,springboot是镜像名称,3.0是标签名称
    • baseImage:用于指定基础镜像,类似于Dockerfile中的FROM指令。
    • entrypoint:类似于Dockerfile的ENTRYPOINT指令。
    • resources.resource.directory:用于指定需要复制的根目录,${project.build.directory}表示target目录。
    • resources.resource.include:用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。
  • step2 进入代码路径下,执行如下命令

    mvn clean package docker:build
  • step3 查看镜像

    技术图片

  • step4 启动容器

    docker run  -d -p 8088:8088 --name myspringboot niugang/springboot:3.0
  • step5 访问测试

2.2 读取Dockerfile进行构建

在2.1中只需要在pom.xm中配置,执行命令就可以生成docker镜像。在很多时候希望通过Dockerfile生成Docker镜像。

  • step1 在项目src/main/resources目录下新建docker文件夹,在文件夹下新建Dockerfile文件,增加如下内容:
FROM java:8
MAINTAINER niugang<863263957@qq.com>
RUN  mkdir -p /docker/images
ADD demo-0.0.1-SNAPSHOT.jar /docker/images
ENTRYPOINT ["java","-jar","/docker/images/demo-0.0.1-SNAPSHOT.jar"]
  • step2 pom.xml修改为如下

     <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.4.13</version>
                    <configuration>
                        <!--用于指定镜像名称-->
                        <imageName>niugang/springboot:4.0</imageName>             <dockerDirectory>${project.basedir}/src/main/resources/docker</dockerDirectory>
                        <resources>
                            <resource>
                                <!--将打包后的资源文件复制到该目录-->
                                <targetPath>/</targetPath>
                                <!--需要复制的文件所在目录,maven打包的应用jar包保存在target目录下面-->
                                <directory>${project.build.directory}</directory>
                                <!--需要复制的文件,打包好的应用jar包。-->
                                <include>${project.build.finalName}.jar</include>
                            </resource>   
                        </resources>
                    </configuration>
                </plugin> 

    可以看到,不再制定baseImage和entrypoint,而是使用dockerDirectory指定Dockerfile所在路径。即时指定了baseImage和entrypoint也将被忽略。

  • step2 进入代码路径下,执行如下命令

mvn clean package docker:build
  • 查看镜像
docker images

技术图片

  • step4 启动容器

    docker run  -d -p 8088:8088 --name myspringboot niugang/springboot:4.0
  • step5 访问测试

2.3 将插件绑定在某个phase执行

很多场景下,我们有这样的需求,执行例如 mvn clean package 时,插件就自动为我们构建Docker镜像。要想实现这点,我们只需将插件的goal绑定在某个phase即可。
phase和goal可以这样理解:maven命令格式是: mvn phase:goal ,例如 mvnpackagedocker:build 。那么,package和docker都是phase,build则是goal。

  • step1 编辑pom.xml 内容如下

    <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.4.13</version>
                   <executions>
                       <execution>
                           <id>build-images</id>
                           <phase>package</phase>
                           <goals>
                               <goal>build</goal>
                           </goals>
                       </execution>
                   </executions>
                    <configuration>
                        <!--用于指定镜像名称-->
                        <imageName>niugang/springboot:5.0</imageName>                    <dockerDirectory>${project.basedir}/src/main/resources/docker</dockerDirectory>
                        <resources>
                            <resource>
                                <!--将打包后的资源文件复制到该目录-->
                                <targetPath>/</targetPath>
                                <!--需要复制的文件所在目录,maven打包的应用jar包保存在target目录下面-->
                                <directory>${project.build.directory}</directory>
                                <!--需要复制的文件,打包好的应用jar包。-->
                                <include>${project.build.finalName}.jar</include>
                            </resource> 
                        </resources>
                    </configuration>
                </plugin>
  • step2进入代码路径下,执行如下命令

mvn clean package
  • step3 查看镜像

技术图片

由配置可知,我们只需添加如下配置:

<executions>
  <execution>
    <id>build-image</id>
    <phase>package</phase>
    <goals>
      <goal>build</goal>
    </goals>
  </execution>
</executions>

就可将插件绑定在package这个phase上。也就是说,用户只需执行 mvn package ,就会自动执行 mvn docker:build 。当然,读者也可按照需求,将插件绑定到其他的phase。

微信公众号

技术图片
JAVA程序猿成长之路
分享资源,记录程序猿成长点滴。专注于Java,Spring,SpringBoot,SpringCloud,分布式,微服务。

springboot之旅第七篇-docker

...脑只要装这个镜像就可以了,这样工作量就减少了很多。Docker跟这个镜像并不是一回事,但是思想是相同的。我们在一台服务器中下载、安装、配置好Mysql,在另外一台服务器中又 查看详情

javascript运动系列第七篇——鼠标跟随运动

×目录[1]眼球转动[2]苹果菜单前面的话  运动除了直线运动和曲线运动两种运动形式外,还有一种运动形式是鼠标跟随运动,而这种跟随运动需要用到三角函数的相关内容或者需要进行比例运算。本文将以几个小实例来介... 查看详情

构建之法——第七篇

本周我对于软件的设计与实现和用户体验进行了一个深度的学习。我们写软件就是要解决用户的需求,我们需要表达和传递一些信息:在“需求分析”阶段,我们要搞清楚,在问题领域的现实世界里,都有哪些实体,如何抽象出... 查看详情

mongodb基础教程系列--第七篇mongodb聚合管道

...的批量处理,往往将记录按条件分组以后,然后再进行一系列操作,例如,求最大值、最小值、平均值,求和等操作。聚合操作还能够对记录进行复杂的操作,主要用于数理统计和数据挖掘。在MongoDB中,聚合操作的输入是集合... 查看详情

maven实战技巧「docker实战系列」使用maven插件构建docker镜像的方法(代码片段)

使用Maven插件构建Docker镜像的方法工具插件名称+官方地址修改宿主机配置(docker可以远程访问)配置DOCKER_HOST例如使用插件构建Docker镜像添加插件构建镜像添加docker-maven-plugin创建Dockerfile内容如下执行以下命令构建Docker... 查看详情

第七篇camunda系列-身份服务(代码片段)

身份服务  在流程定义中在任务结点的assignee固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。针对这种情况可以给任务设置多个候选人或... 查看详情

第七篇camunda系列-身份服务(代码片段)

身份服务  在流程定义中在任务结点的assignee固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。针对这种情况可以给任务设置多... 查看详情

docker应用系列|构建consul集群(代码片段)

...l集群,假设目前使用的账号为release,拥有sudo权限。由于Docker官方镜像下载较慢,可以开启阿里云的Docker镜像下载加速器,可参考此文进行配置。假设三台主机的ip分别为:主机一:192.168.0.1主机二:192.168.0.2主机三:192.168.0.3三... 查看详情

docker重学系列之dockerfile(代码片段)

Docker重学系列之DockerfileDockerfile什么是DockerfileDockerfile解析过程Dockerfile的保留命令FROM命令MAINTAINER命令RUN命令构建镜像---build镜像构建上下文(Context)其它dockerbuild的用法直接用Gitrepo进行构建用给定的tar压缩包构建从标准... 查看详情

云原生kubernetes系列第五篇kubeadmv1.20部署k8s集群架构(人生这道选择题,总会有遗憾)(代码片段)

...给我点个三连喔😜收录至专栏云原生😜【云原生Docker系列第一篇】Docker镜像管理😜【云原生Docker系列第二篇】Docker容器管理😜【云原生Docker系列第三篇】Docker网络模式😜【云原生Docker系列第四篇】DockerCgroup... 查看详情

directx11第七篇光照模型——环境光

      本系列文章主要翻译和参考自《Real-Time3DRenderingwithDirectXandHLSL》一书(感谢原书作者),同时会加上一点个人理解和拓展,文章中如有错误,欢迎指正。      这里是书中的代码和资源。      本... 查看详情

docker入门与应用系列dockerfile

Dockerfile是为快速构建dockerimage而设计的,当你使用dockerbuild命令的时候,docker会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行里面的指令构建出一个dockerimage。Dockerfile由一行行命令语句组成,并且支持以#开头... 查看详情

docker系列之二:构建docker容器(代码片段)

...web项目所需的运行环境:pip3freeze>../requirements.txt3.编辑Dockerfile:#依赖的的操作系统FROMubuntu:16.04#image的作者和作者邮箱MAINTAINERoldeleven"gsfmcntt1022@163.com"#安装项目的执行环境RUNapt-getupdate-y&&apt-getinstall-ypython3-pippython3-dev#COPY... 查看详情

第七篇:react-hooks设计动机与工作模式(下)(代码片段)

...t-Hooks的整体认知。在本课时的主体部分,我将通过一系列的编码实例来帮助你认识useState、useEffect这两个有代表性的Hook,这一步意在帮助初学者对React-Hooks可以快速上手。在此基础上&# 查看详情

我爱java系列---docker的介绍和安装

1.什么是Docker? docker叫做虚拟化技术,也叫作容器化技术. 简单来说就是服务器版,高性能版的linux系统(Ubuntu和centos7以上版本才能运行docker)的虚拟机.2.Docker作用 可以通过docker虚拟化技术,来在一台真实的服务器上构建很多,虚拟... 查看详情

docker虚拟化技术系列之-dockerfile配置

 随着Docker管理的任务增多,我们需要用Dockerfile进行docker容器管理,这样可以减轻人工的操作,让docker管理更加的方便,快捷:Dockerfile是一个镜像的完整描述,可以通过Dockerfile来描述构建镜像的步骤,并自动构建一个容器。... 查看详情

混合编程jni第七篇之jni的命令行们(代码片段)

 系列目录:【混合编程Jni】系列目录_香菜聊游戏的博客-CSDN博客        今天将继续JNI的学习,jni编程中常使用的一些命令行工具如何使用事半功倍,今天就快速的过一下,希望在接下来的使用中... 查看详情

mysql从青铜到王者第七篇:mysql内外连接

系列文章目录文章目录系列文章目录前言一、表的内连和外连(重点)1.内连接1.案例:显示SMITH的名字和部门名称2.外连接1.左外连接1.查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显... 查看详情