Docker Client通过REST API将命令(如docker run)转换为HTTP请求,经Unix套接字(默认/var/run/docker.sock)或TCP+TLS发送至dockerd;dockerd内置HTTP Server监听该套接字,解析请求、调用对应处理器并返回JSON响应。

Docker Client 发送的 REST API 请求,最终由 Docker 守护进程(dockerd)接收并处理。这个过程不涉及“网络服务端监听 HTTP 端口”这种常规 Web 服务模式,而是依赖底层通信机制与守护进程的主动监听能力。
关键点在于:Client 并不直接“发送 HTTP 请求”到某个 IP+端口,而是通过预设通道(如 Unix socket)把符合 REST API 规范的请求发给已运行的 dockerd 进程。
Docker Client 如何构造并发出 REST API 请求
- CLI 命令(如
docker run nginx)被客户端解析为一系列标准 REST API 调用- 先 POST
/containers/create创建容器配置 - 再 POST
/containers/{id}/start启动它
- 先 POST
- 请求路径、方法、请求头(如
Content-Type: application/json)、请求体(JSON 格式参数)都严格遵循 Docker Engine API 文档 定义 - 客户端使用 Go SDK(如
github.com/docker/docker/client)自动封装这些细节,包括:- 自动选择通信方式(默认
/var/run/docker.sock) - 自动协商 API 版本(如
/v1.44/...) - 序列化结构体为 JSON、处理响应状态码和错误
- 自动选择通信方式(默认
Docker 守护进程如何接收并响应这些请求
-
dockerd启动时会初始化一个 HTTP Server(基于 Go 的net/http),但它不监听 TCP 端口(除非显式配置),而是:- 默认绑定到 Unix domain socket 文件
/var/run/docker.sock - 该文件由
dockerd创建并持有监听权限(需 root 或 docker 组用户访问)
- 默认绑定到 Unix domain socket 文件
- 当 Client 向该 socket 发起连接(类似本地 TCP,但走文件系统),
dockerd的 HTTP Server 接收连接,解析 HTTP 请求行、头、体 - 请求路由由内部 mux(如
gorilla/mux)分发到对应 handler,例如:-
POST /containers/create→ 调用containerCreate处理函数 - 函数校验参数、拉取镜像、准备 rootfs、调用 containerd 创建 runtime 容器等
-
- 执行完成后,
dockerd将标准 HTTP 响应(含状态码、JSON body、headers)写回 socket,Client 读取并展示结果(如容器 ID)
通信方式可选,但默认是 Unix socket
-
Unix socket(默认)
- 路径:
unix:///var/run/docker.sock - 优势:零网络开销、权限可控(文件属主/组限制访问)、无需 TLS 配置
- 限制:仅限本机通信
- 路径:
-
TCP socket(需手动启用)
- 启动
dockerd时加参数:--host tcp://0.0.0.0:2375(不安全)或--host tcp://0.0.0.0:2376 --tlsverify(启用 TLS) - Client 需指定:
export DOCKER_HOST=tcp://<ip>:2376+ TLS 证书路径 - 常用于远程管理或 CI 环境,但生产环境慎用裸 HTTP
- 启动
-
Named pipe(Windows)
- 类似 Unix socket,路径为
npipe:////./pipe/docker_engine
- 类似 Unix socket,路径为
实际验证方式很简单
你可以跳过 CLI,直接用 curl 模拟 Client 行为:
# 查看本地所有容器(GET 请求)
curl --unix-socket /var/run/docker.sock http://localhost/containers/json
# 创建一个容器(POST 请求)
curl -X POST \
--unix-socket /var/run/docker.sock \
-H "Content-Type: application/json" \
-d '{"Image":"alpine","Cmd":["echo","hello"]}' \
http://localhost/containers/create只要 dockerd 正在运行且 socket 可读写,就能收到并响应——这说明 REST API 不是“独立服务”,而是 dockerd 内置 HTTP Server 对 socket 连接的一层协议封装。


















