升级Docker DinD后镜像构建失败 报ECONNREFUSED连接错误
故障根因
该问题是Docker DinD 20.x版本默认行为变更+自定义启动参数覆盖默认配置共同导致的:
- 18.09.x版本的官方dind镜像默认会监听无加密的2375 TCP端口接收请求,不需要额外配置即可被旧版客户端直连。
- 20.10.x版本的官方dind镜像默认安全策略升级:不再默认监听无加密的2375端口,仅监听本地Unix套接字
/var/run/docker.sock和强制开启TLS验证的2376 TCP端口;同时当用户在Kubernetes YAML中自定义args字段时,传入的参数会完全覆盖镜像内置的默认dockerd启动参数,原有配置仅指定了存储驱动和MTU值,没有显式声明端口监听规则,最终导致dockerd启动后根本没有在2375端口监听,客户端发起连接时直接触发ECONNREFUSED错误。
排查步骤
- 进入运行中的builder容器,执行
ss -tulnp | grep dockerd查看端口监听状态,可确认无进程监听2375端口,仅存在2376端口或Unix套接字的监听记录。 - 在容器内执行
ps aux | grep dockerd查看实际启动参数,可确认启动命令中未携带2375端口监听、TLS关闭相关配置。 - 检查构建客户端的环境变量配置,可确认客户端默认请求的目标端口仍为2375,与服务端实际监听端口不匹配。
解决方案
根据集群安全要求二选一即可:
方案1:兼容旧版无加密通信(适配内网可信集群,改造成本最低)
调整builder容器的YAML配置,显式关闭TLS并声明2375端口监听规则,和18.09版本行为完全对齐,客户端侧无需任何修改:
spec: containers: - name: builder image: docker:20.10.14-dind env: - name: DOCKER_TLS_CERTDIR value: "" args: ["--host=tcp://0.0.0.0:2375", "--host=unix:///var/run/docker.sock", "--storage-driver", "overlay2", "--mtu", "1460"] imagePullPolicy: Always resources:
注意:必须显式加上
--host=unix:///var/run/docker.sock参数,否则容器内本地执行docker命令会无法连接本地套接字。
配置更新后滚动重启Pod即可恢复所有构建任务。
方案2:采用默认TLS加密通信(安全性更高)
如果需要遵循20.x版本的默认安全规则使用加密通信:
- 保留dind默认的TLS配置,将dind自动生成的客户端证书目录挂载到所有执行构建任务的业务容器中。
- 将所有构建客户端的
DOCKER_HOST环境变量修改为tcp://<builder服务地址>:2376,同时配置DOCKER_TLS_VERIFY=1并指定正确的证书挂载路径,即可完成正常通信。
内容的提问来源于stack exchange,提问作者brandizzi
相关产品推荐
相关产品推荐

