如何将Spring Boot应用跑在Docker容器中

日常的Rest服务开发我都会首选SpringBoot,因为它本身的易用性以及自带的各种方便功能、生态等,今天就简单讲一下如何将Spring Boot应用跑在Docker容器中

项目搭建

首先打开Idea,选择初始化一个Spring Boot应用,然后一路回车下去,待Idea下载完依赖,开始编码
image
这里写一个简单的接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@SpringBootApplication
public class DemoApplication {
 
	@GetMapping("/hello")
	public String hello() {
		return "Hello World";
	}
 
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

然后运行下面的命令验证服务是否正常:

1
2
mvn clean package  -Dmaven.test.skip=true 
java -jar target/demo-0.0.1-SNAPSHOT.jar

容器化

下面我们就开始容器化这个简单的Spring Boot应用

创建Dockerfile文件

首先在项目的根目录创建一个Dockerfile文件,主要不要搞成驼峰命名:

1
2
3
4
5
6
7
8
9
10
11
12
13
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的去做:

1
docker build -t demo8 .

如果看到下面的输出说明执行成功了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

运行镜像

到这一步构建完成后,我们就顺利的开始运行:

1
docker run -d  -p 4000:8080 demo8

然后curl一下刚才的接口看看是否正常:

1
2
± % curl localhost:4000/hello                                                                                                                                                                                                                                 
Hello World%

我们看到这里是将4000端口映射到了容器中的8080端口,我们进入容器看一下验证一下:

1
2
3
4
5
6
± % 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一起使用,正如本文演示的一样非常简单。

 


作者:aCoder2013

GitHub:https://github.com/aCoder2013