Docker Client 是一次性命令行工具,每次执行如 docker run 均启动新进程,完成 HTTP 请求后立即退出,不保活、不缓存、不维持连接,完全依赖 Daemon 提供服务。

Docker Client 的生命周期非常短暂,它不是长期驻留的进程,而是一次性命令执行工具。每次你输入 docker run、docker ps 或 docker build,系统都会启动一个新的 Client 实例,完成请求后立即退出——不保活、不缓存、不维持连接。
Docker Client 启动即用,用完即弃
Client 本质是用户态的可执行程序(docker 二进制文件),它的“生命周期”严格对应一次命令调用:
- 用户键入命令 → 系统 fork 出新进程,加载 docker CLI 二进制
- CLI 解析参数、构造 HTTP 请求(如 POST /containers/create)
- 通过配置的通信方式(
unix:///var/run/docker.sock或tcp://192.168.1.10:2376)发给 Docker Daemon - 收到响应后格式化输出到终端,进程终止
它不维护状态,也不依赖后台服务运行
Docker Client 自身无守护进程、无内存状态、不监听端口。它完全依赖 Docker Daemon 提供服务,但自身不参与容器管理逻辑:
- 不会记录上次执行了什么容器,也不会自动重连失败请求
- 环境变量如
DOCKER_HOST或DOCKER_TLS_VERIFY每次都重新读取,不跨命令生效 - 即使 Daemon 崩溃,Client 只会报错退出,不会尝试恢复或重试
通信方式决定连接起点,但不延长生命周期
Client 支持三种后端连接协议,但无论哪种,都只在本次请求中建立和关闭连接:
-
unix:///var/run/docker.sock:最常用,走本地 Unix 域套接字,零网络开销 -
tcp://host:port:用于远程管理,需显式启用 Daemon 的 TCP 监听(默认关闭) -
fd://socketfd:由 systemd 等初始化系统传递已打开的 socket 文件描述符,多见于容器化部署场景
所有通信均基于 RESTful HTTP API,使用标准方法(GET/POST/PUT/DELETE),但 Client 不复用连接,每次都是新建 HTTP 客户端实例。
和 Daemon 的关系是单向请求-响应,不是长会话
Docker Daemon 是常驻进程,持续监听并调度资源;Client 只是它的“传令兵”:
- Daemon 负责镜像解压、rootfs 挂载、cgroups 配置、网络命名空间创建等重操作
- Client 不做任何容器运行时工作,连容器 PID 都不知道(由 Daemon 返回)
- 比如
docker run -d后返回容器 ID,后续日志、exec、stop 全靠再次启动新 Client 发起新请求


















