Java 程序在 Linux 的容器化部署实操指南
一 准备环境与产出物
docker --version。mvn clean package 生成于 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:latestdocker run -d --name myapp -p 8080:8080 my-java-app:latestdocker ps、docker logs -f myapp,访问应用如 http://服务器IP:8080。四 生产级最佳实践
.git、临时文件等。-Xms/-Xmx),并设置容器内存限制(docker run -m),避免 OOM。-v ./logs:/app/logs),便于故障排查与滚动升级。EXPOSE 仅声明,发布依赖 -p hostPort:containerPort。五 扩展 Kubernetes 部署简述
docker tag my-java-app:latest <your-registry>/my-java-app:latest
docker push <your-registry>/my-java-app:latest
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
说明:按需配置 Service(如 NodePort/LoadBalancer)、ConfigMap/Secret、liveness/readiness 探针与 HPA。