Skip to content

Docker教程 - 2 Docker部署SpringBoot项目

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

2.1 修改项目配置

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

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

xml
<groupId>com.doubibiji</groupId>
<artifactId>hello-springboot</artifactId>
<version>1.0</version>
<!-- 修改打包方式为 jar 包 -->
<packaging>jar</packaging>

另外如果项目中用到数据库或 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 内容如下:

shell
# 使用基础的 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"]

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

2.5 将文件传输到服务器

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

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

2.6 构建镜像

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

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

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


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

2.7 运行镜像

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

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

shell
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
  • -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端口 即可访问项目。