前言
Docker是一个轻量级的容器化平台,可将应用及其依赖打包成标准化单元,实现快速部署和环境隔离。本文以Spring Boot项目为例,演示如何通过Dockerfile部署Java应用。
准备工作
-
本地环境
- 安装Docker Desktop(官网下载)
- JDK 8+ 和 Maven/Gradle
- Spring Boot项目(可通过
mvn clean package
生成JAR包)
-
项目结构
my-java-app/ ├── src/ ├── pom.xml └── target/my-app.jar # 打包后的可执行JAR
步骤1:编写Dockerfile
在项目根目录创建名为Dockerfile
的文件(无后缀),内容如下:
# 使用官方Java基础镜像(推荐选择alpine精简版)
FROM openjdk:17-jdk-alpine
# 设置工作目录
WORKDIR /app
# 复制Maven生成的JAR包到镜像中
COPY target/my-app.jar /app/my-app.jar
# 声明暴露端口(与Spring Boot的server.port一致)
EXPOSE 8080
# 启动Java应用
ENTRYPOINT ["java", "-jar", "my-app.jar"]
# 可选:添加JVM参数(如内存限制)
# ENTRYPOINT ["java", "-Xmx512m", "-jar", "my-app.jar"]
步骤2:构建Docker镜像
在终端中进入项目目录,执行以下命令构建镜像:
# -t 指定镜像名称和标签
docker build -t my-java-app:1.0 .
输出示例:
Successfully built 7d9492d78f3c
Successfully tagged my-java-app:1.0
步骤3:运行Docker容器
# 运行容器并将宿主机8080端口映射到容器8080端口
docker run -d -p 8080:8080 --name java-container my-java-app:1.0
-d
: 后台运行-p
: 端口映射(主机端口:容器端口)--name
: 指定容器名称
步骤4:验证部署
-
查看容器状态
docker ps -a
若STATUS显示
Up
,则运行正常。 -
访问应用
浏览器打开http://localhost:8080
,检查应用接口。 -
查看日志
docker logs -f java-container
高级配置示例
多阶段构建(优化镜像体积)
# 第一阶段:使用Maven构建
FROM maven:3.8.6-openjdk-17 AS build
WORKDIR /workspace
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
# 第二阶段:生成最终镜像
FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=build /workspace/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
常见问题排查
-
端口冲突
- 错误:
Bind for 0.0.0.0:8080 failed: port is already allocated
- 解决:修改主机端口
-p 8090:8080
或停止占用端口的进程
- 错误:
-
镜像构建失败
- 确保Dockerfile中的JAR文件名与实际打包名称一致
- 检查是否已执行
mvn clean package
-
时区问题
在Dockerfile中设置时区:RUN apk add --no-cache tzdata && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone
总结
通过Dockerfile定义部署流程,可实现Java应用的一键容器化。结合CI/CD工具(如Jenkins、GitHub Actions),可进一步自动化构建和发布流程。