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

Jenkins连接远程私有Docker Registry测试时出现404错误

解决Jenkins Docker Cloud连接404错误及推送镜像到私有Registry的方案

哦,我一眼就看出问题所在了——你把Docker私有Registry的地址填到Jenkins Docker Cloud的Docker Host URI里了,这俩根本不是一回事儿!咱们一步步拆解解决:

为什么会出现404错误?

Jenkins的Docker Cloud配置是用来连接Docker Daemon(也就是运行Docker服务的后台进程)的,它需要访问Docker Daemon提供的API端点(默认是unix:///var/run/docker.sock或者TCP端口2375/2376)。而你填的是私有Registry的地址,Registry只是存储Docker镜像的仓库,它不提供Docker Daemon的API,所以自然会返回404。

第一步:正确配置Docker Daemon的远程访问

你需要在运行Docker的主机上,配置Docker Daemon允许远程TCP连接(这样Jenkins才能通过网络调用它的API):

  1. 编辑Docker的配置文件/etc/docker/daemon.json,添加如下内容(如果文件不存在就新建):
    {
      "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"],
      "insecure-registries": ["{registry-ip}:{registry-port}"]  // 无认证Registry需要加这行,有认证可暂时忽略
    }
    

    注意:生产环境强烈建议用TLS加密的2376端口,2375是简化测试的方式,别直接用于生产!

  2. 重启Docker服务使配置生效:
    sudo systemctl restart docker
    
  3. 在Jenkins主机上测试Docker Daemon连接是否正常:
    curl http://{docker-daemon-ip}:2375/version
    
    返回Docker版本信息就算配置成功。

第二步:修正Jenkins Docker Cloud的连接配置

回到Jenkins界面,修改Clouds里的Docker连接:

  • 将Docker Host URI改为tcp://{docker-daemon-ip}:2375(就是刚才配置的Docker Daemon的IP和端口)
  • 点击“测试连接”,这时候应该能显示Docker版本信息,连接成功。

第三步:配置Jenkins推送镜像到私有Registry

现在Docker Cloud连接正常了,接下来配置推送镜像到你的私有Registry:

方式1:使用Jenkins全局凭证(推荐)

  1. 进入Jenkins的「Manage Jenkins」→「Manage Credentials」,添加一个「Username with password」类型的凭证,填写私有Registry的用户名和密码,给凭证设置一个ID(比如registry-creds)。
  2. 在Jenkins Pipeline里,用docker.withRegistry包裹构建和推送步骤:
    pipeline {
        agent any
        stages {
            stage('Build and Push Image') {
                steps {
                    script {
                        // 指定私有Registry地址和凭证ID
                        docker.withRegistry('http://{registry-ip}:{registry-port}', 'registry-creds') {
                            def customImage = docker.build('my-app-image:latest')
                            // 推送到私有Registry,镜像名会自动加上Registry前缀
                            customImage.push()
                            // 如需推送多tag,比如latest和版本号
                            customImage.push('v1.0.0')
                        }
                    }
                }
            }
        }
    }
    

方式2:无认证Registry的推送(不推荐生产用)

如果你的私有Registry没有开启认证,直接在构建时指定完整镜像名即可:

def customImage = docker.build('{registry-ip}:{registry-port}/my-app-image:latest')
customImage.push()

记得之前在Docker Daemon配置里加了insecure-registries,否则Docker会拒绝推送到无HTTPS的Registry。

关键提醒

  • Docker Daemon是负责构建、运行容器的服务,私有Registry是存储镜像的仓库,两者地址和作用完全不同,千万别搞混!
  • 如果私有Registry是HTTPS的,不需要配置insecure-registries,但要确保Docker Daemon信任Registry的证书。

内容的提问来源于stack exchange,提问作者Going Bananas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:17:47