概述

对SpringBoot应用程序进行Docker容器化是软件开发者的一项基本技能,因为它可以在容器化环境中高效部署和管理应用程序。同时将SpringBoot应用打包到Docker容器中可以确保跨平台的一致性且便于后期扩展。

准备工作

首先准备一个SpringBoot项目,在项目中添加一个接口用于测试。

1
2
3
4
5
6
7
8
@RestController
public class HelloController {

@GetMapping("/hello")
public String hello() {
return "Hello Docker!";
}
}

启动项目,访问http://localhost:8080/hello,确保接口可以正确响应。

1
$ mvn clean spring-boot:run
1
$ curl -v localhost:8080/hello

执行上述命令后将看到如下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
curl -v localhost:8080/hello
* Trying [::1]:8080...
* Connected to localhost (::1) port 8080
> GET /hello HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 200
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 13
< Date: Mon, 15 Apr 2024 06:56:56 GMT
<
* Connection #0 to host localhost left intact
Hello Docker!%

添加Dockerfile配置文件

接下来,在项目根目录下创建一个Dockerfile,并添加下面的配置:

1
2
3
4
5
6
FROM openjdk:17
VOLUME /tmp
EXPOSE 8080
ARG JAR_FILE=target/spring-boot-to-docker-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

下面是配置的简单说明:

  • FROM openjdk:17:使用openjdk:17作为基础镜像。
  • VOLUME /tmp:创建一个/tmp目录作为容器的临时目录。
  • EXPOSE 8080:容器运行时监听的端口。
  • ARG JAR_FILE=target/spring-boot-docker.jar:定义一个变量JAR_FILE,用于指定要添加到容器中的jar文件。
  • ADD ${JAR_FILE} app.jar:将JAR_FILE指定的jar文件添加到容器中,并重命名为app.jar
  • ENTRYPOINT ["java","-jar","/app.jar"]:指定容器启动时执行的命令。

生成jar包

通过maven命令生成jar包:

1
$ mvn clean package

此时在target目录下会生成一个spring-boot-to-docker-0.0.1-SNAPSHOT.jar文件。

构建Docker镜像

确保已经安装了Docker,然后在项目根目录下执行下面的命令构建Docker镜像:

1
docker build -t spring-boot-to-docker:spring-docker .

build 命令将通过我们在 Dockerfile 中的配置构建一个镜像,而 -t 标志则用于为我们的镜像添加一个标签。

等待几分钟后,我们可以通过docker image ls | grep spring-boot-to-docker命令查看镜像是否创建成功。

docker-image-ls.png

运行Docker容器

运行下面的命令启动Docker容器:

1
docker run -p 9090:8080 spring-boot-to-docker:spring-docker

run 命令用于启动一个容器,而 -p 标志则用于将容器的端口映射到主机的端口。

运行成功后,可以通过http://localhost:9090/hello访问接口,确保接口可以正确响应。

1
$ curl -v localhost:9090/hello

run-docker.png