无需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访问(如果没配置证书的话):
配置后重启Docker服务。{ "insecure-registries": ["your-registry-ip:5000"] } - 在Jenkins的凭证管理中存储私有仓库的用户名密码(如果设置了认证的话),构建流程调整为:
- 构建镜像时带上私有仓库标签:
docker build -t your-registry-ip:5000/my-springboot-service:v1.0.0 . - 登录私有仓库:
docker login your-registry-ip:5000 -u $REGISTRY_USER -p $REGISTRY_PWD - 推送镜像到私有仓库:
docker push your-registry-ip:5000/my-springboot-service:v1.0.0 - 部署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
相关产品推荐
相关产品推荐

