详解在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


猜你喜欢
- 在 UCHome 家园,用户可以根据不同的兴趣创建不同的群组(例如:“3D动画片爱好者”之类的群组),群组可以使群组成员产生真实的交互,增加
- 什么是ARP? ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/I
- 1、容器是独立运行的一个或一组应用,及他们的运行环境。容器是Docker中的一个重要的概念。2、docker容器的启动有三种方式a.交互方式
- google管理员工具增加您的网站在 Google 搜索结果中的展示率。 此服务完全免费。Google 网站管理员工具为您提供您的网页在 G
- twig是TheWebInformationGateway的缩写,是一套利用PHP开发而成的软件,它可以让你轻松地架设一个网络邮局(WebM
- 1.不要找全站链接,一个页面给过来链接就可以,全站链接权重降低还可能会被认为作弊。2.不要只找高PR的链接。3.控制链接数量增加的速度。短时
- Docker容器 日志中文乱码问题解决办法1. 找到dockerfile文件, 如 /use/local/src/Docker/Docker
- 检查自己的cuda是否安装好在anaconda prompt中输入nvcc -V显示如上面表示安装好了。配置清华园下载环境同样在在anaco
- dockerfile[root@SZB-L0010091 zxg]# cat DockerfileFROM scratchCOPY webd
- 从昨天22:00开始,在落伍者就不断有站长就在说自己的站点解封了,如果仅仅是几个站长在说的话我们会当作是正常范围内的小调整,但是越来越多的站
- 一、您必须有一个属于您自已的域名。比如:abc.com。没有域名的必须先注册一个域名。二、在国际域名中心注册一个DNS域名,以使您的DNS服
- 在上一篇对活动目录有个基本了解之后下面我就来接触一下活动目录实质上的一面——活动目录的结构。上篇我们讲到活动目录是包括两方面:目录和目录相关
- 报警 监控 性能 Windows 系统 空间 FTP精彩的大片当然要大家一起分享,上传到您的FTP空间中吧!方便朋友们下载和欣赏。但通常这些
- 很多新手的站长感觉建站难了、维护难了、推广更难了,一是由于国内禁止个人注册CN域名导致建站成本迅速上升,二是国家对网络管理异常严格,所有与色
- 简介xargs命令有两个要点。第一,你必须列出目标文件。第二,你必须指定对每个文件需要执行的命令或脚本。xargs命令被用来处理分布在不同目
- 一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有
- 全新的Discuz! 7.1版本进一步完善和创新社区论坛系统的功能,用户在Discuz! 7.1搭建的社区论坛中可以注册一个帐号,登录浏览更
- 11月25日消息,据国外媒体报道,Twitter联合创始人Biz Stone周二表示,Twitter将进行更多收购,并于明年初开始赚钱。St
- 今天遇到一个项目问题,shiro如何实现一个账户同一时刻只有一session存在的问题,找了几篇文章,在这里就把核心的代码理了理,具体情况如
- 现阶段的网站多如牛毛,或者说比牛毛也多,但是基本的情况都是基于WEB 1.0模式,多数的用户上去的方式集中有两种:百度和友情链接