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):
- 编辑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是简化测试的方式,别直接用于生产!
- 重启Docker服务使配置生效:
sudo systemctl restart docker - 在Jenkins主机上测试Docker Daemon连接是否正常:
返回Docker版本信息就算配置成功。curl http://{docker-daemon-ip}:2375/version
第二步:修正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全局凭证(推荐)
- 进入Jenkins的「Manage Jenkins」→「Manage Credentials」,添加一个「Username with password」类型的凭证,填写私有Registry的用户名和密码,给凭证设置一个ID(比如
registry-creds)。 - 在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
相关产品推荐
相关产品推荐

