You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需DockerHub,Jenkins构建镜像部署Spring Boot微服务至Kubernetes的可行性

当然可以完全绕开Docker Hub这类公共镜像仓库!你担心客户代码泄露的顾虑非常合理,下面我给你分享几种可行的方案,全程在私有环境内完成镜像构建和Kubernetes部署,完全不用碰公共平台。

方案1:本地镜像导入(适合单节点K8s集群)

如果你的K8s是单节点集群,或者可以接受手动同步镜像到所有节点,这种方式最直接——Jenkins构建镜像后,直接把镜像导入到K8s节点的本地Docker存储,不用推送任何仓库。

具体步骤:

  • 先在Jenkins节点配置Docker-in-Docker(DinD)环境,确保Jenkins能正常构建Docker镜像。
  • 构建完成后,用docker save把镜像导出为tar包:
    docker save -o my-springboot-app.tar my-springboot-service:v1.0.0
    
  • 通过kubectl cp把tar包传到K8s节点:
    kubectl cp my-springboot-app.tar k8s-node-01:/tmp/
    
  • 登录到K8s节点,加载镜像到本地Docker:
    docker load -i /tmp/my-springboot-app.tar
    
  • 最后部署K8s资源时,直接使用本地镜像名(比如my-springboot-service:v1.0.0)即可,K8s会优先使用节点本地的镜像。

⚠️ 注意:如果是多节点集群,每个节点都需要重复导入镜像,维护成本较高,更推荐下面的私有仓库方案。

方案2:搭建私有镜像仓库(生产环境首选)

这是最可持续的方案,自己搭建一个私有镜像仓库,所有镜像都存储在内部环境,完全对外隔离,还能配合权限控制保障安全。常用的私有仓库有两种:

2.1 轻量版:Docker Registry

如果只是需要基础的镜像存储功能,用官方的Docker Registry就足够了,启动非常简单:

docker run -d -p 5000:5000 --restart=always --name private-registry registry:2

之后需要做两步配置:

  • 在Jenkins节点和所有K8s节点的Docker daemon配置文件(/etc/docker/daemon.json)中添加私有仓库地址,允许非HTTPS访问(如果没配置证书的话):
    {
      "insecure-registries": ["your-registry-ip:5000"]
    }
    
    配置后重启Docker服务。
  • 在Jenkins的凭证管理中存储私有仓库的用户名密码(如果设置了认证的话),构建流程调整为:
    1. 构建镜像时带上私有仓库标签:docker build -t your-registry-ip:5000/my-springboot-service:v1.0.0 .
    2. 登录私有仓库:docker login your-registry-ip:5000 -u $REGISTRY_USER -p $REGISTRY_PWD
    3. 推送镜像到私有仓库:docker push your-registry-ip:5000/my-springboot-service:v1.0.0
    4. 部署K8s资源时,镜像地址直接用your-registry-ip:5000/my-springboot-service:v1.0.0即可。

2.2 企业版:Harbor

如果需要更完善的功能(比如UI界面、镜像扫描、权限分组、多项目管理),推荐用Harbor。可以用Helm直接部署到你的K8s集群里,完全集成到内部环境,安全性和可维护性更高。

方案3:K8s内部直接构建部署(无需外部仓库)

借助Jenkins的Kubernetes插件和Kaniko工具,可以在K8s集群内部的Pod里直接构建镜像,然后部署,全程不用把镜像推送到外部仓库。

Kaniko是Google开发的工具,不需要依赖Docker daemon就能构建镜像,非常适合在K8s Pod环境中使用。核心流程:

  • 在Jenkins中安装Kubernetes插件,配置好与你的K8s集群的连接。
  • 创建Pipeline任务,使用Kubernetes Agent,在Pod中运行Kaniko构建镜像,直接生成镜像后部署到K8s。

示例Pipeline片段:

pipeline {
  agent {
    kubernetes {
      yaml '''
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: kaniko
    image: gcr.io/kaniko-project/executor:latest
    args: ["--dockerfile=./Dockerfile", "--context=.", "--destination=my-springboot-service:v1.0.0", "--no-push"]
    volumeMounts:
    - name: workspace
      mountPath: /workspace
  volumes:
  - name: workspace
    persistentVolumeClaim:
      claimName: jenkins-pvc
'''
    }
  }
  stages {
    stage('拉取代码') {
      steps {
        git url: 'http://your-internal-git-repo/my-springboot-service.git', branch: 'main'
      }
    }
    stage('构建镜像') {
      steps {
        container('kaniko') {
          sh '/kaniko/executor'
        }
      }
    }
    stage('部署到K8s') {
      steps {
        sh 'kubectl apply -f ./k8s/deployment.yaml'
      }
    }
  }
}

这种方式的优势是全程在K8s内部完成,避免了镜像在外部传输的风险,适合对安全性要求极高的场景。

关键注意事项
  • 所有方案都要确保操作在私有网络内进行,禁止把镜像或代码暴露到公网。
  • 如果使用私有仓库,一定要配置认证机制(用户名密码、TLS证书),防止未授权访问。
  • 多节点集群优先选择方案2(私有仓库),维护成本最低,扩展性最好。

内容的提问来源于stack exchange,提问作者Mr.DevEng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:07:54