3、Docker API概述:Docker Engine API版本、RESTful接口、默认通信端口(2375/2376)
Docker Engine API 是 Docker 守护进程(dockerd)对外暴露的核心控制接口。所有 Docker 客户端(包括 CLI、Docker Compose、Kubernetes 的 dockershim、第三方管理工具)都通过该 API 与守护进程通信。理解 API 版本、RESTful 设计以及默认端口,是后续配置鉴权拦截和排查通信故障的基础。
3.1 Docker Engine API 版本机制
Docker Engine API 采用显式版本号策略,确保客户端与守护进程之间的向后兼容性。每个 API 请求都必须指定版本号,格式为 vX.YY。
| 版本字段 | 说明 | 示例 |
|---|---|---|
| 主版本(X) | 重大架构变更,不保证向后兼容 | v1 → v2(极少发生) |
| 次版本(YY) | 功能增删、字段变更,向后兼容 | v1.24 → v1.41 |
| 最新版 | 客户端可协商使用守护进程支持的最高版本 | v1.47(Docker 25.x) |
最佳实践:生产环境中始终在请求路径中指定 API 版本,避免依赖默认版本协商。例如:
/v1.41/containers/json。这可以防止因守护进程升级导致客户端请求行为意外变化。
3.2 RESTful 接口设计
Docker Engine API 严格遵循 RESTful 风格,使用 HTTP 方法对资源进行 CRUD 操作。所有请求和响应体均采用 JSON 格式。
| HTTP 方法 | 操作语义 | 典型资源路径 |
|---|---|---|
GET |
列出资源或获取单个资源详情 | /containers/json、/containers/{id}/json |
POST |
创建新资源或触发操作 | /containers/create、/containers/{id}/start |
PUT |
全量更新资源 | /networks/{id} |
DELETE |
删除资源 | /containers/{id}、/images/{id} |
以下是一个典型的容器列表请求示例:
# 请求
GET /v1.41/containers/json?all=true HTTP/1.1
Host: localhost:2375
# 响应(截取)
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"Id": "a1b2c3d4e5f6...",
"Names": ["/my-app"],
"Image": "nginx:1.25",
"State": "running",
"Status": "Up 2 hours",
"Ports": [{"PrivatePort": 80, "PublicPort": 8080, "Type": "tcp"}]
}
]
3.3 默认通信端口:2375 与 2376
Docker 守护进程默认监听两个 TCP 端口,分别对应未加密和加密通信。这是鉴权拦截配置的入口点。
| 端口 | 协议 | TLS | 用途 | 安全风险 |
|---|---|---|---|---|
| 2375 | HTTP | 无 | 明文 API 通信(仅限内网或调试) | 极高——任何能访问该端口的人可完全控制 Docker 守护进程 |
| 2376 | HTTPS | 强制 | 加密 API 通信(生产环境标准) | 低——需客户端证书认证 |
安全警告:切勿将 2375 端口暴露到公网或不可信网络。未加密的 Docker API 没有任何身份验证机制,攻击者可以通过
docker -H tcp://<IP>:2375 run --privileged ... 直接获取宿主机 root 权限。生产环境必须使用 2376 端口并配置 TLS 双向认证。
3.4 Docker API 通信架构总览
下图展示了 Docker 客户端通过 RESTful API 与守护进程通信的完整路径,以及端口 2375/2376 在其中的位置。
3.5 端口配置与验证
Docker 守护进程通过 /etc/docker/daemon.json 配置文件控制监听地址和端口。以下是常见配置场景:
{
"hosts": [
"unix:///var/run/docker.sock",
"tcp://0.0.0.0:2375",
"tcp://0.0.0.0:2376"
],
"tls": true,
"tlscacert": "/etc/docker/ca.pem",
"tlscert": "/etc/docker/server-cert.pem",
"tlskey": "/etc/docker/server-key.pem"
}
验证端口是否正常监听:
# 查看 Docker 守护进程监听端口
ss -tlnp | grep -E '2375|2376'
# 测试 2375 端口(明文)
curl http://localhost:2375/v1.41/version
# 测试 2376 端口(TLS)
curl --cacert /etc/docker/ca.pem \
--cert /etc/docker/cert.pem \
--key /etc/docker/key.pem \
https://localhost:2376/v1.41/version
故障排查要点:
- 如果 2375 端口无法访问,检查
daemon.json中是否显式配置了tcp://0.0.0.0:2375,以及防火墙是否放行。 - 如果 2376 端口连接失败,优先检查 TLS 证书路径和权限,以及
tlsverify是否设置为true。 - 使用
docker system info查看当前守护进程的Server Version和Registry配置,确认 API 版本兼容性。
3.6 版本协商与故障场景
当客户端请求的 API 版本与守护进程不匹配时,Docker 会返回明确的错误码。下表列出常见版本相关故障:
| 错误场景 | HTTP 状态码 | 错误信息示例 | 解决方案 |
|---|---|---|---|
| 客户端版本过高 | 400 Bad Request | client version 1.47 is too new. Maximum supported API version is 1.45 |
降低客户端 API 版本或升级 Docker Engine |
| 客户端版本过低 | 400 Bad Request | client version 1.12 is too old. Minimum supported API version is 1.24 |
升级客户端 SDK 或 Docker CLI |
| 未指定版本 | 200 OK(但行为不确定) | 守护进程使用默认版本,可能返回意外字段 | 始终在 URL 中显式指定版本号 |