从容器化到自动化:Spring Boot 项目 Docker 部署与 GitLab CI/CD 集成 Harbor 全流程

在现代微服务架构中,容器化 和自动化流水线是必备技能。本文将带你完成两个关键步骤:

  1. Spring Boot 项目容器化 ------ 使用多阶段 Dockerfile 构建轻量、安全的运行镜像。
  2. CI/CD 自动化 ------ 借助 GitLab CI/CD,将镜像自动构建并推送到 Harbor 私有仓库。

参考阅读:Java Spring Boot 项目 Docker 容器化部署教程


一、Spring Boot 项目容器化

1. Dockerfile 多阶段构建

dockerfile 复制代码
# 构建阶段
FROM maven:3.9.6-eclipse-temurin-17 AS builder
WORKDIR /build
COPY . .
RUN --mount=type=cache,target=/root/.m2 mvn -B clean package -DskipTests

# 运行阶段
FROM eclipse-temurin:17-jre-alpine
RUN addgroup -S sdkj && adduser -S sdkj -G sdkj
WORKDIR /app
COPY --from=builder /build/target/*.jar ./app.jar
RUN mkdir -p /app/logs && chown -R sdkj:sdkj /app/logs
ENV TZ=Asia/Shanghai
ENV JAVA_OPTS="-Xms512m -Xmx1024m"
ENV SPRING_PROFILE=prod
EXPOSE 48087
USER sdkj
ENTRYPOINT ["sh", "-c"]
CMD ["exec java $JAVA_OPTS -jar app.jar $ARGS"]

关键点:

  • 多阶段构建:减少最终镜像体积
  • 非 root 用户:提升安全性
  • 日志目录赋权:避免 logback 报错
  • 环境变量可覆盖:灵活配置 JVM 与 Profile

二、GitLab CI/CD 自动化构建与推送 Harbor

参考阅读:Spring Boot 项目 GitLab CI/CD 自动构建并推送到 Harbor 教程

1. 环境准备

  • GitLab Runner(Docker executor,挂载宿主机 Docker)
  • Harbor 私有仓库(已创建项目与机器人账号)
  • GitLab CI/CD 变量配置:
    • HARBOR_USER / HARBOR_PASS
    • CI_REGISTRY = 192.168.0.12:5080

2. .gitlab-ci.yml 核心配置

yaml 复制代码
stages:
  - build
  - push

variables:
  DOCKER_HOST: unix:///var/run/docker.sock
  DOCKER_BUILDKIT: "1"
  REGISTRY: 192.168.0.12:5080
  PROJECT: ayy-server
  IMAGE_NAME: ayy-server-java17

.docker-base: &docker-base
  image: docker:20.10.24
  before_script:
    - echo "$HARBOR_PASS" | docker login -u "$HARBOR_USER" --password-stdin $REGISTRY

build-test:
  <<: *docker-base
  stage: build
  script:
    - export IMAGE_TAG="test-${CI_COMMIT_SHORT_SHA}"
    - docker build -t $REGISTRY/$PROJECT/$IMAGE_NAME:$IMAGE_TAG .
    - echo "IMAGE_TAG=$IMAGE_TAG" > build.env
  artifacts:
    reports:
      dotenv: build.env
  only:
    - main

push-test:
  <<: *docker-base
  stage: push
  dependencies: [build-test]
  script:
    - docker push $REGISTRY/$PROJECT/$IMAGE_NAME:$IMAGE_TAG
  only:
    - main

3. 流程说明

  • main 分支 :构建并推送测试镜像(test-* 标签)
  • tag 发布 :构建并推送生产镜像(vX.Y.Z + prod-latest)
  • 缓存镜像:利用 BuildKit 内联缓存加速二次构建
  • 清理策略:推送后清理 Runner 本地镜像,避免磁盘膨胀

三、完整流程回顾

  1. 编写 Dockerfile ------ 多阶段构建、非 root、安全可配置
  2. 本地验证 ------ docker build + docker run
  3. 配置 GitLab Runner ------ 挂载宿主机 Docker,信任 Harbor 证书
  4. 编写 CI/CD 流水线 ------ 分支/标签策略、缓存加速、推送 Harbor
  5. 验证与上线 ------ Harbor 中查看镜像,部署到测试/生产环境

四、总结

通过本文,读者可以从零到一完成:

  • Spring Boot 项目容器化(Dockerfile 最佳实践)
  • CI/CD 自动化(GitLab Runner + Harbor 推送)

最终实现 代码提交 → 自动构建 → 镜像推送 → 部署上线 的完整闭环。

相关推荐
学长毕设6 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
ZhuoAIStage8 小时前
舞台工艺多专业审图提速:用 AI 智能体编排 A+B+C+G 四段读图流水线
人工智能·自动化·工作流编排·舞台工艺·审图智能体
zzu123zsw8 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号8 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
海绵宝宝的月光宝盒10 小时前
14-AutoCAD-阵列命令应用与案例实战(AR)
经验分享·笔记·自动化·课程设计·制造·学习方法·cad
字节探索11 小时前
Spring Boot 接口幂等性设计:从唯一索引到 Redis+Lua 的工程实践
java·spring boot
胡写代码11 小时前
删掉的数据还占着唯一键:逻辑删除 + 唯一索引的四次取舍
spring boot·后端
螺丝钉tina13 小时前
[Playwright][08] Upload 模块自动化:如何设计真实业务测试用例?
运维·自动化·测试用例
captain37614 小时前
Spring MVC(4)-响应
java·spring boot·后端
杨浦老苏15 小时前
把项目管理搬回自己服务器:Windshift部署与避坑
docker·项目管理·群晖