Docker 中运行 JAR 文件

文章目录

步骤 1:准备文件结构

在项目根目录创建以下结构(假设 JAR 包名为 app.jar):

复制代码
my-java-app/
├── Dockerfile      # Docker构建脚本
├── app.jar         # 编译好的Java可执行包
└── config/         # 配置文件目录(可选)
    └── application.properties

步骤 2:编写 Dockerfile

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 镜像

bash 复制代码
# 在Dockerfile所在目录执行(-t指定镜像名称和标签)
docker build -t my-java-app:1.0 .

关键参数说明

  • -t my-java-app:1.0:定义镜像名称和标签
  • .:指定构建上下文为当前目录

步骤 4:运行容器

bash 复制代码
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参数或应用配置文件中的端口
Q2:时区不一致

在Dockerfile中设置时区:

dockerfile 复制代码
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
Q3:依赖外部服务(如MySQL)

使用 docker-compose.yml 编排多容器:

yaml 复制代码
version: '3'
services:
  app:
    image: my-java-app:1.0
    ports:
      - "8080:8080"
    depends_on:
      - mysql
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/db

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: db
相关推荐
小Lu的开源日常1 小时前
如何使用 GitHub Action 发布 Docker 镜像
docker·开源·github
神秘人X7071 小时前
docker安装
docker·容器·eureka
失因2 小时前
Docker 容器与镜像
java·运维·spring cloud·docker·容器
耳东哇2 小时前
sentinel docker gateway k8s 集群 主从
docker·gateway·sentinel
一个向上的运维者2 小时前
使用 Kubernetes(k8s) 搭建 Redis 3 主 3 从集群教程
redis·容器·kubernetes
2501_920047032 小时前
k8s-pod的资源限制
云原生·容器·kubernetes
K_i1342 小时前
K8s日志架构:Sidecar容器实践指南
云原生·容器·kubernetes
0xCode 小新4 小时前
【C语言内存函数完全指南】:memcpy、memmove、memset、memcmp 的用法、区别与模拟实现(含代码示例)
linux·c语言·人工智能·深度学习·机器学习·容器·内存函数
费益洲5 小时前
Docker 网络详解:(二)虚拟网络环境搭建与测试
docker·容器
郁大锤5 小时前
Docker 中删除镜像与容器的完整指南
运维·docker·容器