【2023】基于docker 实现部署jar包项目(包括单个和多个一起部署)

方渐鸿 2024-06-28 11:37:03 阅读 64

建议学习本博客之前,需要对docke的基本命令有过学习;

目录

前言1、项目打包2、编写Dockerfile文件2.1、单个jar部署🍕Dockerfile文件常用命令

2.2.1、编写一个Dockerfile 文件格式制作镜像

2.1.2、执行docker命令2.2、多个jar一起部署到docker2.2.1、编写start.sh启动文件2.2.2、编写Dockerfile文件2.2.3、执行docker命令

前言

该方式适用于jar包较少时,项目复杂度不高时使用,如果部署的比较多的话还是建议使用docker的编码工具Docker Compose或者k8s进行统一部署

1、项目打包

如果项目配置文件中有配置文件的ip地址是localhost的需要改为时间的IP地址

先把项目打成jar包,注意配置spring boot的maven打包

<build>

<finalName>${project.artifactId}</finalName>

<plugins>

<!-- Maven Compiler Plugin -->

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<!-- 在此处添加任何其他 Maven 编译插件的配置,如果需要的话 -->

</plugin>

</plugins>

</build>

避免在jar执行时出现如:servier-gateway-1.0.jar中没有主清单属性找不到或无法加载主类等错误,打包完成后可以先在本地执行 java -jar xxx.jar 运行一下jar包,先在本地确保可以正常运行先。

2、编写Dockerfile文件

2.1、单个jar部署

🍕Dockerfile文件常用命令
命令 描述
FROM 指定基础镜像,用于构建新的镜像。
COPY 将文件从宿主机复制到容器中。
ADD 类似于COPY,但支持远程文件和自动解压缩。
RUN 在镜像中运行命令,用于安装软件包和执行其他构建任务。
CMD 定义容器启动时要执行的命令,只能有一个CMD命令,如果有多个,只有最后一个会生效。
ENTRYPOINT 定义容器启动时要执行的命令,与CMD不同的是,ENTRYPOINT的参数不会被覆盖。
ENV 设置环境变量,用于配置容器的运行环境。
WORKDIR 设置容器内的工作目录,后续命令将在该目录下执行。
EXPOSE 声明容器在运行时监听的端口,但并不映射端口到主机。
VOLUME 创建一个挂载点,用于持久化数据。

2.2.1、编写一个Dockerfile 文件格式制作镜像

# 使用一个基础的 Java 镜像(根据自己项目中使用的是什么jdk版本设置,用于拉取执行jar包的jdk环境)

FROM openjdk:8-jdk-alpine

# 指定工作目录

VOLUME /tmp

# 复制应用程序的 JAR 文件到镜像中(需要时相对路径)

ADD ./servier-gateway/target/servier-gateway.jar servier-gateway.jar

# 定义容器启动时执行的命令

ENTRYPOINT ["java","-jar","servier-gateway.jar","&"]

2.1.2、执行docker命令

拉取生成镜像

docker build -t 对应着jar包的名字:版本(可以自己定) Dockerfile文件的路径,点是代表当前文件夹

docker build -t service-gateway:1.0.0 .

在这里插入图片描述

查看docker里面的镜像 :

docker images

在这里插入图片描述

创建容器

docker run -d --name servier-gateway -p 8200:8200 a0e2430dd36f -t

在这里插入图片描述

查看容器是否启动成功

在这里插入图片描述

启动成功之后,可以访问对应的端口进行查看验证

2.2、多个jar一起部署到docker

如果是有多个服务需要部署,则可以统一写在一个Dockerfile文件里,可以减少麻烦

格式如下:通过创建一个启动脚步(start.sh),在其中启动多个jar包;然后在 Dockerfile 中使用 CMD 指令来运行这个启动脚本。

2.2.1、编写start.sh启动文件

这种启动脚本的好处是它允许你在同一个容器中同时启动多个应用程序,这对于某些复杂的应用程序架构可能很有用。每个应用程序在后台运行,容器保持活跃,直到你手动停止容器。

java -jar service-sys.jar & :命令表示以 Java 命令运行 service-sys.jar 文件,& 符号表示在后台运行,以便同时启动多个应用程序。tail -f /dev/null :用于防止容器在应用程序启动后立即退出,tail -f /dev/null 命令会持续监视 /dev/null 文件(一个空文件);这是因为容器在主进程退出时会停止,但在这种情况下,tail 命令会一直运行,使容器保持活跃。

#!/bin/sh

# 启动多个JAR包,每个JAR包后台运行

java -jar service-activity.jar &

java -jar service-product.jar &

java -jar service-sys.jar &

java -jar service-user.jar &

# 保持容器运行

tail -f /dev/null

2.2.2、编写Dockerfile文件

# 使用一个基础的 Java 镜像

FROM openjdk:8-jdk-alpine

# 指定工作目录

WORKDIR /tmp

# 复制应用程序的 JAR 文件到镜像中的根路径下

COPY ./service-activity/target/service-activity.jar service-activity.jar

COPY ./service-product/target/service-product.jar service-product.jar

COPY ./service-sys/target/service-sys.jar service-sys.jar

COPY ./service-user/target/service-user.jar service-user.jar

# 定义容器启动时执行的命令

COPY start.sh start.sh

# 赋予启动脚本可执行权限

RUN chmod +x start.sh

# 定义容器启动时执行的命令

CMD ["./start.sh"]

2.2.3、执行docker命令

拉取下载镜像(同上)

docker build -t my-image .

在这里插入图片描述

查看镜像

docker images

创建容器

通过这个镜像为每个jar包创建容器,可以通过这个镜像分别为不同jar包创建容器

docker run -d -p 8205:8205 --name service-activity my-image java -jar service-activity.jar

docker run -d -p 8203:8203 --name service-product my-image java -jar service-product.jar

docker run -d -p 8202:8202 --name service-sys my-image java -jar service-sys.jar

docker run -d -p 8206:8206 --name service-user my-image java -jar service-user.jar

在这里插入图片描述

查看容器是否启动成功

docker ps

在这里插入图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。