Docker 中运行 JAR 文件
文章目录
- 步骤 1:准备文件结构
- 步骤 2:编写 Dockerfile
- 步骤 3:构建 Docker 镜像
- 步骤 4:运行容器
- 常见问题解决
- Q1:容器启动后立即退出
- Q2:时区不一致
- Q3:依赖外部服务(如MySQL)
步骤 1:准备文件结构
在项目根目录创建以下结构(假设 JAR 包名为 app.jar
):
my-java-app/
├── Dockerfile # Docker构建脚本
├── app.jar # 编译好的Java可执行包
└── config/ # 配置文件目录(可选)└── application.properties
步骤 2:编写 Dockerfile
# 使用官方Java基础镜像(根据JDK版本选择)
FROM openjdk:8-jdk-alpine# 设置工作目录
WORKDIR /app# 复制JAR文件和配置文件到容器
COPY app.jar /app/app.jar
COPY config/application.properties /app/config/# 声明暴露端口(与Spring Boot应用的server.port一致)
EXPOSE 8080# 使用环境变量传递JVM参数
ENTRYPOINT exec java $JAVA_OPTS -jar app.jar
步骤 3:构建 Docker 镜像
# 在Dockerfile所在目录执行(-t指定镜像名称和标签)
docker build -t my-java-app:1.0 .
关键参数说明:
-t my-java-app:1.0
:定义镜像名称和标签.
:指定构建上下文为当前目录
步骤 4:运行容器
docker run -d \ # 后台运行-p 8081:8080 \ # 端口映射(宿主机端口:容器端口)-e JAVA_OPTS="-Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k" \ # 传递JVM参数(如内存限制)--name my-app my-java-app:1.0 # 使用的镜像
常见问题解决
Q1:容器启动后立即退出
- 检查日志:
docker logs my-app
- 常见原因:
- JAR包路径错误 → 确认Dockerfile中的
COPY
路径 - 端口冲突 → 修改
-p
参数或应用配置文件中的端口
- JAR包路径错误 → 确认Dockerfile中的
Q2:时区不一致
在Dockerfile中设置时区:
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
Q3:依赖外部服务(如MySQL)
使用 docker-compose.yml
编排多容器:
version: '3'
services:app:image: my-java-app:1.0ports:- "8080:8080"depends_on:- mysqlenvironment:SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/dbmysql:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: db