Docker中运行JAR文件指南

Docker中运行JAR文件指南
前言
Docker通过容器化技术,将应用及其依赖环境打包成一个独立的单元,确保了应用在不同环境中的高度一致性。对于Java开发者而言,将Java应用打包成JAR文件并通过Docker容器部署,不仅可以简化部署流程,还能有效避免“在我机器上可以运行”的尴尬局面。本文介绍两者将jar运行在容器环境中的方式。

方式一
将Java应用打包进镜像

  1. 编写Dockerfile
# 基础镜像选择OpenJDK的9-JDK
FROM openjdk:8-jdk

# 设置容器内工作目录
WORKDIR /app

# 将同级目录下的JAR文件复制到容器中的工作目录下
COPY ./eurekaServer.jar /app/app.jar

# 暴露应用端口
EXPOSE 8888

# 设置环境变量,为不同的启动方式预留空间
#编码
ENV LANG=en_US.UTF-8
#时区
ENV TZ=Asia/Shanghai
#预留启动参数修改点
ENV JAVA_OPTS= -Duser.timezone=GMT+08 -Dfile.encoding=UTF-8

# 启动命令
CMD java  -jar $JAVA_OPTS app.jar

2.利用dockerfile制作镜像
将dockerfile 与eurekaServer.jar 放在同一目录下执行以下命令构建一个名为eureka-server的镜像

docker build -t eureka-server:20241020 .

3.利用生成的镜像创建容器并运行
docker run --name eureka-server -d -p 8888:8888 --restart=always eureka-server:20241020
自此部署完毕。
优缺点
优点
每次jar包更新都可以生成不同的镜像号,方便管理、回退历史版本,方便做服务扩展和迁移(在不同机器上运行相同镜像即可)。
缺点
.每次改动都需要构建一个新镜像,打包麻烦,历史镜像会占用很多硬盘空间。
方式二
不将Java应用打包进镜像,创建容器时将jar从docker宿主机挂载到容器内。
1.制作docker-compose.yaml

# 版本不同,件格式特性不一样 ,新版不用指定
# version: '3'  
services:  
  eureka-server-service:  
    build:  
    # 指定docker-compose.yml文件所在的目录为构建上下文  
      context: .  
    # 为构建的镜像指定一个名称  
    image: openjdk:8-jdk 
    # 为容器指定一个名称(可选)  
    container_name: eureka-server  
    # 访问端口
    ports:  
      - "8888:8888"  
    restart: always  # 重启策略  
    volumes:
      # 宿主机工作目录挂载到容器中
      - /usr/docker-compose/eureka/:/app
      # 指定容器时间为宿主机时间
      - /etc/localtime:/etc/localtime
    environment:
      # 指定编码
      - LANG="en_US.UTF-8"
      # 指定时区
      - TZ="Asia/Shanghai"
    #启动容器后执行的命令
    entrypoint: java  -jar -Duser.timezone=GMT+08 -Dfile.encoding=UTF-8 /app/eurekaServer.jar

2.利用docker-compose生成容器
在docker-compose.yaml同级目录执行
docker-compose up -d

自此部署完毕。

优缺点
优点
每次jar包更新无需重新生成镜像,只需要替换对应位置jar包重启容器即可,节省时间也节省硬盘。
缺点
.由于无需重新生成镜像,所以没有历史版本需要人工备份jar包记录历史版本。

posted @ 2025-06-05 14:25  故木  阅读(356)  评论(0)    收藏  举报