# Docker教程 - 2 Docker部署SpringBoot项目

已经学习了 Dockerfile 了,下面介绍一下如何将 SpringBoot 项目通过 Dockerfile 来部署到 Docker 中。

# 2.1 修改项目配置

首先需要准备一个 SpringBoot 项目,将 SpringBoot 项目打成 jar 包。

将项目中的 pom.xml 中的打包方式设置为jar包

<groupId>com.doubibiji</groupId>
<artifactId>hello-springboot</artifactId>
<version>1.0</version>
<!-- 修改打包方式为 jar 包 -->
<packaging>jar</packaging>
1
2
3
4
5

另外如果项目中用到数据库或 Redis 缓存等组件,注意修改地址,不要为 localhost,因为部署到 docker 中,是不在一个容器中的,localhost就表示当前容器内了,所以要写明数据库或缓存的地址。

# 2.2 打包

执行 maven 工具中的 clean 命令清除编译的 target 目录。

然后再执行 maven 中的 package指令,进行打包。

打完包,会在编译的target目录下生成 jar 包。

# 2.3 拷贝文件

我们可以在项目根目录下创建一个 docker 文件夹,然后在这个文件夹中编写一个 Dockerfile 文件,并将 jar 包拷贝并放在这个目录下。

其实这里主要是比较清晰的管理 docker 文件,这里的两个文件后面是需要拷贝到 Docker 宿主机上的。

这一步不影响后面的构建,只是为了将 Dockerfile 比较清晰的保存在项目下。

# 2.4 编写 Dockerfile 文件

编写 Dockerfile 文件,这里以 openjdk:17 镜像为基础镜像进行构建,因为 SpringBoot 项目是内置 Tomcat 的,所以只需要 JDK 环境即可。因为我开发时候使用的就是 JDK17,而且 SpringBoot版本使用的也是 3.x,所以使用 openjdk:17

Dockerfile 内容如下:

# 使用基础的 Java 17镜像
FROM openjdk:17

# 对外暴露的端口是8080
EXPOSE 8080

# 设置环境变量来指定时区
ENV TZ=Asia/Shanghai
# 将时区文件复制到容器中的特定路径
RUN ln -sf /usr/share/zoneinfo/{TZ} /etc/localtime && echo "{TZ}" > /etc/timezone

# 将jar包添加到容器中并更名为app.jar
ADD hello-springboot-0.0.1-SNAPSHOT.jar app.jar

# 这个命令的目的是确保 app.jar 文件存在
RUN bash -c 'touch /app.jar'
# 运行jar包
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

其实上面的 Dockerfile 内容也是比较简单的,学习了前面 Dockerfile 的命令,阅读起来难度也不大。

# 2.5 将文件传输到服务器

Dockerfilehello-springboot-0.0.1-SNAPSHOT.jar 传输到服务器。

目录自己定义,我这里例如放在 /home/doubi/hello-springboot 目录下。

# 2.6 构建镜像

在命令行中,进入到 Dockerfilehello-springboot-0.0.1-SNAPSHOT.jar 所在目录,然后执行如下指令:

docker build -t hello-springboot .
1
  • -t :参数 hello-springboot 是表示建后的镜像名称,

  • . :表示 Dockerfile 所在的当前目录


构建完成,使用 docker images 可以查看到构建完成的镜像:

# 2.7 运行镜像

首先在 hello-springboot 目录下新建一个 logs 目录,用于挂载日志目录,这样在主机上查看日志比较方便。

然后使用如下指令运行镜像:

docker run -d -p 8080:8080 --restart=always -v /home/doubi/hello-springboot/logs:/logs hello-springboot

# 指定使用application-test.yaml配置文件,指定为测试环境
docker run -d -e SPRING_PROFILES_ACTIVE=test -p 8080:8080 --restart=always -v /home/doubi/hello-springboot/logs:/logs hello-springboot
1
2
3
4
  • -d :表示后台运行
  • -p :表示端口映射(宿主机端口:容器端口)
  • -e SPRING_PROFILES_ACTIVE=test:设置环境变量 SPRING_PROFILES_ACTIVEtest。Spring Boot 应用程序将读取此环境变量,并激活相应的配置文件(application-test.ymlapplication-test.properties)。
  • --restart=always :容器停止后自动重启
  • -v:挂载目录映射(宿主机目录:容器目录),将日志文件夹映射到主机上,方便查看日志。

通过 docker ps 命令查看运行中的容器:

# 2.8 访问项目

使用浏览器,通过 IP端口 即可访问项目。