详解在Docker容器中运行Spring Boot应用
作者:我是阿永吖 发布时间:2023-02-21 06:17:34
spring Boot简化了Spring应用的开发过程,遵循约定优先配置的原则提供了各类开箱即用(out-of-the-box)的框架配置。另一方面,Spring Boot还具备将代码直接构建为可执行jar包的能力,这个jar包是一个可以独立运行的部署单元。基于以上特性,现在普遍认为Spring Boot提供了一种快速构造微服务(Micro-Service)的能力。
Docker与Spring Boot
Docker是一种Linux容器的实现,Linux容器是基于进程的轻量级资源隔离技术,每一个容器对应操作系统中的一个进程,但是它又会有自己的网络空间、文件系统、PID等。Docker除了实现Linux容器,还使得容器具有“社会化”的功能,用户可以将容器镜像发布在Docker Hub与其他开发者共享、协作。安装Docker的教程请参考官方文档
Spring Boot应用通常被构建为一个可单独执行的jar包,通过Java -jar ...运行,但是框架本身并没有提供以服务形式运行在后台的方法,通常需要借助Systemd, Supervisord等进程管理工具来实现。另一方面,虽然应用运行环境非常的简单,但是将他们容器化为Docker容器镜像并运行,对于自动化部署、运维都是非常有利的。
本文将以一个最简单的Spring Boot开发的Web应用为例,讲解如何将其容器化运行。本文的重点是构建Docker镜像、运行Docker容器
构建并Spring Boot应用
在应用代码编写完成后,可以直接将其打包并运行:
Maven: mvn package && java -jar target/spring-boot-docker-0.1.0.jar
Gradle: gradle build && java -jar build/libs/gs-spring-boot-docker-0.1.0.jar
在浏览器地址栏种输入[http://localhost:8080/](http://localhost:8080/)可以访问应用
Dockerfile构建镜像
Docker提供了Dockerfile格式的文件来构建应用镜像,现在开始创建一个Spring Boot应用的Dockerfile:
FROM java:8
VOLUME /tmp
ADD spring-boot-docker-0.1.0.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
java:8是指Docker Hub上官方提供的java镜像,版本号是8也就是jdk1.8,有了这个基础镜像后,Dockerfile可以通过FROM指令直接获取它的状态——也就是在容器中java是已经安装的,接下来通过自定义的命令来运行Spring Boot应用:
VOLUME /tmp创建/tmp目录并持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp作为工作目录
ADD spring-boot-docker-0.1.0.jar app.jar 将应用jar包复制到/app.jar
ENTRYPOINT表示容器运行后默认执行的命令
Dockerfile非常的简单,编辑完成后运行docker构建镜像命令:
docker build -t tmy/spring-boot-app .
然后运行Docker容器:
docker run -d -p 8080:8080 --name sample-app tmy/spring-boot-app
其中-d表示后台运行容器,这也就自然地解决的Spring Boot不支持后台运行应用程序的问题。-p 8080:8080表示将容器内部的8080端口映射到宿主机器的8080端口,这样就可以通过宿主机器直接访问应用。--name sample-app给容器取一个容易记住的名字方便日后管理。
使用Maven/Gradle创建Docker镜像
为了方便Java开发者创建Docker镜像,Maven/Gradle都提供了响应的插件。
Maven
<properties>
<docker.image.prefix>springio</docker.image.prefix>
</properties>
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.2.3</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
上述pom.xml包含了docker-maven-plugin的配置:
imageName指定了镜像的名字
dockerDirectory指定Dockerfile的位置
resources是指那些需要和Dockerfile放在一起,在构建镜像时使用的文件,一般应用jar包需要纳入
经过以上配置后,运行下列命令可以在本地Docker中创建一个镜像:
$ mvn package docker:build
Gradle
Gradle同样也有支持Docker的插件:
buildscript {
...
dependencies {
...
classpath('se.transmode.gradle:gradle-docker:1.2')
}
}
group = 'springio'
...
apply plugin: 'docker'
task buildDocker(type: Docker, dependsOn: build) {
push = true
applicationName = jar.baseName
dockerfile = file('src/main/docker/Dockerfile')
doFirst {
copy {
from jar
into stageDir
}
}
}
上述配置和Maven基本类似,执行以下命令构建镜像:
$ gradle build buildDocker
来源:http://blog.csdn.net/lsy0903/article/details/53048198
猜你喜欢
- 一提到网上搜索信息,大家马上就会想到百度(Baidu)、谷歌(Google)或者是雅虎(Yahoo)等知名搜索网站。然而最近,一款综合了百度
- 写写自己的故事,在这里一个月挣八千实在不值一提,只是希望给一些新站长,尤其想做SOHO的站长一点参考,希望多多交流,共建和谐网络,同奔小康生
- 核心提示: 本文收集了网络上比较常见的和大家比较关心的SEO问题,并附上解决办法1、为什么网站收录在近几天突然下降?答:这个在短时间内是正常
- 对于一个网络管理员来说,垃圾邮件的困扰并不是接收这些垃圾邮件,而是试图防止垃圾邮件发送者使用你的邮件服务器来进行中继转发,这项工作很关键,因
- 万千游戏玩家瞩目的“金翎奖”已经落下了帷幕,多项大奖花落各家,几家欢喜几家愁。金山软件一如既往的为玩
- 前言好多人问我,这种基于大数据平台的xxxx的毕业设计要怎么做。这个可以参考之前写得关于我大数据毕业设计的文章。这篇文章是将对之前的毕设进行
- MeeGo今日低调地发布了1.0版,这是第一个稳定的,面向上网本和移动产品的版本,并且1.1版的开发已经进行中,它支持触摸式设备,例如手机、
- SNMP(Simple Network Management Protocol,简单网络管理协议),用来对通信线路进行管理。在Windows
- 11月20日、21日纵贯线“钟爱一生”北京首体演唱会已经进入倒计时。作为世界巡演的收官站,北京演唱会票房频频告捷。笔者了解到,为了求得一张门
- 在VMware上如何创建虚拟机以及安装Redhat Linux操作系统创建虚拟机(本人使用的是VMware pro 15) (1)点击Cre
- 葛大爷当年为移动做广告时说,这选运营商就是哪里人多去哪;一语道出网络营销的真谛所在——用户的聚合与自
- 在日常工作中,常有人问到域名解析了不是即时生效的嘛,怎么还是原来的呢?答案就是在本地DNS有解析缓存,电脑第一次访问后,在一定的时间内就将其
- godaddy是全球最大的域名注册商,这家公司是美国公司,最近他们进入了中国市场,并且支持了支付宝付款这种方式,现在购买godaddy域名已
- 修改文件dede/templets/content_batch_up.htm修改头部脚本函数ShowHideMove()function S
- dedecms v5.7正式版uft8版本,在执行更新网站地图的出现乱码。查看模板文件 templets/plus/中rssmap.htm和
- 一:查看文件系统块大小sudo /sbin/tune2fs -l /dev/sda1|grep "Block size"
- 呵呵,知道admin5 很长时间了。最早是在易域知道图王。一转眼好几年了。还是第一次在这里发表文章。我不会写东西,写的很简单。做好一个WAP
- 一,需求1,虚拟用户登录由于之前配置成功了postfix+MySQL虚拟用户登录,体会到了使用虚拟用户的好处和灵活性,所以这次也考虑采用虚拟
- 在过去的10年,架设一个大型网站是一个非常艰巨的任务,那可不是非专业人士可以完成的。现在好了,亚马逊开放了他们的服务器架构,一切都改变了。
- 经发现,虽然wget遵循 robots.txt 规则,但是那个还是可以绕过去,现在把我自己使用的屏蔽方法分享给大家:1. 屏蔽下载任何文件.