使用 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
十一、常见问题排查
-
容器无法启动
docker logs <容器ID> # 查看日志 docker ps -a # 查看所有容器(包括已停止的)
-
端口冲突
docker run -p 8081:8080 ... # 修改主机端口
-
应用无法访问数据库
- 检查数据库服务是否正常运行
- 确认数据库连接 URL 中的主机名(容器名或 IP)是否正确