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


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

    前言

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

    1、项目打包

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

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

    <build>
            <finalName>${project.artifactId}finalName>
            <plugins>
                
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                    
                plugin>
            plugins>
        build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    避免在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","&"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    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"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    • 查看容器是否启动成功
      docker ps
      在这里插入图片描述
  • 相关阅读:
    Spring源码之九finishRefresh详解
    计算机视觉与深度学习-全连接神经网络-激活函数- [北邮鲁鹏]
    RTT学习笔记9-IO设备模型
    java计算机毕业设计网络城市交通应急管理系统MyBatis+系统+LW文档+源码+调试部署
    使用百度 EasyDL 实现电动车进电梯自动预警
    B03_02可转债转股
    如何借助ai(文心一言)获取tushare的数据
    linux 下内存泄漏分析
    封装Cookie的增删改查 history worker的使用 touch事件
    【跟马少平老师学AI】-【神经网络是怎么实现的】(七-2)word2vec模型
  • 原文地址:https://blog.csdn.net/weixin_52315708/article/details/132809047