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