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,分布式,微服务。

Docker系列-第七篇Docker构建SpringBoot应用的更多相关文章

  1. Docker系列-第五篇Docker容器数据卷

    1.是什么 在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作 . 容器中的管理数据主要有两种方式 : 数据卷 ( Data V ...

  2. SpringBoot之旅第七篇-Docker

    一.引言 记得上大三时,要给微机房电脑安装系统,除了原生的操作系统外,还要另外安装一些必要的开发软件,如果每台电脑都重新去安装的话工作量就很大了,这个时候就使用了windows镜像系统,我们将要安装的 ...

  3. Docker系列之入门篇

    Dcoker是什么? 概述 Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行 ...

  4. [第七篇]——Docker Hello World之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker Hello World Docker 允许你在容器内运行应用程序, 使用  docker run 命令来在容器内运行一个应用程序. 输出Hello world xxx@xxx:~$ do ...

  5. docker系列之一:初见docker

    什么是docker? docker是目前linux最流行的容器技术,Docker 将应用程序与该程序的依赖,打包在一个文件里面.运行这个文件,就会生成一个虚拟容器.程序在这个虚拟容器里运行,就好像在真 ...

  6. Docker系列教程01-使用Docker镜像

    docker系列导读 一文带你读懂什么是docker Docker安装部署 10张图带你深入理解Docker容器和镜像 前言 学习Docker,我们需要掌握它的三大核心概念:镜像.容器和仓库. 今天先 ...

  7. 【Docker】第四篇 Docker仓库管理

    一.仓库概述 仓库(Repository):Docker仓库主要用于镜像的存储,它是镜像分发.部署的关键.仓库分为公共仓库和私有仓库. 注册服务器(Registry)和仓库区别:注册服务器上往往存放着 ...

  8. 【Docker】第三篇 Docker容器管理

    一.Docker容器概述: 简单理解容器是镜像的一个实例. 镜像是静态的只读文件,而容器的运行需要可写文件层. 二.创建容器 [root@web130 ~]# docker create -it ub ...

  9. Docker系列06:Linux修改docker镜像和容器数据存储位置

    指定镜像和容器存放路径的参数是--graph=/var/lib/docker,其默认存储位置为/var/lib/docker, Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的 ...

随机推荐

  1. H3C CHAP验证

  2. solaris 10 基本使用

    1. 新增用户 注释掉home行# cat /etc/auto_master # # Copyright 2003 Sun Microsystems, Inc. All rights reserved ...

  3. vue——父子传值

    转载地址:https://blog.csdn.net/xr510002594/article/details/83304141

  4. P1098 方程解的个数

    题目描述 给出一个正整数N,请你求出x+y+z=N这个方程的正整数解的组数(1<=x<=y<=z<1000).其中,1<=x<=y<=z<=N . 输入 ...

  5. There is no PasswordEncoder mapped for the id "null"的解决办法

    今日在SpringBoot项目中使用 Spring Security ,登录时发现报500错,报错信息如下: There is no PasswordEncoder mapped for the id ...

  6. jQuery---鼠标滚轮控制div横向滚动条左右移动

    HTML <div class="table-responsive"> <div class="fhtable" style="wi ...

  7. codeforces 572(Div2)A、B、C、D1、D2、E

    Cdoeforces 572(Div2)A.B.C.D1.D2.E 传送门:https://codeforces.com/contest/1189 A.题意: 给你一串长为n的字符串,要求你将其切割为 ...

  8. UI 素材相关收集

    图标素材收藏网址  阿里:iconfont.cn 图片压缩:https://tinypng.com/ gif动图压缩:https://tool.gifhome.com

  9. easypermissions拒绝权限后闪退。 java.lang.NoSuchMethodError: No virtual method isStateSaved()Z in class Landroid/support/v4/app/FragmentManager

    Process: com.tazan.cd.streetlight, PID: 18825 java.lang.NoSuchMethodError: No virtual method isState ...

  10. Integer类入门学习

    Integer类 它是一个类,是 int 基本数据类型的封装类. 基本API Integer 类和 int 的区别 Integer 是 int 包装类,int 是八大基本数据类型之一(byte,sho ...