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

如何在Docker-in-Docker(Dind)环境中使用Docker API

在Docker-in-Docker环境中取消DOCKER_HOST后使用Docker API的解决方法

问题背景

我通过docker run --privileged -it docker:dind sh启动了Docker-in-Docker(DinD)环境,已知需要取消设置DOCKER_HOST环境变量才能使用内部Docker服务,但取消后不知道如何正确调用Docker API。尝试配置/etc/docker/daemon.json如下:

{
    "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}

操作后出现错误:

Get "http://docker:2375/_ping": dial tcp: lookup docker on 10.10.15.22:53: server misbehaving

解决方案

1. 避免daemon.json与DinD默认配置冲突

DinD镜像默认通过命令行参数配置Docker守护进程的监听地址,而非daemon.json。同时使用daemon.json的hosts字段会和默认启动参数冲突,导致守护进程地址配置异常,这是出错的核心原因。

2. 正确配置API访问方式

取消DOCKER_HOST后,Docker客户端默认通过Unix套接字/var/run/docker.sock连接本地守护进程,这是最安全的默认方式。如果需要TCP访问API,可按以下两种方式操作:

方式一:启动DinD时直接指定监听地址

启动容器时通过dockerd参数同时指定Unix套接字和TCP端口,无需修改daemon.json:

docker run --privileged -it docker:dind dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

启动后,守护进程会同时监听本地Unix套接字和所有网卡的2375端口。

方式二:临时指定客户端连接地址

如果容器已启动,取消DOCKER_HOST后,可通过以下方式调用API:

# 取消残留的DOCKER_HOST设置
unset DOCKER_HOST

# 通过Unix套接字调用(默认方式,无需额外配置)
curl --unix-socket /var/run/docker.sock http://localhost/_ping

# 若需通过TCP调用(确保守护进程已监听2375端口)
export DOCKER_HOST=tcp://127.0.0.1:2375
curl http://localhost/_ping

3. 错误排查

你遇到的DNS解析错误,是因为客户端仍在尝试解析docker主机名。可通过以下命令排查残留配置:

# 检查当前DOCKER_HOST值
echo $DOCKER_HOST

# 检查用户级Docker配置是否有异常
cat ~/.docker/config.json

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:52:41