Docker API

RESTful

Docker API 是一套基于 RESTful(Representational State Transfer,表述性状态转移)设计的 HTTP 接口,用于操作 Docker 服务。它实现在 Docker 服务程序中,并由 Docker 服务程序向外提供。

RESTful 设计中有几个比较关键的概念:

  • 资源(Resource)

    RESTful 接口操作或获取的对象就是资源,在 Docker 中可以是容器、镜像、数据卷等实体。

  • 表述(Representation)

    由于资源形式各式各样,因此在 RESTful 设计中要求采用可读性的格式来展示资源。在 Docker API 中,大多数资源以 JSON 文本的形式进行表述。

  • 状态转移(State Transfer)

    对于资源的修改可以理解为资源状态的变化,即状态转移。在 RESTful 设计中,强调使用 HTTP 方法来确定资源的操作方式,例如使用 GET 获取、POST 新增、PUT 修改、DELETE 删除等。

Docker API

采用 Docker API 进行通信可以省去 Docker 客户端的安装,并且能够提供更高效和更自由的操作。

为了区分不同功能模块提供的接口,Docker API 进行了划分。例如,用于操作 Docker 镜像和容器等模块的接口称为 Docker Remote API,用于操作和管理 Docker Registry 远程仓库的服务接口称为 Docker Registry API,用于操作 Docker Cloud 云服务的接口称为 Docker Cloud API。

Docker Remote API

Docker Remote API 是由 Docker 服务程序提供的,是 Docker API 的核心部分,它可以控制 Docker 服务以及其中镜像、容器、网络等功能的运行。

以下是一些常用的操作方法:

功能 方法
列出容器 GET /containers/json
创建容器 POST /containers/create
查看容器信息 GET /containers/(id)/json
查看容器进程 GET /containers/(id)/top
查看容器日志 GET /containers/(id)/logs
查看文件变更 GET /containers/(id)/changes
导出容器 GET /containers/(id)/export
启动容器 POST /containers/(id)/start
停止容器 POST /containers/(id)/stop
重启容器 POST /containers/(id)/restart
杀死容器 POST /containers/(id)/kill
附加终端 POST /containers/(id)/attach
暂停容器 POST /containers/(id)/pause
恢复容器 POST /containers/(id)/unpause
等待容器停止 POST /containers/(id)/wait
删除容器 DELETE /containers/(id)
从容器复制文件 POST /containers/(id)/copy
列出镜像 GET /images/json
创建镜像 POST /images/create
查看镜像信息 GET /images/(name)/json
获取镜像历史 GET /images/(name)/history
推送镜像 POST /images/(name)/push
镜像贴标 POST /images/(name)/tag
删除镜像 DELETE /images/(name)
搜索镜像 GET /images/search

也可以使用 curl -X 发送请求来测试:

[root@server1 ~]$ curl --unix-socket /var/run/docker.sock http://localhost/_ping
OK
[root@server4 ~]$ curl -X GET http://192.168.2.234:5999/containers/json?all=1&size=1
[{"Id":"4608034f24faa0fde74fe3a53f89bd98af58bcc98c1d82ff51d8f19a9493ce15","Names":["/heuristic_ishizaka"],"Image":"alpine","ImageID":"sha256:14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab","Command":"/bin/sh","Created":1635662347,"Ports":[],"Labels":{},"State":"exited","Status":"Exited (0) 2 seconds ago","HostConfig":{"NetworkMode":"default"},"NetworkSettings":{"Networks":{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"c441e7f297764fe10f2ded3a955f4c86f263210a56e77b7a19ce36ef300f44c0","EndpointID":"","Gateway":"","IPAddress":"","IPPrefixLen":0,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"","DriverOpts":null}}},"Mounts":[]}]
[root@server4 ~]$ curl -X POST http://192.168.2.234:5999/containers/4608034f24faa/start
[root@server4 ~]$ curl -X DELETE http://192.168.2.234:5999/containers/4608034?v=1&force=1
[1] 74386

有关详细用法,请参考:官方文档

Docker Registry API

Docker Registry API 用于管理和使用远程镜像仓库 Docker Registry。主要提供以下功能:

  • 镜像信息操作:

    镜像信息包括镜像 ID、仓库名称、标签、启动命令等,用于全面描述镜像的内容。在推送或拉取镜像之前,需要进行镜像信息的推送和拉取操作。

  • 镜像验证:

    可以通过 Docker Registry API 提供的镜像信息中的相关字段进行校验,以确保镜像数据完整且未被篡改。

  • 镜像推送:

    Docker Registry API 提供了分块方式将镜像数据推送到 Docker Registry 服务器,以提高传输速度。镜像服务器在接收到镜像数据后,会先进行数据组装,并可补充上传缺失部分。

  • 镜像拉取:

    镜像拉取也采用分块方式进行,然后在本地进行组装,以提高镜像传输效率。

  • 镜像层控制:

    在推送镜像层到仓库时,Docker Registry API 会通过传输的镜像散列值来判断镜像层是否已存在于仓库中,如果存在,则无需传输。

Docker API 调用

docker-py 是 Docker 官方提供的 Python 版本的 API 接口库:参考文档

安装库

使用 pip install docker 来安装:

C:\Users\assassing>pip install docker
Successfully installed docker-5.0.3 pywin32-227 websocket-client-1.2.1
C:\Users\assassing>python
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import docker

镜像查询

简单查看一下服务端信息:

import docker

cli = docker.DockerClient(base_url='tcp://192.168.2.234:5999')
print('docker info:')
print(cli.info())
print('docker images:')
print(cli.images.list())

镜像构建

尝试使用 Dockerfile 构建一个简单的镜像:

import docker
from io import BytesIO

dockerfile = '''
#Share
FROM busybox
VOLUME /data
CMD ["/bin/sh"]
'''
f = BytesIO(dockerfile.encode('utf-8'))
cli = docker.DockerClient(base_url='tcp://192.168.2.234:5999')
response = [line for line in cli.images.build(fileobj=f, rm=True, tag='pytest/volume')]
print(response)

创建容器

启动刚才建立的镜像:

import docker

cli = docker.DockerClient(base_url='tcp://192.168.2.234:5999')
container=cli.containers.run(image='pytest/volume',command='/bin/sleep 60')
print(container)