docker守护进程可通过daemon.json的hosts字段或systemd服务文件的-h参数同时监听多个socket,如unix:///var/run/docker.sock和tcp://127.0.0.1:2375;需移除fd://以避免互斥,重启后用ss或docker -h测试验证。
docker 守护进程支持同时监听多个 socket 地址,比如本地 unix 套接字 + 本地 tcp 端口,或多个不同 ip 的 tcp 端口。关键不是“替换”,而是让 dockerd 启动时明确绑定多个 -h(host)地址。
通过 daemon.json 配置多地址监听
这是最推荐、最清晰的方式。编辑 /etc/docker/daemon.json,在 hosts 字段中列出所有要监听的地址:
- Unix 套接字:如
unix:///var/run/docker.sock(保留本地命令行可用) - 本地 TCP:如
tcp://127.0.0.1:2375(仅本机可连,较安全) - 远程 TCP(慎用):如
tcp://0.0.0.0:2375(开放给所有网络接口,必须配 TLS)
示例配置:
{
"hosts": [
"unix:///var/run/docker.sock",
"tcp://127.0.0.1:2375",
"tcp://127.0.0.1:2376"
]
}
保存后执行:sudo systemctl daemon-reload && sudo systemctl restart docker
通过 systemd service 文件配置(兼容旧版或特殊需求)
如果 daemon.json 不生效或需精细控制启动参数,可直接修改 systemd 服务文件:
- 先查路径:
systemctl status docker.service,看Loaded:行显示的实际文件位置 - 编辑该文件(如
/lib/systemd/system/docker.service) - 找到
ExecStart=行,在末尾添加多个-H参数,例如:ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://127.0.0.1:2375 -H tcp://127.0.0.1:2376 - 保存后同样执行
systemctl daemon-reload && systemctl restart docker
验证是否成功监听多个地址
重启后检查监听状态:
- 查 Unix socket:
ls -l /var/run/docker.sock(应存在且可访问) - 查 TCP 端口:
ss -tlnp | grep ':2375\|:2376'或netstat -tlnp | grep dockerd - 测试连接:
docker -H unix:///var/run/docker.sock info >/dev/null && echo OKdocker -H tcp://127.0.0.1:2375 info >/dev/null && echo OK
注意 fd:// 和多 host 的互斥关系
如果 systemd 服务中用了 -H fd://(默认常见配置),它会接管监听逻辑,此时再加其他 -H tcp:// 或 -H unix:// 会被忽略。要启用多地址,必须移除 fd://,改用显式 -H 列表或 daemon.json 中的 hosts。











