Docker系列-第七篇Docker构建SpringBoot应用
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 = 1step5 调用你的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应用的更多相关文章
- Docker系列-第五篇Docker容器数据卷
1.是什么 在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作 . 容器中的管理数据主要有两种方式 : 数据卷 ( Data V ...
- SpringBoot之旅第七篇-Docker
一.引言 记得上大三时,要给微机房电脑安装系统,除了原生的操作系统外,还要另外安装一些必要的开发软件,如果每台电脑都重新去安装的话工作量就很大了,这个时候就使用了windows镜像系统,我们将要安装的 ...
- Docker系列之入门篇
Dcoker是什么? 概述 Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行 ...
- [第七篇]——Docker Hello World之Spring Cloud直播商城 b2b2c电子商务技术总结
Docker Hello World Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序. 输出Hello world xxx@xxx:~$ do ...
- docker系列之一:初见docker
什么是docker? docker是目前linux最流行的容器技术,Docker 将应用程序与该程序的依赖,打包在一个文件里面.运行这个文件,就会生成一个虚拟容器.程序在这个虚拟容器里运行,就好像在真 ...
- Docker系列教程01-使用Docker镜像
docker系列导读 一文带你读懂什么是docker Docker安装部署 10张图带你深入理解Docker容器和镜像 前言 学习Docker,我们需要掌握它的三大核心概念:镜像.容器和仓库. 今天先 ...
- 【Docker】第四篇 Docker仓库管理
一.仓库概述 仓库(Repository):Docker仓库主要用于镜像的存储,它是镜像分发.部署的关键.仓库分为公共仓库和私有仓库. 注册服务器(Registry)和仓库区别:注册服务器上往往存放着 ...
- 【Docker】第三篇 Docker容器管理
一.Docker容器概述: 简单理解容器是镜像的一个实例. 镜像是静态的只读文件,而容器的运行需要可写文件层. 二.创建容器 [root@web130 ~]# docker create -it ub ...
- Docker系列06:Linux修改docker镜像和容器数据存储位置
指定镜像和容器存放路径的参数是--graph=/var/lib/docker,其默认存储位置为/var/lib/docker, Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的 ...
随机推荐
- Python--day71--ORM分组补充
1,ORM映射对应的sql语句: 2,QuerySet QuerySet方法大全 ########################################################### ...
- H3C 帧中继地址映射
- java什么是方法(Method)?
方法是一组为了实现特定功能的代码块的集合.方法在语法上的功能主要有以下两个: ①:结构化代码 将代码按照功能进行组织,使代码的结构比较清晰,容易阅读和修改,也就是程序的可维护性强. ②:减少代码重复 ...
- 2019-7-29-WPF-元素裁剪-Clip-属性
title author date CreateTime categories WPF 元素裁剪 Clip 属性 lindexi 2019-7-29 10:0:13 +0800 2019-1-3 15 ...
- Ubuntu 19.04安装phpipam软件
1ftp下载xampp2安装xampp chmod 777sudo ./xampp.run3,ftp phpipam.tar.gz 解压 ./opt/lampp/www/phpipam/cp conf ...
- P1064 连续自然数和
题目描述 对一个给定的自然数 M ,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为 M . 例子:1998+1999+2000+2001+2002=10000 ,所以从 1998 到 2 ...
- H3C 反向查询
- C# 在基类定义好方法让子类继承接口就能实现
在 C# 里面,接口的定义只需要类里面存在和接口声明相同的方法或属性就可以,而存在的方法或属性是在子类定义的还是基类里面定义的都无所谓.也就是在基类里面写好了方法,但不继承接口,等子类继承接口的时候就 ...
- ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(5)之业务层
业务层主要负责定义业务逻辑(规则.工作流.数据完整性等),接收来自表示层的数据请求,逻辑判断后,向数据访问层提交请求,并传递数据访问结果,业务逻辑层实际上是一个中间件,起着承上启下的重要作用. 在我们 ...
- H3C网络监测工具命令
1.Debugging 2.Display debugging 3.Display diagnostic-information display diagnostic-information 命令用来 ...