Docker CLI 作为客户端通过 HTTP 调用 Docker Daemon 的 REST API 实现操作,默认经 Unix 域套接字通信,支持 TCP/TLS 切换;所有命令如 docker ps、run 均转为对应 HTTP 请求,Go SDK 提供类型安全封装,调试可借助 --debug、curl 或 tcpdump。

Docker CLI(docker 命令)本身不直接操作容器,而是作为 Docker Daemon 的客户端,通过 HTTP 协议调用其暴露的 REST API 完成所有操作。
CLI 与 Daemon 的通信机制
Docker CLI 默认通过 Unix 域套接字(/var/run/docker.sock)与本地 Docker Daemon 通信;在 macOS/Windows 上则经由 Docker Desktop 的代理转发。也可显式指定 DOCKER_HOST 环境变量切换为 TCP 连接(如 tcp://192.168.1.100:2375),此时需注意 TLS 认证配置。
- 所有
docker ps、docker run、docker build等命令,最终都转换为对应 HTTP 请求(方法 + 路径 + JSON body + 查询参数) - 例如
docker ps -a等价于发送GET /v1.44/containers/json?all=1 - API 版本(如
v1.44)随 Docker 引擎版本演进,CLI 会自动协商兼容版本
REST API 请求结构示例
以创建并启动一个容器为例:
- CLI 执行:
docker run -d --name mynginx nginx:alpine - 实际发出的 API 请求为:
POST /v1.44/containers/create?name=mynginx
请求体(JSON)包含镜像名、网络模式、端口绑定等配置 - 随后立即发起:
POST /v1.44/containers/mynginx/start - 响应返回容器 ID,CLI 解析后输出(如
abc123...)
Go 客户端库如何封装 API
Docker 官方 Go SDK(github.com/docker/docker/api/types 及 github.com/docker/docker/client)是对 REST API 的类型安全封装:
-
client.NewClientWithOpts()初始化客户端,自动处理 socket/TCP/TLS 连接和 API 版本协商 - 每个操作对应一个方法,如
cli.ContainerCreate()封装了POST /containers/create的序列化、请求发送与错误解析 - 结构体字段(如
types.ContainerCreateConfig)与 API 文档中 JSON Schema 严格对应,编译期可检错 - 流式接口(如
cli.ImagePull()返回io.ReadCloser)用于处理分块响应(如拉取镜像日志)
调试与验证技巧
理解交互原理有助于排查问题:
- 启用 CLI 调试模式:
docker --debug ps,查看完整 HTTP 请求/响应头与体 - 直接调用 API:
curl --unix-socket /var/run/docker.sock http://localhost/v1.44/info - 使用
tcpdump或strace -e trace=connect,sendto,recvfrom docker ps观察底层系统调用 - 第三方工具如
httpie或 Postman(配合 Docker Desktop 的 TCP endpoint)可手动构造请求测试










