Java程序在Linux如何进行容器化部署
导读:Java 程序在 Linux 的容器化部署实操指南 一 准备环境与产出物 在 Linux 主机安装并启动 Docker,确认版本:docker --version。 准备可运行的 Java 产物:使用 Maven 或 Gradle 打包为...
Java 程序在 Linux 的容器化部署实操指南
一 准备环境与产出物
- 在 Linux 主机安装并启动 Docker,确认版本:
docker --version。 - 准备可运行的 Java 产物:使用 Maven 或 Gradle 打包为可执行 JAR(如
mvn clean package生成于 target/ 目录)。 - 目录建议:将 Dockerfile 与 target/ 放在同一工程根目录,便于构建上下文管理。
二 编写 Dockerfile 的两种方式
-
方式 A 运行已打包 JAR(推荐,镜像更小)
# 体积较小,适合运行期 FROM openjdk:11-jre-slim WORKDIR /app COPY target/app.jar /app/app.jar EXPOSE 8080 # 通过环境变量注入JVM参数,便于不同环境调整 ENV JAVA_OPTS="-Xms512m -Xmx1024m" ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]说明:基础镜像选用 openjdk:11-jre-slim/openjdk:8-jre-alpine 可显著减小体积;
EXPOSE仅作声明,真正发布端口需配合-p运行参数。 -
方式 B 在镜像内构建(适合无外网 CI 或需统一构建环境)
# 构建阶段 FROM maven:3.8-openjdk-17-slim AS build WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests # 运行阶段 FROM openjdk:17-jre-slim WORKDIR /app COPY --from=build /app/target/app.jar /app/app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app/app.jar"]说明:采用 多阶段构建,仅将产物 JAR 带入运行镜像,兼顾构建一致性与镜像最小化。
三 构建镜像与运行容器
- 构建镜像:
docker build -t my-java-app:latest . - 前台运行(便于看日志):
docker run --name myapp -p 8080:8080 my-java-app:latest - 后台运行:
docker run -d --name myapp -p 8080:8080 my-java-app:latest - 验证:
docker ps、docker logs -f myapp,访问应用如 http://服务器IP:8080。
四 生产级最佳实践
- 基础镜像与分层:优先选择 jre-slim/alpine 等最小化镜像;将变化频率低的指令放前、频繁变更的放后,充分利用 构建缓存。
- 多阶段构建:构建与运行分离,减少最终镜像体积与攻击面。
- 安全与精简:容器内以 非 root 运行(如需可在 Dockerfile 中创建用户并切换);仅复制必要文件,使用 .dockerignore 排除
.git、临时文件等。 - JVM 与资源:通过环境变量注入 JAVA_OPTS(如
-Xms/-Xmx),并设置容器内存限制(docker run -m),避免 OOM。 - 可观测性:添加 HEALTHCHECK 与日志目录挂载(
-v ./logs:/app/logs),便于故障排查与滚动升级。 - 配置与端口:使用 ENV 管理 Spring Profile、外部化配置;
EXPOSE仅声明,发布依赖-p hostPort:containerPort。
五 扩展 Kubernetes 部署简述
- 构建并推送到镜像仓库(示例为 Docker Hub):
docker tag my-java-app:latest < your-registry> /my-java-app:latest docker push < your-registry> /my-java-app:latest - 基本 Deployment 示例(myapp.yaml):
说明:按需配置 Service(如 NodePort/LoadBalancer)、ConfigMap/Secret、liveness/readiness 探针与 HPA。apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: < your-registry> /my-java-app:latest ports: - containerPort: 8080 resources: limits: memory: "1Gi" --- apiVersion: v1 kind: Service metadata: name: myapp-svc spec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Java程序在Linux如何进行容器化部署
本文地址: https://pptw.com/jishu/766302.html
