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

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

目录

前言

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

1、项目打包

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

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

xml 复制代码
<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 文件格式制作镜像

shell 复制代码
# 使用一个基础的 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 命令会一直运行,使容器保持活跃。
powershell 复制代码
#!/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文件

powershell 复制代码
# 使用一个基础的 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包创建容器

powershell 复制代码
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
相关推荐
南猿北者4 小时前
docker容器
docker·容器
二十雨辰4 小时前
[linux]docker基础
linux·运维·docker
time never ceases5 小时前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle
YCyjs5 小时前
K8S群集调度二
云原生·容器·kubernetes
Hoxy.R5 小时前
K8s小白入门
云原生·容器·kubernetes
MonkeyKing_sunyuhua7 小时前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
追风林7 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
€☞扫地僧☜€9 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
茶馆大橘9 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
全能全知者10 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器