Docker部署java项目

使用 Docker 部署 Java 项目的完整步骤,涵盖环境准备、镜像构建、容器运行及优化配置:

一、环境准备

1. 安装 Docker
  • Linux(以 Ubuntu 为例):
    sudo apt-get update
    sudo apt-get install docker.io
    sudo systemctl start docker
    sudo systemctl enable docker
    
  • Windows/macOS
    下载并安装 Docker Desktop
2. 验证安装
docker --version       # 查看 Docker 版本
docker-compose version # 查看 Docker Compose 版本(如需)

二、Java 项目准备

1. 确保项目可本地运行
  • 项目需通过 Maven 或 Gradle 构建,生成可执行 JAR/WAR 文件。
  • 示例 Maven 打包命令:
    mvn clean package -DskipTests
    
2. 添加依赖(如 Spring Boot)

确保 pom.xml 或 build.gradle 包含必要依赖,如:

<!-- Spring Boot 项目示例 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

三、创建 Dockerfile

在项目根目录创建 Dockerfile(无扩展名),示例如下:

1. 基础镜像 + 分层构建(推荐)
# 第一阶段:构建项目
FROM maven:3.8.4-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 第二阶段:运行项目
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080  # 应用端口
ENTRYPOINT ["java", "-jar", "app.jar"]
2. 简化版(适合已打包的 JAR)
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/myapp.jar app.jar  # 替换为实际 JAR 名称
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

四、优化 Dockerfile(可选但推荐)

1. 添加环境变量支持
ENV JAVA_OPTS="-Xmx512m -XX:+UseG1GC"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
2. 减小镜像体积
# 使用 Alpine 轻量级基础镜像
FROM openjdk:17-alpine
# 或使用 distroless 镜像
FROM gcr.io/distroless/java:17
3. 多环境配置

通过 --build-arg 传递参数:

ARG PROFILE=dev
ENV SPRING_PROFILES_ACTIVE=$PROFILE

五、创建 .dockerignore 文件

避免不必要的文件被添加到镜像中:

# .dockerignore
target/
.idea/
.git/
*.iml

六、构建 Docker 镜像

1. 基本构建命令
docker build -t my-java-app:1.0 .  # -t:指定镜像名和标签,.:当前目录
2. 带参数构建(如多环境)
docker build --build-arg PROFILE=prod -t my-java-app:prod .
3. 验证镜像
docker images  # 查看本地镜像列表

七、运行 Docker 容器

1. 基础运行命令
docker run -d -p 8080:8080 --name my-java-container my-java-app:1.0
# -d:后台运行
# -p:端口映射(主机:容器)
# --name:容器名称
2. 添加环境变量
docker run -d -p 8080:8080 \
  -e JAVA_OPTS="-Xmx512m" \
  -e SPRING_DATASOURCE_URL="jdbc:mysql://host:3306/mydb" \
  --name my-java-container my-java-app:1.0
3. 挂载配置文件
docker run -d -p 8080:8080 \
  -v /host/path/application.properties:/app/config/application.properties \
  --name my-java-container my-java-app:1.0
4. 验证容器运行
docker ps              # 查看运行中的容器
docker logs -f <容器ID> # 查看容器日志

八、使用 Docker Compose(推荐)

1. 创建 docker-compose.yml
version: '3'
services:
  my-java-app:
    build: .
    image: my-java-app:1.0
    ports:
      - "8080:8080"
    environment:
      - JAVA_OPTS=-Xmx512m
      - SPRING_PROFILES_ACTIVE=prod
    volumes:
      - ./config:/app/config
    depends_on:
      - mysql  # 如果依赖数据库
    restart: always  # 自动重启策略

  mysql:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=mydb
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:
2. 启动服务
docker-compose up -d  # 后台启动服务
docker-compose down   # 停止并移除容器

九、高级配置(可选)

1. 健康检查

在 Dockerfile 或 docker-compose.yml 中添加:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
  interval: 30s
  timeout: 10s
  retries: 3
2. JVM 性能优化
environment:
  - JAVA_OPTS=-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -XshowSettings:vm
3. 生产环境建议
  • 使用非 root 用户运行容器
  • 定期更新基础镜像
  • 启用 Docker 内容信任
  • 配置资源限制(CPU/Memory)
    deploy:
      resources:
        limits:
          memory: 1G
    

十、发布到镜像仓库

1. 登录 Docker Hub
docker login
2. 标记镜像
docker tag my-java-app:1.0 username/my-java-app:1.0
3. 推送镜像
docker push username/my-java-app:1.0

十一、常见问题排查

  1. 容器无法启动

    docker logs <容器ID>  # 查看日志
    docker ps -a         # 查看所有容器(包括已停止的)
    
  2. 端口冲突

    docker run -p 8081:8080 ...  # 修改主机端口
    
  3. 应用无法访问数据库

    • 检查数据库服务是否正常运行
    • 确认数据库连接 URL 中的主机名(容器名或 IP)是否正确
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值