上一篇 下一篇 分享链接 返回 返回顶部

Docker API 调用实战:从本地 Socket 到远程访问的完整命令指南

发布人:慈云数据-客服中心 发布时间:9小时前 阅读量:1

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 run
  • docker ps
  • docker images
  • docker inspect

这些命令背后其实都在访问 Docker 引擎。
而 Docker API 允许你直接通过 HTTP 请求 去完成这些操作。

常见用途包括:

  1. 自动创建和销毁容器
  2. 获取容器状态、日志、资源使用情况
  3. 在程序中管理镜像、网络、卷
  4. 做容器编排平台或管理面板
  5. 集成到 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 响应,其中包含:

  • ApiVersion
  • MinAPIVersion
  • Version

四、通过 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,几乎等于拿到了主机控制权。

请务必注意以下几点:

  1. 优先使用 Unix Socket
  2. 远程访问必须启用 TLS
  3. 不要暴露 2375 到公网
  4. 限制访问权限
  5. 不要随意把 docker.sock 挂载到不可信容器中
  6. 在生产环境中记录审计日志

特别提醒:
如果一个容器挂载了宿主机的 /var/run/docker.sock,它实际上可以间接控制宿主机上的 Docker,风险极高。


十六、总结

Docker API 是 Docker 自动化管理的核心能力之一。相比直接调用 docker 命令,它更适合集成到程序、平台和脚本中。本文从基础概念讲到实战命令,覆盖了:

  • 版本查询
  • 容器列表与详情
  • 创建、启动、停止、重启容器
  • 日志查看
  • exec 执行命令
  • 镜像、网络、卷管理
  • TCP 与 TLS 访问方式
  • 安全注意事项

如果你希望进一步深入,可以继续学习:

  • Docker API 与 Python 集成
  • Docker API 与 Go 开发
  • 基于 Docker API 的 Web 管理平台开发
  • Docker Swarm / Compose 的自动化控制

如果你愿意,我还可以继续为你补一篇:

  1. 《Docker API 接口调用 Python 实战教程》
  2. 《Docker API 常用接口大全》
  3. 《Docker Remote API 安全配置教程》

你可以直接回复一个编号,我继续写。

目录结构
全文