Docker API 调用实战:从本地 Socket 到远程访问的完整命令指南
Docker API接口调用教程|附完整命令
Docker 不只是一个命令行工具,它背后还有一套非常完整的 Docker Engine API。如果你想把 Docker 集成到自动化平台、CI/CD 流程、运维脚本、Web 管理后台,直接调用 Docker API 会比反复执行 docker 命令更灵活,也更适合程序化控制。
本文将从 Docker API 的基础概念、环境准备、开启远程接口、常用接口调用、完整命令示例、安全注意事项 等几个方面,带你系统掌握 Docker API 的调用方法。文章尽量以实战为主,方便你直接照着执行。
一、什么是 Docker API
Docker API 是 Docker Engine 对外提供的 HTTP 接口。你可以把它理解为:
docker rundocker psdocker imagesdocker inspect
这些命令背后其实都在访问 Docker 引擎。
而 Docker API 允许你直接通过 HTTP 请求 去完成这些操作。
常见用途包括:
- 自动创建和销毁容器
- 获取容器状态、日志、资源使用情况
- 在程序中管理镜像、网络、卷
- 做容器编排平台或管理面板
- 集成到 Python、Go、Java、Node.js 等应用里
二、Docker API 的访问方式
Docker API 通常有两种访问方式:
1)通过 Unix Socket 访问
这是最常见、也最安全的方式。
Docker 守护进程默认监听本地 Unix Socket:
/var/run/docker.sock
通过 curl --unix-socket 就可以直接访问:
curl --unix-socket /var/run/docker.sock http://localhost/version
这种方式一般只在本机使用。
2)通过 TCP 端口访问
Docker 也可以监听 TCP 端口,比如:
2375:未加密2376:TLS 加密
这适合远程访问,但一定要注意安全问题。
不要轻易把 2375 暴露到公网。
三、查看 Docker API 版本
在调用接口前,建议先确认 Docker Engine 的 API 版本。
1)查看 Docker 客户端和服务端版本
docker version
输出中你会看到类似:
Client:
Version: 27.x.x
API version: 1.45
Server:
Engine:
Version: 27.x.x
API version: 1.45
2)查看 API 可用版本
curl --unix-socket /var/run/docker.sock http://localhost/version
你会得到 JSON 响应,其中包含:
ApiVersionMinAPIVersionVersion
四、通过 Unix Socket 调用 Docker API
这是最推荐的入门方式。下面我们用 curl 来访问 Docker API。
1)获取 Docker 版本信息
curl --unix-socket /var/run/docker.sock http://localhost/version
返回示例:
{
"Platform": {
"Name": "Docker Engine - Community"
},
"Components": [
{
"Name": "Engine",
"Version": "27.0.3",
"Details": {
"ApiVersion": "1.45",
"MinAPIVersion": "1.24"
}
}
]
}
2)查看正在运行的容器
对应 docker ps。
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/json"
如果要查看全部容器,包括停止的:
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/json?all=1"
常见参数:
all=1:显示所有容器limit=10:限制数量size=1:显示容器大小
3)查看某个容器详情
对应 docker inspect 容器ID。
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/容器ID/json"
例如:
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/1a2b3c4d5e6f/json"
返回中会包含:
- 容器基础信息
- 配置参数
- 网络信息
- 挂载卷
- 环境变量
- 状态信息
4)查看容器日志
对应 docker logs。
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/容器ID/logs?stdout=1&stderr=1&tail=100"
常用参数:
stdout=1:输出标准日志stderr=1:输出错误日志tail=100:只显示最后 100 行follow=1:持续跟踪日志timestamps=1:显示时间戳
示例:
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/1a2b3c4d5e6f/logs?stdout=1&stderr=1&follow=1"
五、启动、停止、重启容器
这些操作在 API 中非常直接。
1)启动容器
对应 docker start。
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/容器ID/start"
例如:
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/1a2b3c4d5e6f/start"
2)停止容器
对应 docker stop。
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/容器ID/stop?t=10"
其中 t=10 表示优雅停止等待 10 秒后强制结束。
3)重启容器
对应 docker restart。
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/容器ID/restart?t=5"
4)杀死容器
对应 docker kill。
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/容器ID/kill"
六、创建并启动容器
这是 Docker API 最常见也最实用的部分。
1)创建容器
对应 docker create。
curl -X POST --unix-socket /var/run/docker.sock \
-H "Content-Type: application/json" \
-d '{
"Image": "nginx:latest",
"Cmd": ["nginx", "-g", "daemon off;"],
"HostConfig": {
"PortBindings": {
"80/tcp": [
{
"HostPort": "8080"
}
]
}
}
}' \
"http://localhost/v1.45/containers/create?name=mynginx"
这个命令会创建一个容器:
- 镜像:
nginx:latest - 容器名:
mynginx - 将容器 80 端口映射到宿主机 8080
2)启动刚创建的容器
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/mynginx/start"
3)一条命令完成“创建 + 启动”
严格来说 Docker API 是分开的,但你可以在脚本中按顺序执行:
container_id=$(curl -s -X POST --unix-socket /var/run/docker.sock \
-H "Content-Type: application/json" \
-d '{
"Image": "nginx:latest",
"Cmd": ["nginx", "-g", "daemon off;"]
}' \
"http://localhost/v1.45/containers/create?name=mynginx" | jq -r .Id)
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/$container_id/start"
如果你系统里没有 jq,可以先安装:
sudo apt-get install -y jq
七、执行容器内命令
对应 docker exec。
1)创建 exec 实例
curl -X POST --unix-socket /var/run/docker.sock \
-H "Content-Type: application/json" \
-d '{
"AttachStdout": true,
"AttachStderr": true,
"Cmd": ["echo", "hello docker"]
}' \
"http://localhost/v1.45/containers/容器ID/exec"
返回会得到一个 Id,这是 exec 实例 ID。
2)启动 exec
curl -X POST --unix-socket /var/run/docker.sock \
-H "Content-Type: application/json" \
-d '{
"Detach": false,
"Tty": false
}' \
"http://localhost/v1.45/exec/execID/start"
3)查看 exec 执行结果
执行过程中你会看到输出内容。
如果想在容器里执行 shell 命令,一般会这样写:
curl -X POST --unix-socket /var/run/docker.sock \
-H "Content-Type: application/json" \
-d '{
"AttachStdout": true,
"AttachStderr": true,
"Cmd": ["sh", "-c", "ls -al / && uname -a"]
}' \
"http://localhost/v1.45/containers/容器ID/exec"
八、镜像相关 API
1)查看本地镜像列表
对应 docker images。
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/images/json"
如果要查看全部镜像详细信息:
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/images/json?all=1"
2)拉取镜像
对应 docker pull。
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/images/create?fromImage=nginx&tag=latest"
拉取 redis:7:
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/images/create?fromImage=redis&tag=7"
3)查看镜像详情
对应 docker inspect 镜像ID。
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/images/nginx:latest/json"
也可以用镜像 ID:
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/images/镜像ID/json"
4)删除镜像
对应 docker rmi。
curl -X DELETE --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/images/镜像ID"
如果镜像被容器占用,可以加强制删除逻辑,但要谨慎。
九、网络相关 API
Docker 网络也可以通过 API 管理。
1)查看网络列表
对应 docker network ls。
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/networks"
2)创建网络
curl -X POST --unix-socket /var/run/docker.sock \
-H "Content-Type: application/json" \
-d '{
"Name": "mynet",
"Driver": "bridge"
}' \
"http://localhost/v1.45/networks/create"
3)查看网络详情
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/networks/网络ID"
4)将容器连接到网络
curl -X POST --unix-socket /var/run/docker.sock \
-H "Content-Type: application/json" \
-d '{
"Container": "容器ID"
}' \
"http://localhost/v1.45/networks/网络ID/connect"
5)从网络断开容器
curl -X POST --unix-socket /var/run/docker.sock \
-H "Content-Type: application/json" \
-d '{
"Container": "容器ID",
"Force": true
}' \
"http://localhost/v1.45/networks/网络ID/disconnect"
十、卷相关 API
容器数据持久化常常会用到 volume。
1)查看卷列表
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/volumes"
2)创建卷
curl -X POST --unix-socket /var/run/docker.sock \
-H "Content-Type: application/json" \
-d '{
"Name": "mydata"
}' \
"http://localhost/v1.45/volumes/create"
3)删除卷
curl -X DELETE --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/volumes/mydata"
十一、通过 TCP 调用 Docker API
如果你想远程调用 Docker API,可以让 Docker 守护进程监听 TCP 地址。
1)临时启动 Docker Daemon 监听 TCP
不建议直接在生产环境这么做,以下仅作演示。
dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
然后你就可以访问:
curl http://127.0.0.1:2375/version
查看容器:
curl http://127.0.0.1:2375/v1.45/containers/json
2)使用 TLS 的安全方式
更推荐使用 TLS:
dockerd \
-H unix:///var/run/docker.sock \
-H tcp://0.0.0.0:2376 \
--tlsverify \
--tlscacert=/etc/docker/ca.pem \
--tlscert=/etc/docker/server-cert.pem \
--tlskey=/etc/docker/server-key.pem
客户端调用时:
curl --cert client-cert.pem \
--key client-key.pem \
--cacert ca.pem \
https://docker-host:2376/version
十二、Docker API 与 docker 命令的对应关系
下面整理一份常用对照表,方便快速查找。
| Docker 命令 | API 接口 |
|---|---|
docker version |
GET /version |
docker ps |
GET /containers/json |
docker inspect |
GET /containers/{id}/json |
docker logs |
GET /containers/{id}/logs |
docker start |
POST /containers/{id}/start |
docker stop |
POST /containers/{id}/stop |
docker restart |
POST /containers/{id}/restart |
docker kill |
POST /containers/{id}/kill |
docker exec |
POST /containers/{id}/exec |
docker images |
GET /images/json |
docker pull |
POST /images/create |
docker rmi |
DELETE /images/{name} |
docker network ls |
GET /networks |
docker volume ls |
GET /volumes |
十三、一个完整实战示例:用 API 部署 Nginx
下面我们用完整流程演示一次“通过 API 部署 Nginx”。
第一步:拉取镜像
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/images/create?fromImage=nginx&tag=latest"
第二步:创建容器
curl -X POST --unix-socket /var/run/docker.sock \
-H "Content-Type: application/json" \
-d '{
"Image": "nginx:latest",
"Cmd": ["nginx", "-g", "daemon off;"],
"HostConfig": {
"PortBindings": {
"80/tcp": [
{
"HostPort": "8080"
}
]
}
}
}' \
"http://localhost/v1.45/containers/create?name=mynginx"
返回中记下容器 ID。
第三步:启动容器
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/mynginx/start"
第四步:访问服务
浏览器访问:
http://127.0.0.1:8080
如果一切正常,你会看到 Nginx 欢迎页。
第五步:查看日志
curl --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/mynginx/logs?stdout=1&stderr=1"
第六步:停止并删除容器
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/mynginx/stop?t=5"
curl -X DELETE --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/containers/mynginx?force=true"
十四、常见问题
1)为什么 API 请求返回 404?
最常见原因有:
- URL 写错
- API 版本号不正确
- 容器 ID 或镜像名错误
建议先查看版本:
curl --unix-socket /var/run/docker.sock http://localhost/version
然后在 URL 中使用正确版本号,例如 v1.45。
2)为什么 curl 访问不了 /var/run/docker.sock?
可能是权限问题。可以尝试:
sudo curl --unix-socket /var/run/docker.sock http://localhost/version
或者把当前用户加入 docker 组:
sudo usermod -aG docker $USER
newgrp docker
3)为什么创建容器时报错 “image not found”?
说明本地没有该镜像。先拉取:
curl -X POST --unix-socket /var/run/docker.sock \
"http://localhost/v1.45/images/create?fromImage=nginx&tag=latest"
4)API 是否可以跨语言调用?
可以。只要你能发 HTTP 请求,就能调用 Docker API。
比如:
- Python:
requests - Go:
net/http - Java:
OkHttp/HttpClient - Node.js:
axios/fetch
十五、安全建议
Docker API 很强大,也很危险。
如果攻击者能够访问 Docker API,几乎等于拿到了主机控制权。
请务必注意以下几点:
- 优先使用 Unix Socket
- 远程访问必须启用 TLS
- 不要暴露 2375 到公网
- 限制访问权限
- 不要随意把
docker.sock挂载到不可信容器中 - 在生产环境中记录审计日志
特别提醒:
如果一个容器挂载了宿主机的 /var/run/docker.sock,它实际上可以间接控制宿主机上的 Docker,风险极高。
十六、总结
Docker API 是 Docker 自动化管理的核心能力之一。相比直接调用 docker 命令,它更适合集成到程序、平台和脚本中。本文从基础概念讲到实战命令,覆盖了:
- 版本查询
- 容器列表与详情
- 创建、启动、停止、重启容器
- 日志查看
- exec 执行命令
- 镜像、网络、卷管理
- TCP 与 TLS 访问方式
- 安全注意事项
如果你希望进一步深入,可以继续学习:
- Docker API 与 Python 集成
- Docker API 与 Go 开发
- 基于 Docker API 的 Web 管理平台开发
- Docker Swarm / Compose 的自动化控制
如果你愿意,我还可以继续为你补一篇:
- 《Docker API 接口调用 Python 实战教程》
- 《Docker API 常用接口大全》
- 《Docker Remote API 安全配置教程》
你可以直接回复一个编号,我继续写。