详解如何将Spring Boot应用跑在Docker容器中
作者:java互联网架构 发布时间:2023-04-25 08:08:58
标签:Docker容器,运行,SpringBoot应用
日常的Rest服务开发我都会首选SpringBoot,因为它本身的易用性以及自带的各种方便功能、生态等,今天就简单讲一下如何将Spring Boot应用跑在Docker容器中
项目搭建
首先打开Idea,选择初始化一个Spring Boot应用,然后一路回车下去,待Idea下载完依赖,开始编码
这里写一个简单的接口:
@RestController
@SpringBootApplication
public class DemoApplication {
@GetMapping("/hello")
public String hello() {
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
然后运行下面的命令验证服务是否正常:
mvn clean package -Dmaven.test.skip=true
java -jar target/demo-0.0.1-SNAPSHOT.jar
容器化
下面我们就开始容器化这个简单的Spring Boot应用
创建Dockerfile文件
首先在项目的根目录创建一个Dockerfile文件,主要不要搞成驼峰命名:
From java:8
VOLUME /tmp
#将打包好后的Jar文件放到image中
Add target/demo-0.0.1-SNAPSHOT.jar app.jar
# change file access and modification times
RUN bash -c 'touch /app.jar'
EXPOSE 8080
#容器启动的时候运行Jar文件
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
构建镜像
接下来就去构建Docker镜像,不过通常这一步都会用Jenkins的去做:
docker build -t demo8 .
如果看到下面的输出说明执行成功了:
Sending build context to Docker daemon 14.84MB
Step 1/6 : FROM java:8
---> d23bdf5b1b1b
Step 2/6 : VOLUME /tmp
---> Using cache
---> 91086d8b7c77
Step 3/6 : ADD target/demo-0.0.1-SNAPSHOT.jar app.jar
---> d161bed06e8b
Step 4/6 : RUN bash -c 'touch /app.jar'
---> Running in 9fbaff628989
---> 1fc0498bbb06
Removing intermediate container 9fbaff628989
Step 5/6 : EXPOSE 8080
---> Running in a5c44244b267
---> 3b5150c5bdd0
Removing intermediate container a5c44244b267
Step 6/6 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar
---> Running in b7a3baac9d47
---> 23ef7cc5e1b0
Removing intermediate container b7a3baac9d47
Successfully built 23ef7cc5e1b0
Successfully tagged demo8:latest
运行镜像
到这一步构建完成后,我们就顺利的开始运行:
docker run -d -p 4000:8080 demo8
然后curl一下刚才的接口看看是否正常:
± % curl localhost:4000/hello
Hello World%
我们看到这里是将4000端口映射到了容器中的8080端口,我们进入容器看一下验证一下:
± % docker ps !10172
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f1b7f29a0b6 988ed6f466b5 "java -Djava.secur..." 29 minutes ago Up 29 minutes 0.0.0.0:4000->8080/tcp practical_jones
± % docker exec -it 5f1b7f29a0b6 /bin/bash
root@5f1b7f29a0b6:/ curl localhost:8080/hello
Hello World
总结
SpringBoot打包后直接生成一个可执行的JAR包,天然就非常适合搭配Docker一起使用,正如本文演示的一样非常简单。
来源:http://news.51cto.com/art/201907/599604.htm


猜你喜欢
- 枚举是迭代一个集合中的数据项的过程。我们经常使用的大多数集合实际上都已经实现了枚举的接口IEnumerable和IEnumerator接口,
- 写在前面:接下来很长一段时间的文章主要会记录一些项目中实际遇到的问题及对应的解决方案,在相应代码分析时会直指问题所在,不会将无关的流程代码贴
- 依赖添加<dependency> <groupId>org.springframework.boot&l
- 一.延续任务private async static void CallerWithAsync() {  
- 1、public String(char[] c,begin,length).从字符数组c的下标begin处开始,将长度为length的字符
- 众所周知,当你点击一个超链接进行跳转时,WebView会自动将当前地址作为Referer(引荐)发给服务器,因此很多服务器端程序通过是否包含
- 前言经常使用Swagger的小伙伴应该有所体会,Swagger对于JSON的支持真的很不友好!最近发现了两款颜值很不错的JSON可视化工具,
- 曾经自学C#做计算机图形学的作业,GDI+画图确实好用,目前在找.NET的实习,尝试做了一个最基本的五子棋,复习一下C#的基本语法,目前只能
- 今天我来写一篇关于利用WPF来实现Windows的资源管理器功能,当然只是局部实现这个功能,因为在很多时候我们需要来实现对本机
- 在windows环境下进行的测试,前提条件,windows上需要先安装openssl。配置环境变量,查看版本:import java.io.
- 简介本文介绍InheritableThreadLocal的用法。ThreadLocal可以将数据绑定当前线程,如果希望当前线程的Thread
- java synthetic关键字。有synthetic标记的field和method是class内部使用的,正常的源代码里不会出现synt
- 有时候因为安全问题,需要把配置文件的中数据库用户名密码由明文改成密文,大多数其实是为了应付甲方而已。1.pom.xml引入依赖<dep
- JAVA中去掉空格 1. String.trim() trim()是去掉首尾空格 2.str
- 写在前面jenkins作为java的好 * ,经历过单体项目时代->集群项目时代->容器集群分布式时代,使用稳定可靠,cpu友好(
- public class TimeUtil { public static final int SECO
- SessionSession对象用于获取与数据库的物理连接。 Session对象是重量轻,设计了一个互动是需要与数据库每次被实例化。持久化对
- 前言在之前的Spring Boot基础教程系列中,已经通过《Spring Boot中使用@Async实现异步调用》一文介绍过如何使用@Asy
- java类的方法,我特别喜欢《java编程思想》里面的描述,这本书说java类之间的相互通信是通过消息。比如顾客类的对象调用一个eat方法,
- 1. 简介Jpa 是一套ORM 的规范hibernate 不就是一个 ORM 框架也提供了对于 JPA 的实现JPA(Java Persis