Docker 容器化 Spring Boot 应用实战指南

1. 准备 Spring Boot 应用
  • 确保应用已通过 Maven/Gradle 打包成可执行 JAR 文件:
    mvn clean package   # Maven
    ./gradlew build     # Gradle
    

  • 生成的 JAR 文件路径:target/your-app.jar(Maven)或 build/libs/your-app.jar(Gradle)

2. 创建 Dockerfile

在项目根目录创建 Dockerfile(无文件扩展名),内容如下:

# 使用 OpenJDK 官方镜像
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 复制 JAR 文件到容器
COPY target/your-app.jar app.jar

# 暴露应用端口(与 application.properties 中端口一致)
EXPOSE 8080

# 启动应用
ENTRYPOINT ["java", "-jar", "app.jar"]

参数说明

  • openjdk:17-jdk-slim:轻量级 Java 17 基础镜像
  • EXPOSE 8080:声明容器监听端口(需与 Spring Boot 端口匹配)
  • ENTRYPOINT:不可变启动命令,保证容器行为一致

3. 构建 Docker 镜像
docker build -t springboot-app:1.0 .  # -t 指定镜像名称和标签

验证镜像

docker images | grep springboot-app


4. 本地运行测试
docker run -d -p 8080:8080 --name myapp springboot-app:1.0

检查状态

docker ps -a | grep myapp
curl http://localhost:8080/health


5. 部署到服务器
5.1 推送镜像到仓库
docker tag springboot-app:1.0 your-dockerhub/springboot-app:1.0
docker push your-dockerhub/springboot-app:1.0

5.2 服务器操作
# 拉取镜像
docker pull your-dockerhub/springboot-app:1.0

# 启动容器(生产环境推荐)
docker run -d \
  -p 80:8080 \                  # 外部端口:容器端口
  --restart=always \            # 自动重启
  -v /app/logs:/var/logs \      # 日志持久化
  --name production-app \
  your-dockerhub/springboot-app:1.0


6. 生产环境优化建议
  1. 使用多阶段构建 减小镜像体积:

    FROM maven:3.8.6 AS build
    COPY . .
    RUN mvn package
    
    FROM openjdk:17-jdk-slim
    COPY --from=build /target/your-app.jar app.jar
    ENTRYPOINT ["java","-jar","app.jar"]
    

  2. 添加健康检查

    HEALTHCHECK --interval=30s --timeout=3s \
      CMD curl -f http://localhost:8080/actuator/health || exit 1
    

  3. 环境变量配置

    docker run -d \
      -e "SPRING_PROFILES_ACTIVE=prod" \
      -e "DB_URL=jdbc:mysql://db-host:3306/mydb" \
      ...
    


7. 常用运维命令
场景 命令
查看日志 docker logs -f production-app
进入容器 docker exec -it production-app /bin/bash
停止容器 docker stop production-app
更新版本 docker pull your-dockerhub/springboot-app:2.0<br>docker restart production-app

关键提示

  1. 确保服务器已安装 Docker Engine(docker --version验证)
  2. 生产环境建议使用 Docker Compose 编排多容器
  3. 敏感信息(如数据库密码)应通过 secrets 或环境变量注入

更多推荐