学而实习之 不亦乐乎

在 Docker 中部署 SpringBoot 项目

2024-03-08 21:28:18

一、简单步骤

1、生成一个可运行的 Jar 包或 War 包。(如在 IDEA 中,在 maven 上执行  install 即可)

2、编写Dockerfile文件

新建一个名为Dockerfile的文件,注意没有后缀名

# 镜像java版本,这里有坑,你可以看着项目里的pom.xml文件确定自己的版本,如果有问题的话多尝试几个
FROM openjdk:17

# VOLUME 指定了临时文件(使用容器卷)目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp。
VOLUME /tmp

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

# 暴露端口号
EXPOSE 8080

# 容器启动时会运行的命令
ENTRYPOINT ["java","-jar","/test.jar"]

3、将 SpringBoot 的 jar 包和 Dockerfile 文件一起放在 linux 系统下任意一个目录下

4、生成镜像。在此目录下执行以下命令:# docker build . -t test

5、查看镜像并运行

先查看镜像是否生成

# docker images

然后运行镜像

# docker run -d --name mytest -p 8080:8080 test
  • mytest:容器名称
  • test:镜像名称

6、查看容器启动情况

# docker logs mytest

二、实例

1、生成可运行的 war 包(app-1.0-SNAPSHOT.war)。

2、编写 Dockerfile,如下:

# 镜像 java 版本,这里有坑,有时候版本不合适会出现问题
FROM openjdk:8-jdk-alpine

# VOLUME 指定了临时文件(使用容器卷)目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp。
VOLUME /tmp

# 将 jar 包添加到容器中并更名为 app_debug.war
ADD app-1.0-SNAPSHOT.war app_debug.war

# 暴露端口号
EXPOSE 9080

# 容器启动时会运行的命令
ENV jvm_opts="-Xms64m -Xmx128m"

#ENTRYPOINT ["java","-jar -Xms64m -Xmx128m","/app_server_debug.jar"]
ENTRYPOINT exec java -jar $jvm_opts app_debug.war

3、生成镜像

# docker build . -t app_debug

4、生成并运行容器

# docker run -d -e TZ=Asia/Shanghai --name app_debug -p 9088:9080 -v /data/bjzqym_com/statics/app:/data/app -v /data/logs/app:/data/logs app_debug
  • -d:在后台运行容器
  • -e:指定容器内的环境变量,这里把时区设置为上海(TZ=Asia/Shanghai)
  • --name:指定容器的别名
  • -p:指定如何映射到本地主机端口,将容器的 9080 端口映射到本地 9088 端口,也就是说要访问到些项目,访问本地的 9088 端口即可。
  • -v:将本地的目录挂载到容器中去,如 /data/bjzqym_com/statics/app:/data/app 是将本地的 /data/bjzqym_com/statics/app 目录挂载到容器的 /data/app,主要是将容器的数据保存到本地,防止丢失,本地程序也容易访问。

5、查看项目运行情况

# docker logs app_debug -n 300

当日志量较大时,指定行数是比较明智的。

6、如果需要进入到容器内部查看,可以执行下面的语句:

# docker exec -it zhxkapp_debug /bin/bash

由于基础镜像不同,有些可能执行的是下面的语句:

# docker exec -it zhxkapp_debug /bin/sh