温馨提示×

Linux环境下Java如何进行容器化部署

小樊
35
2025-12-27 20:41:45
栏目: 编程语言

Linux环境下Java容器化部署实操指南

一 环境准备与快速验证

  • Linux 主机安装 Docker,并启动服务与开机自启:
    • 安装示例(以 CentOS 为例):sudo yum update -y && sudo yum install -y yum-utils device-mapper-persistent-data lvm2 && sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && sudo yum install -y docker-ce docker-ce-cli containerd.io && sudo systemctl start docker && sudo systemctl enable docker
    • 验证:docker --version
  • 准备应用产物:使用 Maven/Gradle 构建可执行 JAR(如 mvn clean package),确保 target/xxx.jar 存在。

二 构建镜像的两种方式

  • 方式A 直接基于JAR构建(适合已有产物)
    • 目录约定:项目根目录含 target/your-app.jarDockerfile
    • Dockerfile 示例:
      FROM openjdk:17-jdk-slim
      WORKDIR /app
      COPY target/your-app.jar app.jar
      EXPOSE 8080
      ENTRYPOINT ["java","-jar","app.jar"]
      
    • 构建与运行:
      • docker build -t your-app:1.0 .
      • docker run -d -p 8080:8080 your-app:1.0
  • 方式B 多阶段构建(适合在镜像内完成编译,CI 常用)
    • Maven 示例:
      FROM maven:3.8.6-jdk-17 AS build
      WORKDIR /app
      COPY pom.xml .
      RUN mvn dependency:go-offline
      COPY src ./src
      RUN mvn package -DskipTests
      
      FROM openjdk:17-jdk-slim
      WORKDIR /app
      COPY --from=build /app/target/your-app.jar app.jar
      EXPOSE 8080
      ENTRYPOINT ["java","-jar","app.jar"]
      
    • Gradle 示例(简述):第一阶段用 gradle:jdk-17 执行 gradle build,第二阶段拷贝 build/libs/*.jar 到运行镜像并启动。

三 运行与运维常用命令

  • 前台运行便于调试:docker run --rm -p 8080:8080 your-app:1.0
  • 后台运行与查看日志:docker run -d --name app -p 8080:8080 your-app:1.0;docker logs -f app
  • 进入容器排查:docker exec -it app /bin/sh
  • 端口连通性测试:curl http://localhost:8080/actuator/health 或 curl http://127.0.0.1:8080。

四 配置与安全最佳实践

  • 基础镜像与标签:优先选择带有明确版本号的 JDK/JRE(如 openjdk:17-jdk-slim),避免 latest;对极致体积可考虑 alpine,但注意 musl libc 的兼容性问题。
  • 多阶段构建与瘦身:构建阶段用 JDK,运行阶段用 JRE/slim,仅拷贝产物 JAR,显著降低镜像体积与攻击面。
  • 非 root 运行与最小权限:在镜像中创建 非 root 用户 并切换运行,提升容器安全基线。
  • 外部化配置与日志:通过 环境变量 注入配置(如 Spring Profile),使用 挂载配置与日志目录,便于运维与审计。
  • JVM 参数与启动脚本:将 -Xms/-Xmx、系统属性等通过环境变量或 entrypoint.sh 动态拼装,避免把参数写死在镜像中。

五 扩展 编排与交付

  • Docker Compose(单机多服务)
    • 示例 docker-compose.yml:
      version: "3.8"
      services:
        app:
          build: .
          ports:
            - "8080:8080"
          environment:
            - JAVA_OPTS=-Xms512m -Xmx1g
          volumes:
            - ./config:/app/config
            - ./logs:/app/logs
      
    • 启动:docker-compose up -d
  • Kubernetes(生产级编排)
    • 示例 Deployment(片段):
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: java-app
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: java-app
        template:
          metadata:
            labels:
              app: java-app
          spec:
            containers:
            - name: java-app
              image: your-registry/your-app:1.0
              ports:
              - containerPort: 8080
              resources:
                requests:
                  memory: "512Mi"
                  cpu: "250m"
                limits:
                  memory: "1Gi"
                  cpu: "500m"
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: java-app-svc
      spec:
        selector:
          app: java-app
        ports:
          - protocol: TCP
            port: 80
            targetPort: 8080
        type: LoadBalancer
      
    • 部署:kubectl apply -f deploy.yaml;镜像需推送到可达的 镜像仓库(如 Docker Hub 或私有仓库)。

0