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. Scoop 包管理工具 安装

    本人浏览器已经跨域 https://get.scoop.sh 访问该地址成功 安装前提(所需要的环境): 操作环境:win10. 确保你的 PowerShell 版本 >= 3. win7或许低 ...

  2. sdk uncaught third Error Cannot assign to read only property 'constructor' of object '#<V>' (小程序)

    sdk uncaught third Error Cannot assign to read only property 'constructor' of object '#<V>' 在a ...

  3. 四叶草(css)

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <style> . ...

  4. linux 选择 ioctl 命令

    在为 ioctl 编写代码之前, 你需要选择对应命令的数字. 许多程序员的第一个本能的反 应是选择一组小数从0或1 开始, 并且从此开始向上. 但是, 有充分的理由不这样做. ioctl 命令数字应当 ...

  5. slot的使用方法

    参考链接:https://www.cnblogs.com/loveyt/p/9946450.html 插槽的使用其实是很简单,你只需明白以下两点,就很容易理解. 1.插槽是使用在子组件中的, 2.插槽 ...

  6. (摘录)ISO C++ Lambda表达式

    ISO C++ 11 标准的一大亮点是引入Lambda表达式.基本语法如下: [捕获列表](形参列表) mutable ->返回值类型 复合语句 其中除了"[]"(其中捕获列 ...

  7. Codeforces 293E 点分治+cdq

    Codeforces 293E 传送门:https://codeforces.com/contest/293/problem/E 题意: 给你一颗边权一开始为0的树,然后给你n-1次操作,每次给边加上 ...

  8. (转载)MySQL慢查询日志总结

    转自:https://www.cnblogs.com/kerrycode/p/5593204.html 慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响 ...

  9. 深入谷歌和甲骨文旷日持久的版权战争,趣味科普当前最火的编程语言JAVA的前世今生

    这篇文章是我在B站上投稿的一个科普java的视频文案,内容如标题,感兴趣的码农朋友可以移步观看https://www.bilibili.com/video/av81171108/ 在过去短短几十年间, ...

  10. Android Drawable - Shape Drawable使用详解(附图)

    TIPS shape图形 –简单介绍 shape图形 –如何画? shape图形 –参数详细解析 shape图形 –如何用? shape图形 –实际开发应用场景 shape图形简单介绍 用xml实现一 ...