引擎API v1.24

一、简介

  • 守护进程会监听,unix:///var/run/docker.sock但您可以 将 Docker 绑定到另一个主机/端口或 Unix 套接字
  • API 倾向于 REST。然而,对于一些复杂的命令,例如attachpull,HTTP 连接被劫持以传输stdout, stdinstderr
  • 向需要正文的端点发出的请求Content-Length中应存在标头。POST
  • 要锁定特定版本的 API,请在 URL 中添加要使用的 API 版本的前缀。例如,/v1.18/info。如果 URL 中未包含版本,则使用支持的最大 API 版本。
  • 如果守护程序不支持 URL 中指定的 API 版本, 400 Bad Request则会返回 HTTP 错误消息。

2. 错误

引擎 API 使用标准 HTTP 状态代码来指示 API 调用的成功或失败。响应正文将为 JSON,格式如下:

{
    "message": "page not found"
}

下面的端点文档中指定了为每个端点返回的状态代码。

3. 端点

3.1 容器

列出容器

GET /containers/json

列出容器

请求示例

GET /v1.24/containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

[
     {
             "Id": "8dfafdbc3a40",
             "Names":["/boring_feynman"],
             "Image": "ubuntu:latest",
             "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
             "Command": "echo 1",
             "Created": 1367854155,
             "State": "exited",
             "Status": "Exit 0",
             "Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}],
             "Labels": {
                     "com.example.vendor": "Acme",
                     "com.example.license": "GPL",
                     "com.example.version": "1.0"
             },
             "SizeRw": 12288,
             "SizeRootFs": 0,
             "HostConfig": {
                     "NetworkMode": "default"
             },
             "NetworkSettings": {
                     "Networks": {
                             "bridge": {
                                      "IPAMConfig": null,
                                      "Links": null,
                                      "Aliases": null,
                                      "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
                                      "EndpointID": "2cdc4edb1ded3631c81f57966563e5c8525b81121bb3706a9a9a3ae102711f3f",
                                      "Gateway": "172.17.0.1",
                                      "IPAddress": "172.17.0.2",
                                      "IPPrefixLen": 16,
                                      "IPv6Gateway": "",
                                      "GlobalIPv6Address": "",
                                      "GlobalIPv6PrefixLen": 0,
                                      "MacAddress": "02:42:ac:11:00:02"
                              }
                     }
             },
             "Mounts": [
                     {
                              "Name": "fac362...80535",
                              "Source": "/data",
                              "Destination": "/data",
                              "Driver": "local",
                              "Mode": "ro,Z",
                              "RW": false,
                              "Propagation": ""
                     }
             ]
     },
     {
             "Id": "9cd87474be90",
             "Names":["/coolName"],
             "Image": "ubuntu:latest",
             "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
             "Command": "echo 222222",
             "Created": 1367854155,
             "State": "exited",
             "Status": "Exit 0",
             "Ports": [],
             "Labels": {},
             "SizeRw": 12288,
             "SizeRootFs": 0,
             "HostConfig": {
                     "NetworkMode": "default"
             },
             "NetworkSettings": {
                     "Networks": {
                             "bridge": {
                                      "IPAMConfig": null,
                                      "Links": null,
                                      "Aliases": null,
                                      "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
                                      "EndpointID": "88eaed7b37b38c2a3f0c4bc796494fdf51b270c2d22656412a2ca5d559a64d7a",
                                      "Gateway": "172.17.0.1",
                                      "IPAddress": "172.17.0.8",
                                      "IPPrefixLen": 16,
                                      "IPv6Gateway": "",
                                      "GlobalIPv6Address": "",
                                      "GlobalIPv6PrefixLen": 0,
                                      "MacAddress": "02:42:ac:11:00:08"
                              }
                     }
             },
             "Mounts": []
     },
     {
             "Id": "3176a2479c92",
             "Names":["/sleepy_dog"],
             "Image": "ubuntu:latest",
             "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
             "Command": "echo 3333333333333333",
             "Created": 1367854154,
             "State": "exited",
             "Status": "Exit 0",
             "Ports":[],
             "Labels": {},
             "SizeRw":12288,
             "SizeRootFs":0,
             "HostConfig": {
                     "NetworkMode": "default"
             },
             "NetworkSettings": {
                     "Networks": {
                             "bridge": {
                                      "IPAMConfig": null,
                                      "Links": null,
                                      "Aliases": null,
                                      "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
                                      "EndpointID": "8b27c041c30326d59cd6e6f510d4f8d1d570a228466f956edf7815508f78e30d",
                                      "Gateway": "172.17.0.1",
                                      "IPAddress": "172.17.0.6",
                                      "IPPrefixLen": 16,
                                      "IPv6Gateway": "",
                                      "GlobalIPv6Address": "",
                                      "GlobalIPv6PrefixLen": 0,
                                      "MacAddress": "02:42:ac:11:00:06"
                              }
                     }
             },
             "Mounts": []
     },
     {
             "Id": "4cb07b47f9fb",
             "Names":["/running_cat"],
             "Image": "ubuntu:latest",
             "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
             "Command": "echo 444444444444444444444444444444444",
             "Created": 1367854152,
             "State": "exited",
             "Status": "Exit 0",
             "Ports": [],
             "Labels": {},
             "SizeRw": 12288,
             "SizeRootFs": 0,
             "HostConfig": {
                     "NetworkMode": "default"
             },
             "NetworkSettings": {
                     "Networks": {
                             "bridge": {
                                      "IPAMConfig": null,
                                      "Links": null,
                                      "Aliases": null,
                                      "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
                                      "EndpointID": "d91c7b2f0644403d7ef3095985ea0e2370325cd2332ff3a3225c4247328e66e9",
                                      "Gateway": "172.17.0.1",
                                      "IPAddress": "172.17.0.5",
                                      "IPPrefixLen": 16,
                                      "IPv6Gateway": "",
                                      "GlobalIPv6Address": "",
                                      "GlobalIPv6PrefixLen": 0,
                                      "MacAddress": "02:42:ac:11:00:05"
                              }
                     }
             },
             "Mounts": []
     }
]

查询参数

  • all – 1/True/true 或 0/False/false,显示所有容器。默认情况下仅显示正在运行的容器(即默认为 false)
  • limit – 显示limit最后创建的容器,包括非运行的容器。
  • 自从– 仅显示自 Id 以来创建的容器,包括非运行的容器。
  • before – 仅显示在 Id 之前创建的容器,包括非运行的容器。
  • size – 1/True/true 或 0/False/false, 显示容器大小
  • 过滤器map[string][]string-要在容器列表上处理的过滤器 (a ) 的 JSON 编码值。可用的过滤器:
  • exited=<int>; -- 退出代码为 的容器<int>
  • status=( created| restarting| running| paused| exited| dead)
  • label=keylabel="key=value"容器标签
  • isolation=( default| process| hyperv)(仅限 Windows 守护程序)
  • ancestor=( <image-name>[:<tag>],<image id><image@digest>)
  • before=(<container id><container name>
  • since=(<container id><container name>
  • volume=(<volume name><mount point destination>
  • network=(<network id><network name>

状态代码

  • 200 – 没有错误
  • 400 – 错误参数
  • 500 – 服务器错误

创建一个容器

POST /containers/create

创建一个容器

请求示例

POST /v1.24/containers/create HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
       "Hostname": "",
       "Domainname": "",
       "User": "",
       "AttachStdin": false,
       "AttachStdout": true,
       "AttachStderr": true,
       "Tty": false,
       "OpenStdin": false,
       "StdinOnce": false,
       "Env": [
               "FOO=bar",
               "BAZ=quux"
       ],
       "Cmd": [
               "date"
       ],
       "Entrypoint": "",
       "Image": "ubuntu",
       "Labels": {
               "com.example.vendor": "Acme",
               "com.example.license": "GPL",
               "com.example.version": "1.0"
       },
       "Volumes": {
         "/volumes/data": {}
       },
       "Healthcheck":{
          "Test": ["CMD-SHELL", "curl localhost:3000"],
          "Interval": 1000000000,
          "Timeout": 10000000000,
          "Retries": 10,
          "StartPeriod": 60000000000
       },
       "WorkingDir": "",
       "NetworkDisabled": false,
       "MacAddress": "12:34:56:78:9a:bc",
       "ExposedPorts": {
               "22/tcp": {}
       },
       "StopSignal": "SIGTERM",
       "HostConfig": {
         "Binds": ["/tmp:/tmp"],
         "Tmpfs": { "/run": "rw,noexec,nosuid,size=65536k" },
         "Links": ["redis3:redis"],
         "Memory": 0,
         "MemorySwap": 0,
         "MemoryReservation": 0,
         "KernelMemory": 0,
         "CpuPercent": 80,
         "CpuShares": 512,
         "CpuPeriod": 100000,
         "CpuQuota": 50000,
         "CpusetCpus": "0,1",
         "CpusetMems": "0,1",
         "IOMaximumBandwidth": 0,
         "IOMaximumIOps": 0,
         "BlkioWeight": 300,
         "BlkioWeightDevice": [{}],
         "BlkioDeviceReadBps": [{}],
         "BlkioDeviceReadIOps": [{}],
         "BlkioDeviceWriteBps": [{}],
         "BlkioDeviceWriteIOps": [{}],
         "MemorySwappiness": 60,
         "OomKillDisable": false,
         "OomScoreAdj": 500,
         "PidMode": "",
         "PidsLimit": -1,
         "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] },
         "PublishAllPorts": false,
         "Privileged": false,
         "ReadonlyRootfs": false,
         "Dns": ["8.8.8.8"],
         "DnsOptions": [""],
         "DnsSearch": [""],
         "ExtraHosts": null,
         "VolumesFrom": ["parent", "other:ro"],
         "CapAdd": ["NET_ADMIN"],
         "CapDrop": ["MKNOD"],
         "GroupAdd": ["newgroup"],
         "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 },
         "NetworkMode": "bridge",
         "Devices": [],
         "Sysctls": { "net.ipv4.ip_forward": "1" },
         "Ulimits": [{}],
         "LogConfig": { "Type": "json-file", "Config": {} },
         "SecurityOpt": [],
         "StorageOpt": {},
         "CgroupParent": "",
         "VolumeDriver": "",
         "ShmSize": 67108864
      },
      "NetworkingConfig": {
          "EndpointsConfig": {
              "isolated_nw" : {
                  "IPAMConfig": {
                      "IPv4Address":"172.20.30.33",
                      "IPv6Address":"2001:db8:abcd::3033",
                      "LinkLocalIPs":["169.254.34.68", "fe80::3468"]
                  },
                  "Links":["container_1", "container_2"],
                  "Aliases":["server_x", "server_y"]
              }
          }
      }
  }

响应示例

  HTTP/1.1 201 Created
  Content-Type: application/json

  {
       "Id":"e90e34656806",
       "Warnings":[]
  }

JSON 参数

  • 主机名- 包含用于容器的主机名的字符串值。这必须是有效的 RFC 1123 主机名。
  • 域名- 包含用于容器的域名的字符串值。
  • 用户- 指定容器内用户的字符串值。
  • AttachStdin - 布尔值,附加到stdin.
  • AttachStdout - 布尔值,附加到stdout.
  • AttachStderr - 布尔值,附加到stderr.
  • Tty - 布尔值,将标准流附加到 a tty,包括stdin它是否未关闭。
  • OpenStdin - 布尔值,打开stdin
  • StdinOnce - 布尔值,stdin在 1 个连接的客户端断开连接后关闭。
  • Env - 环境变量列表,格式为["VAR=value", ...]
  • 标签- 将标签映射添加到容器。要指定地图:{"key":"value", ... }
  • Cmd - 指定为字符串或字符串数​​组运行的命令。
  • 入口点- 将容器的入口点设置为字符串或字符串数​​组。
  • Image - 指定用于容器的图像名称的字符串。
  • - 将容器内的安装点路径(字符串)映射到空对象的对象。
  • 健康检查- 执行检查容器是否健康的测试。
    • **Test** - The test to perform. Possible values are:
          + `{}` inherit healthcheck from image or parent image
          + `{"NONE"}` disable healthcheck
          + `{"CMD", args...}` exec arguments directly
          + `{"CMD-SHELL", command}` run command with system's default shell
      
    • **Interval** - The time to wait between checks in nanoseconds. It should be 0 or at least 1000000 (1 ms). 0 means inherit.
      
    • **Timeout** - The time to wait before considering the check to have hung. It should be 0 or at least 1000000 (1 ms). 0 means inherit.
      
    • **Retries** - The number of consecutive failures needed to consider a container as unhealthy. 0 means inherit.
      
    • **StartPeriod** - The time to wait for container initialization before starting health-retries countdown in nanoseconds. It should be 0 or at least 1000000 (1 ms). 0 means inherit.
      
  • WorkDir - 指定运行命令的工作目录的字符串。
  • NetworkDisabled - 布尔值,当 true 时禁用容器的网络
  • ExusedPorts - 将端口映射到空对象的对象,其形式为: "ExposedPorts": { "<port>/<tcp|udp>: {}" }
  • StopSignal - 停止容器的信号,作为字符串或无符号整数。SIGTERM默认情况下。
  • 主机配置
    • 绑定– 此容器的卷绑定列表。每个卷绑定都是以下形式之一的字符串:

      • host-src:container-dest将主机路径绑定安装到容器中。两者host-src, 和 都container-dest必须是 绝对路径。
      • host-src:container-dest:ro使容器内的绑定挂载为只读。两者host-src, 和 都container-dest必须是绝对路径。
      • volume-name:container-dest将卷驱动程序管理的卷绑定挂载到容器中。container-dest必须是 绝对路径。
      • volume-name:container-dest:ro将卷以只读方式安装在容器内。container-dest必须是绝对路径。
    • Tmpfs – 应由 tmpfs 挂载及其相应挂载选项替换的容器目录的映射。表单中的 JSON 对象{ "/run": "rw,noexec,nosuid,size=65536k" }

    • 链接- 容器的链接列表。每个链接条目应采用container_name:alias.

    • 内存- 内存限制(以字节为单位)。

    • MemorySwap - 总内存限制(内存+交换);设置-1为启用无限制交换。您必须将其与 一起使用memory并使交换值大于memory

    • MemoryReservation - 内存软限制(以字节为单位)。

    • KernelMemory - 内核内存限制(以字节为单位)。

    • CpuPercent - 包含可用 CPU 的可用百分比的整数值。 (仅限 Windows 守护进程)

    • CpuShares - 包含容器 CPU 份额的整数值(即与其他容器的相对权重)。

    • CpuPeriod - CPU 周期的长度(以微秒为单位)。

    • CpuQuota - 容器在一个 CPU 周期内可以获得的 CPU 时间的微秒数。

    • CpusetCpus - 包含要使用的的字符串值cgroups CpusetCpus

    • CpusetMems - 允许执行的内存节点 (MEM) (0-3, 0,1)。仅对 NUMA 系统有效。

    • IOMaximumBandwidth - 以 IOps 为单位的最大 IO 绝对速率。

    • IOMaximumIOps - 最大 IO 绝对速率(以每秒字节数为单位)。

    • BlkioWeight - 块 IO 权重(相对权重)接受 10 到 1000 之间的权重值。

    • BlkioWeightDevice - 块 IO 权重(相对设备权重),形式为:"BlkioWeightDevice": [{"Path": "device_path", "Weight": weight}]

    • BlkioDeviceReadBps - 限制设备的读取速率(每秒字节数),格式为:"BlkioDeviceReadBps": [{"Path": "device_path", "Rate": rate}],例如: "BlkioDeviceReadBps": [{"Path": "/dev/sda", "Rate": "1024"}]"

    • BlkioDeviceWriteBps - 以以下形式限制设备的写入速率(每秒字节数)"BlkioDeviceWriteBps": [{"Path": "device_path", "Rate": rate}],例如: "BlkioDeviceWriteBps": [{"Path": "/dev/sda", "Rate": "1024"}]"

    • BlkioDeviceReadIOps - 以以下形式限制设备的读取速率(每秒 IO)"BlkioDeviceReadIOps": [{"Path": "device_path", "Rate": rate}],例如: "BlkioDeviceReadIOps": [{"Path": "/dev/sda", "Rate": "1000"}]

    • BlkioDeviceWriteIOps - 以以下形式限制设备的写入速率(每秒 IO)"BlkioDeviceWriteIOps": [{"Path": "device_path", "Rate": rate}],例如: "BlkioDeviceWriteIOps": [{"Path": "/dev/sda", "Rate": "1000"}]

    • MemorySwappiness - 调整容器的内存交换行为。接受 0 到 100 之间的整数。

    • OomKillDisable - 布尔值,是否禁用容器的 OOM Killer。

    • OomScoreAdj - 一个整数值,包含为调整 OOM Killer 首选项而给予容器的分数。

    • PidMode - 设置容器的 PID(进程)命名空间模式; "container:<name|id>":加入另一个容器的 PID 命名空间 "host":在容器内使用主机的 PID 命名空间

    • PidsLimit - 调整容器的 pid 限制。设置-1 表示无限制。

    • PortBindings - 公开的容器端口及其应映射到的主机端口的映射。{ <port>/<protocol>: [{ "HostPort": "<port>" }] } Take note形式的 JSON 对象 port被指定为字符串而不是整数值。

    • PublishAllPorts - 为容器的所有公开端口分配临时主机端口。指定为布尔值。

      当容器停止时端口被取消分配,当容器启动时端口被分配。重新启动容器时分配的端口可能会更改。

      该端口是从取决于内核的临时端口范围中选择的。例如,在 Linux 上,范围由 定义/proc/sys/net/ipv4/ip_local_port_range

    • 特权- 授予容器对主机的完全访问权限。指定为布尔值。

    • ReadonlyRootfs - 将容器的根文件系统挂载为只读。指定为布尔值。

    • Dns - 供容器使用的 DNS 服务器列表。

    • DnsOptions - DNS 选项列表

    • DnsSearch - DNS 搜索域列表

    • ExtraHosts - 要添加到容器文件的主机名/IP 映射列表/etc/hosts。表格中指定["hostname:IP"]

    • VolumesFrom - 从另一个容器继承的卷列表。表格中指定<container name>[:<ro|rw>]

    • CapAdd - 要添加到容器的内核功能列表。

    • Capdrop - 要从容器中删除的内核功能列表。

    • GroupAdd - 容器进程将作为其运行的附加组的列表

    • RestartPolicy – 容器退出时应用的行为。该值是一个对象,具有以下Name属性:"always"始终重新启动、"unless-stopped"始终重新启动(除非用户手动停止容器)或"on-failure"仅在容器退出代码非零时重新启动。如果on-failure使用,MaximumRetryCount 则控制放弃之前重试的次数。默认不重启。 (可选)在每次重新启动之前添加不断增加的延迟(之前延迟的两倍,从 100 毫秒开始),以防止服务器泛滥。

    • UsernsMode - 当启用用户名空间重新映射选项时,设置容器的用户名空间模式。支持的值为:host.

    • NetworkMode - 设置容器的网络模式。支持的标准值有:bridgehostnonecontainer:<name|id>。任何其他值都将被视为该容器应连接到的自定义网络的名称。

    • 设备- 要添加到容器的设备列表,在表单中指定为 JSON 对象 { "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}

    • ulimits - 要在容器中设置的 ulimit 列表,指定为 { "Name": <name>, "Soft": <soft limit>, "Hard": <hard limit> },例如: Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }

    • Sysctls - 要在容器中设置的内核参数 (sysctls) 列表,指定为 { <name>: <Value> },例如: { "net.ipv4.ip_forward": "1" }

    • SecurityOpt:用于自定义 MLS 系统(例如 SELinux)标签的字符串值列表。

    • StorageOpt:每个容器的存储驱动程序选项。选项可以通过形式传递 {"size":"120G"}

    • LogConfig - 容器的日志配置,指定为表单中的 JSON 对象 { "Type": "<driver_name>", "Config": {"key1": "val1"}}。可用类型:json-file, syslog, journald, gelf, fluentd, awslogs, splunk, etwlogs, nonejson-file记录驱动程序。

    • CgroupParent - 在其下创建cgroups容器的路径。cgroup如果路径不是绝对路径,则认为该路径是相对于cgroupsinit进程的路径。如果 Cgroup 尚不存在,则会创建它们。

    • VolumeDriver - 此容器用户用于安装卷的驱动程序。

    • ShmSize - 大小/dev/shm(以字节为单位)。大小必须大于 0。如果省略,系统将使用 64MB。

查询参数

  • name – 为容器分配指定的名称。必须匹配/?[a-zA-Z0-9_-]+

状态代码

  • 201 – 没有错误
  • 400 – 错误参数
  • 404 – 没有这样的图像
  • 406 – 无法附加(容器未运行)
  • 409 – 冲突
  • 500 – 服务器错误

检查容器

GET /containers/(id or name)/json

返回容器的低级信息id

请求示例

  GET /v1.24/containers/4fa6e0f0c678/json HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
	"AppArmorProfile": "",
	"Args": [
		"-c",
		"exit 9"
	],
	"Config": {
		"AttachStderr": true,
		"AttachStdin": false,
		"AttachStdout": true,
		"Cmd": [
			"/bin/sh",
			"-c",
			"exit 9"
		],
		"Domainname": "",
		"Entrypoint": null,
		"Env": [
			"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
		],
		"ExposedPorts": null,
		"Hostname": "ba033ac44011",
		"Image": "ubuntu",
		"Labels": {
			"com.example.vendor": "Acme",
			"com.example.license": "GPL",
			"com.example.version": "1.0"
		},
		"MacAddress": "",
		"NetworkDisabled": false,
		"OnBuild": null,
		"OpenStdin": false,
		"StdinOnce": false,
		"Tty": false,
		"User": "",
		"Volumes": {
			"/volumes/data": {}
		},
		"WorkingDir": "",
		"StopSignal": "SIGTERM"
	},
	"Created": "2015-01-06T15:47:31.485331387Z",
	"Driver": "overlay2",
	"ExecIDs": null,
	"HostConfig": {
		"Binds": null,
		"IOMaximumBandwidth": 0,
		"IOMaximumIOps": 0,
		"BlkioWeight": 0,
		"BlkioWeightDevice": [{}],
		"BlkioDeviceReadBps": [{}],
		"BlkioDeviceWriteBps": [{}],
		"BlkioDeviceReadIOps": [{}],
		"BlkioDeviceWriteIOps": [{}],
		"CapAdd": null,
		"CapDrop": null,
		"ContainerIDFile": "",
		"CpusetCpus": "",
		"CpusetMems": "",
		"CpuPercent": 80,
		"CpuShares": 0,
		"CpuPeriod": 100000,
		"Devices": [],
		"Dns": null,
		"DnsOptions": null,
		"DnsSearch": null,
		"ExtraHosts": null,
		"IpcMode": "",
		"Links": null,
		"Memory": 0,
		"MemorySwap": 0,
		"MemoryReservation": 0,
		"KernelMemory": 0,
		"OomKillDisable": false,
		"OomScoreAdj": 500,
		"NetworkMode": "bridge",
		"PidMode": "",
		"PortBindings": {},
		"Privileged": false,
		"ReadonlyRootfs": false,
		"PublishAllPorts": false,
		"RestartPolicy": {
			"MaximumRetryCount": 2,
			"Name": "on-failure"
		},
		"LogConfig": {
			"Config": null,
			"Type": "json-file"
		},
		"SecurityOpt": null,
		"Sysctls": {
		        "net.ipv4.ip_forward": "1"
		},
		"StorageOpt": null,
		"VolumesFrom": null,
		"Ulimits": [{}],
		"VolumeDriver": "",
		"ShmSize": 67108864
	},
	"HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname",
	"HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts",
	"LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log",
	"Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39",
	"Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2",
	"MountLabel": "",
	"Name": "/boring_euclid",
	"NetworkSettings": {
		"Bridge": "",
		"SandboxID": "",
		"HairpinMode": false,
		"LinkLocalIPv6Address": "",
		"LinkLocalIPv6PrefixLen": 0,
		"Ports": null,
		"SandboxKey": "",
		"SecondaryIPAddresses": null,
		"SecondaryIPv6Addresses": null,
		"EndpointID": "",
		"Gateway": "",
		"GlobalIPv6Address": "",
		"GlobalIPv6PrefixLen": 0,
		"IPAddress": "",
		"IPPrefixLen": 0,
		"IPv6Gateway": "",
		"MacAddress": "",
		"Networks": {
			"bridge": {
				"NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
				"EndpointID": "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d",
				"Gateway": "172.17.0.1",
				"IPAddress": "172.17.0.2",
				"IPPrefixLen": 16,
				"IPv6Gateway": "",
				"GlobalIPv6Address": "",
				"GlobalIPv6PrefixLen": 0,
				"MacAddress": "02:42:ac:12:00:02"
			}
		}
	},
	"Path": "/bin/sh",
	"ProcessLabel": "",
	"ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf",
	"RestartCount": 1,
	"State": {
		"Error": "",
		"ExitCode": 9,
		"FinishedAt": "2015-01-06T15:47:32.080254511Z",
		"OOMKilled": false,
		"Dead": false,
		"Paused": false,
		"Pid": 0,
		"Restarting": false,
		"Running": true,
		"StartedAt": "2015-01-06T15:47:32.072697474Z",
		"Status": "running"
	},
	"Mounts": [
		{
			"Name": "fac362...80535",
			"Source": "/data",
			"Destination": "/data",
			"Driver": "local",
			"Mode": "ro,Z",
			"RW": false,
			"Propagation": ""
		}
	]
}

请求示例,包含尺寸信息

GET /v1.24/containers/4fa6e0f0c678/json?size=1 HTTP/1.1

响应示例,包含尺寸信息

HTTP/1.1 200 OK
Content-Type: application/json

{
....
"SizeRw": 0,
"SizeRootFs": 972,
....
}

查询参数

  • size – 1/True/true 或 0/False/false, 返回容器大小信息。默认为false.

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 服务器错误

列出容器内运行的进程

GET /containers/(id or name)/top

列出容器内运行的进程id。在 Unix 系统上,这是通过运行ps命令来完成的。 Windows 不支持此端点。

请求示例

GET /v1.24/containers/4fa6e0f0c678/top HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
   "Titles" : [
     "UID", "PID", "PPID", "C", "STIME", "TTY", "TIME", "CMD"
   ],
   "Processes" : [
     [
       "root", "13642", "882", "0", "17:03", "pts/0", "00:00:00", "/bin/bash"
     ],
     [
       "root", "13735", "13642", "0", "17:06", "pts/0", "00:00:00", "sleep 10"
     ]
   ]
}

请求示例

GET /v1.24/containers/4fa6e0f0c678/top?ps_args=aux HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
  "Titles" : [
    "USER","PID","%CPU","%MEM","VSZ","RSS","TTY","STAT","START","TIME","COMMAND"
  ]
  "Processes" : [
    [
      "root","13642","0.0","0.1","18172","3184","pts/0","Ss","17:03","0:00","/bin/bash"
    ],
    [
      "root","13895","0.0","0.0","4348","692","pts/0","S+","17:15","0:00","sleep 10"
    ]
  ],
}

查询参数

  • ps_argsps要使用的参数(例如,aux),默认为-ef

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 服务器错误

获取容器日志

GET /containers/(id or name)/logs

从容器获取stdout并记录stderrid

注意:此端点仅适用于具有json-filejournald日志记录驱动程序的容器。

请求示例

 GET /v1.24/containers/4fa6e0f0c678/logs?stderr=1&stdout=1&timestamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1

响应示例

 HTTP/1.1 101 UPGRADED
 Content-Type: application/vnd.docker.raw-stream
 Connection: Upgrade
 Upgrade: tcp

 {% raw %}
 {{ STREAM }}
 {% endraw %}

查询参数

  • 详细信息- 1/True/true 或 0/False/false,显示提供给日志的额外详细信息。默认false
  • follow – 1/True/true 或 0/False/false,返回流。默认false
  • stdout – 1/True/true 或 0/False/false,显示stdout日志。默认false
  • stderr – 1/True/true 或 0/False/false,显示stderr日志。默认false
  • since – 用于过滤日志的 UNIX 时间戳(整数)。指定时间戳将仅输出自该时间戳以来的日志条目。默认值:0(未过滤)
  • 时间戳– 1/True/true 或 0/False/false,打印每个日志行的时间戳。默认false
  • tail – 在日志末尾输出指定行数:all<number>。默认全部。

状态代码

  • 101 – 没有错误,提示代理劫持
  • 200 – 没有错误,未找到升级标头
  • 404 – 没有这样的容器
  • 500 – 服务器错误

检查容器文件系统上的更改

GET /containers/(id or name)/changes

检查容器id文件系统上的更改

请求示例

GET /v1.24/containers/4fa6e0f0c678/changes HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

[
     {
             "Path": "/dev",
             "Kind": 0
     },
     {
             "Path": "/dev/kmsg",
             "Kind": 1
     },
     {
             "Path": "/test",
             "Kind": 1
     }
]

Kind

  • 0: 调整
  • 1: 添加
  • 2: 删除

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 服务器错误

导出一个容器

GET /containers/(id or name)/export

导出容器内容id

请求示例

GET /v1.24/containers/4fa6e0f0c678/export HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/octet-stream

{% raw %}
{{ TAR STREAM }}
{% endraw %}

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 服务器错误

根据资源使用情况获取容器统计信息

GET /containers/(id or name)/stats

此端点返回容器资源使用统计信息的实时流。

请求示例

GET /v1.24/containers/redis1/stats HTTP/1.1

响应示例

  HTTP/1.1 200 OK
  Content-Type: application/json

  {
     "read" : "2015-01-08T22:57:31.547920715Z",
     "pids_stats": {
        "current": 3
     },
     "networks": {
             "eth0": {
                 "rx_bytes": 5338,
                 "rx_dropped": 0,
                 "rx_errors": 0,
                 "rx_packets": 36,
                 "tx_bytes": 648,
                 "tx_dropped": 0,
                 "tx_errors": 0,
                 "tx_packets": 8
             },
             "eth5": {
                 "rx_bytes": 4641,
                 "rx_dropped": 0,
                 "rx_errors": 0,
                 "rx_packets": 26,
                 "tx_bytes": 690,
                 "tx_dropped": 0,
                 "tx_errors": 0,
                 "tx_packets": 9
             }
     },
     "memory_stats" : {
        "stats" : {
           "total_pgmajfault" : 0,
           "cache" : 0,
           "mapped_file" : 0,
           "total_inactive_file" : 0,
           "pgpgout" : 414,
           "rss" : 6537216,
           "total_mapped_file" : 0,
           "writeback" : 0,
           "unevictable" : 0,
           "pgpgin" : 477,
           "total_unevictable" : 0,
           "pgmajfault" : 0,
           "total_rss" : 6537216,
           "total_rss_huge" : 6291456,
           "total_writeback" : 0,
           "total_inactive_anon" : 0,
           "rss_huge" : 6291456,
           "hierarchical_memory_limit" : 67108864,
           "total_pgfault" : 964,
           "total_active_file" : 0,
           "active_anon" : 6537216,
           "total_active_anon" : 6537216,
           "total_pgpgout" : 414,
           "total_cache" : 0,
           "inactive_anon" : 0,
           "active_file" : 0,
           "pgfault" : 964,
           "inactive_file" : 0,
           "total_pgpgin" : 477
        },
        "max_usage" : 6651904,
        "usage" : 6537216,
        "failcnt" : 0,
        "limit" : 67108864
     },
     "blkio_stats" : {},
     "cpu_stats" : {
        "cpu_usage" : {
           "percpu_usage" : [
              8646879,
              24472255,
              36438778,
              30657443
           ],
           "usage_in_usermode" : 50000000,
           "total_usage" : 100215355,
           "usage_in_kernelmode" : 30000000
        },
        "system_cpu_usage" : 739306590000000,
        "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0}
     },
     "precpu_stats" : {
        "cpu_usage" : {
           "percpu_usage" : [
              8646879,
              24350896,
              36438778,
              30657443
           ],
           "usage_in_usermode" : 50000000,
           "total_usage" : 100093996,
           "usage_in_kernelmode" : 30000000
        },
        "system_cpu_usage" : 9492140000000,
        "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0}
     }
  }

上次precpu_stats读取的cpu统计信息,用于计算cpu使用百分比。它不是该字段的精确副本。cpu_stats

查询参数

  • – 1/True/true 或 0/False/false,提取统计数据一次然后断开连接。默认true

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 服务器错误

调整容器 TTY 大小

POST /containers/(id or name)/resize

调整容器的 TTY 大小id。单位是字符数。您必须重新启动容器才能使调整大小生效。

请求示例

  POST /v1.24/containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1

响应示例

  HTTP/1.1 200 OK
  Content-Length: 0
  Content-Type: text/plain; charset=utf-8

查询参数

  • htty –会话高度
  • w——宽度

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 无法调整容器大小

启动一个容器

POST /containers/(id or name)/start

启动容器id

请求示例

POST /v1.24/containers/e90e34656806/start HTTP/1.1

响应示例

HTTP/1.1 204 No Content

查询参数

  • detachKeys – 覆盖用于分离容器的按键序列。格式是单个字符,[a-Z]或者ctrl-<value><value>以下之一:a-z@^[,_

状态代码

  • 204 – 没有错误
  • 304 – 容器已经启动
  • 404 – 没有这样的容器
  • 500 – 服务器错误

停止容器

POST /containers/(id or name)/stop

停止容器id

请求示例

POST /v1.24/containers/e90e34656806/stop?t=5 HTTP/1.1

响应示例

HTTP/1.1 204 No Content

查询参数

  • t – 杀死容器之前等待的秒数

状态代码

  • 204 – 没有错误
  • 304 – 容器已经停止
  • 404 – 没有这样的容器
  • 500 – 服务器错误

重启一个容器

POST /containers/(id or name)/restart

重启容器id

请求示例

POST /v1.24/containers/e90e34656806/restart?t=5 HTTP/1.1

响应示例

HTTP/1.1 204 No Content

查询参数

  • t – 杀死容器之前等待的秒数

状态代码

  • 204 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 服务器错误

杀死一个容器

POST /containers/(id or name)/kill

杀死容器id

请求示例

POST /v1.24/containers/e90e34656806/kill HTTP/1.1

响应示例

HTTP/1.1 204 No Content

查询参数

  • signal - 发送到容器的信号:整数或字符串SIGINT。如果未设置,SIGKILL则假定调用等待容器退出。

状态代码

  • 204 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 服务器错误

更新容器

POST /containers/(id or name)/update

更新一个或多个容器的配置。

请求示例

   POST /v1.24/containers/e90e34656806/update HTTP/1.1
   Content-Type: application/json
   Content-Length: 12345

   {
     "BlkioWeight": 300,
     "CpuShares": 512,
     "CpuPeriod": 100000,
     "CpuQuota": 50000,
     "CpusetCpus": "0,1",
     "CpusetMems": "0",
     "Memory": 314572800,
     "MemorySwap": 514288000,
     "MemoryReservation": 209715200,
     "KernelMemory": 52428800,
     "RestartPolicy": {
       "MaximumRetryCount": 4,
       "Name": "on-failure"
     }
   }

响应示例

   HTTP/1.1 200 OK
   Content-Type: application/json

   {
       "Warnings": []
   }

状态代码

  • 200 – 没有错误
  • 400 – 错误参数
  • 404 – 没有这样的容器
  • 500 – 服务器错误

重命名容器

POST /containers/(id or name)/rename

将容器重命名idnew_name

请求示例

POST /v1.24/containers/e90e34656806/rename?name=new_name HTTP/1.1

响应示例

HTTP/1.1 204 No Content

查询参数

  • name – 容器的新名称

状态代码

  • 204 – 没有错误
  • 404 – 没有这样的容器
  • 409 - 冲突名称已分配
  • 500 – 服务器错误

暂停容器

POST /containers/(id or name)/pause

暂停容器id

请求示例

POST /v1.24/containers/e90e34656806/pause HTTP/1.1

响应示例

HTTP/1.1 204 No Content

状态代码

  • 204 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 服务器错误

取消暂停容器

POST /containers/(id or name)/unpause

取消暂停容器id

请求示例

POST /v1.24/containers/e90e34656806/unpause HTTP/1.1

响应示例

HTTP/1.1 204 No Content

状态代码

  • 204 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 服务器错误

附加到容器

POST /containers/(id or name)/attach

附着到容器上id

请求示例

POST /v1.24/containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1

响应示例

HTTP/1.1 101 UPGRADED
Content-Type: application/vnd.docker.raw-stream
Connection: Upgrade
Upgrade: tcp

{% raw %}
{{ STREAM }}
{% endraw %}

查询参数

  • detachKeys – 覆盖用于分离容器的按键序列。格式是单个字符,[a-Z]或者ctrl-<value><value>以下之一:a-z@^[,_
  • 日志– 1/True/true 或 0/False/false,返回日志。默认false
  • – 1/True/true 或 0/False/false,返回流。默认false
  • stdin – 1/True/true 或 0/False/false,如果stream=true,则附加到stdin.默认false
  • stdout – 1/True/true 或 0/False/false, if logs=true, 返回 stdout日志, if stream=true, 附加到stdout.默认false
  • stderr – 1/True/true 或 0/False/false, 如果logs=true, 返回 stderr日志, 如果stream=true, 附加到stderr.默认false

状态代码

  • 101 – 没有错误,提示代理劫持
  • 200 – 没有错误,未找到升级标头
  • 400 – 错误参数
  • 404 – 没有这样的容器
  • 409 - 容器已暂停
  • 500 – 服务器错误

直播详情

当在 中启用 TTY 设置时 POST /containers/create ,流是来自进程 PTY 和客户端的原始数据stdin。当 TTY 被禁用时,流将被多路复用以分离 stdoutstderr

格式是标头有效负载(帧)。

标头

标头包含流写入的信息(stdoutstderr)。它还包含在最后四个字节 ( ) 中编码的相关帧的大小uint32

它在前八个字节上编码如下:

header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}

STREAM_TYPE可:

  • 0:(stdin写在 上stdout
  • 1:stdout
  • 2:stderr

SIZE1, SIZE2, SIZE3, SIZE4uint32是编码为大尾数的四个字节的大小。

有效载荷

有效负载是原始流。

执行

实现 Attach 协议的最简单方法如下:

1.  Read eight bytes.
2.  Choose `stdout` or `stderr` depending on the first byte.
3.  Extract the frame size from the last four bytes.
4.  Read the extracted size and output it on the correct output.
5.  Goto 1.

连接到容器(websocket)

GET /containers/(id or name)/attach/ws

id通过 websocket连接到容器

根据 RFC 6455实现 websocket 协议握手

请求示例

GET /v1.24/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1

响应示例

{% raw %}
{{ STREAM }}
{% endraw %}

查询参数

  • detachKeys – 覆盖用于分离容器的按键序列。格式是单个字符,[a-Z]或者ctrl-<value><value>以下之一:a-z@^[,_
  • 日志– 1/True/true 或 0/False/false,返回日志。默认false
  • – 1/True/true 或 0/False/false,返回流。默认false

状态代码

  • 200 – 没有错误
  • 400 – 错误参数
  • 404 – 没有这样的容器
  • 500 – 服务器错误

等一个容器

POST /containers/(id or name)/wait

阻塞直到容器id停止,然后返回退出代码

请求示例

POST /v1.24/containers/16253994b7c4/wait HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{"StatusCode": 0}

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 服务器错误

移除一个容器

DELETE /containers/(id or name)

id从文件系统中删除容器

请求示例

DELETE /v1.24/containers/16253994b7c4?v=1 HTTP/1.1

响应示例

HTTP/1.1 204 No Content

查询参数

  • v – 1/True/true 或 0/False/false,删除与容器关联的卷。默认false
  • 强制- 1/True/true 或 0/False/false,杀死然后移除容器。默认false
  • link - 1/True/true 或 0/False/false,删除与容器关联的指定链接。默认false

状态代码

  • 204 – 没有错误
  • 400 – 错误参数
  • 404 – 没有这样的容器
  • 409 – 冲突
  • 500 – 服务器错误

检索有关容器中文件和文件夹的信息

HEAD /containers/(id or name)/archive

X-Docker-Container-Path-Stat请参阅下一节中的标头描述。

获取容器中文件系统资源的存档

GET /containers/(id or name)/archive

获取 容器 文件系统中资源的 tar 存档id

查询参数

  • path - 容器文件系统中要归档的资源。必需的。

    如果不是绝对路径,则它是相对于容器根目录的。路径指定的资源必须存在。要断言资源应为目录,路径/应以或结尾/. (假设路径分隔符为/)。如果路径以结尾,/.则表示仅应复制路径目录的内容。符号链接始终解析为其目标。

    注意:无法复制某些系统文件,例如/proc/sys/dev、 和用户在容器中创建的挂载下的资源。

请求示例

GET /v1.24/containers/8cce319429b2/archive?path=/root HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/x-tar
X-Docker-Container-Path-Stat: eyJuYW1lIjoicm9vdCIsInNpemUiOjQwOTYsIm1vZGUiOjIxNDc0ODQwOTYsIm10aW1lIjoiMjAxNC0wMi0yN1QyMDo1MToyM1oiLCJsaW5rVGFyZ2V0IjoiIn0=

{% raw %}
{{ TAR STREAM }}
{% endraw %}

成功后,响应标头X-Docker-Container-Path-Stat将设置为 Base64 编码的 JSON 对象,其中包含有关存档资源的一些文件系统标头信息。上面的示例值将解码为以下 JSON 对象(添加空格是为了提高可读性):

{
    "name": "root",
    "size": 4096,
    "mode": 2147484096,
    "mtime": "2014-02-27T20:51:23Z",
    "linkTarget": ""
}

HEAD如果只需要此信息,也可以向此端点发出请求。

状态代码

  • 200 - 成功,返回复制资源的存档
  • 400 - 客户端错误,参数错误,JSON 响应正文中的详细信息,其中之一:
    • 必须指定路径参数(路径不能为空)
    • 不是目录(路径被断言为目录但作为文件存在)
  • 404 - 客户端错误,未找到资源,以下之一: – 没有这样的容器(容器id不存在)
    • 没有这样的文件或目录(路径不存在)
  • 500-服务器错误

将文件或文件夹的存档提取到容器中的目录

PUT /containers/(id or name)/archive

将要解压的 tar 存档上传到 容器 文件系统中的某个路径 id

查询参数

  • path - 容器中要将存档内容提取到的目录的路径。必需的。

    如果不是绝对路径,则它是相对于容器根目录的。路径资源必须存在。

  • noOverwriteDirNonDir - 如果为“1”、“true”或“True”,则如果解压给定内容会导致现有目录被非目录替换,则将出现错误,反之亦然。

请求示例

PUT /v1.24/containers/8cce319429b2/archive?path=/vol1 HTTP/1.1
Content-Type: application/x-tar

{% raw %}
{{ TAR STREAM }}
{% endraw %}

响应示例

HTTP/1.1 200 OK

状态代码

  • 200 – 内容提取成功
  • 400 - 客户端错误,参数错误,JSON 响应正文中的详细信息,其中之一:
    • 必须指定路径参数(路径不能为空)
    • 不是目录(路径应该是目录但作为文件存在)
    • 无法用非目录覆盖现有目录(如果noOverwriteDirNonDir
    • 无法用目录覆盖现有的非目录(如果noOverwriteDirNonDir
  • 403 - 客户端错误,权限被拒绝,卷或容器 rootfs 被标记为只读。
  • 404 - 客户端错误,未找到资源,以下之一: – 没有这样的容器(容器id不存在)
    • 没有这样的文件或目录(路径资源不存在)
  • 500 – 服务器错误

3.2 图片

列出图像

GET /images/json

请求示例

GET /v1.24/images/json?all=0 HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

[
  {
     "RepoTags": [
       "ubuntu:12.04",
       "ubuntu:precise",
       "ubuntu:latest"
     ],
     "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c",
     "Created": 1365714795,
     "Size": 131506275,
     "VirtualSize": 131506275,
     "Labels": {}
  },
  {
     "RepoTags": [
       "ubuntu:12.10",
       "ubuntu:quantal"
     ],
     "ParentId": "27cf784147099545",
     "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc",
     "Created": 1364102658,
     "Size": 24653,
     "VirtualSize": 180116135,
     "Labels": {
        "com.example.version": "v1"
     }
  }
]

示例请求,带有摘要信息

GET /v1.24/images/json?digests=1 HTTP/1.1

示例响应,带有摘要信息

HTTP/1.1 200 OK
Content-Type: application/json

[
  {
    "Created": 1420064636,
    "Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125",
    "ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2",
    "RepoDigests": [
      "localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"
    ],
    "RepoTags": [
      "localhost:5000/test/busybox:latest",
      "playdate:latest"
    ],
    "Size": 0,
    "VirtualSize": 2429728,
    "Labels": {}
  }
]

响应显示Id与两个存储库 ( RepoTags) 关联的单个图像:localhost:5000/test/busyboxplaydate。调用者可以使用其中一个RepoTagslocalhost:5000/test/busybox:latestplaydate:latest引用图像。

您还可以使用RepoDigests值来引用图像。在此响应中,数组只有一个引用,即对 localhost:5000/test/busybox存储库的引用;存储playdate库没有摘要。您可以使用以下值引用此摘要: localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...

有关命令行上摘要和标记引用的示例,请参阅docker run和命令。docker build

查询参数

  • all – 1/True/true 或 0/False/false, 默认 false
  • filters – 要在图像列表上处理的过滤器的 JSON 编码值(map[string][]string)。可用的过滤器:
  • dangling=true
  • label=keylabel="key=value"图像标签
  • before=( <image-name>[:<tag>],<image id><image@digest>)
  • since=( <image-name>[:<tag>],<image id><image@digest>)
  • 过滤器- 只返回具有指定名称的图像

从 Dockerfile 构建镜像

POST /build

从 Dockerfile 构建镜像

请求示例

POST /v1.24/build HTTP/1.1
Content-Type: application/x-tar

{% raw %}
{{ TAR STREAM }}
{% endraw %}

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{"stream": "Step 1/5..."}
{"stream": "..."}
{"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}}

输入流必须是tar使用以下算法之一压缩的存档:(identity无压缩)、gzipbzip2xz

存档必须包含构建指令文件,通常 Dockerfile在存档的根目录下调用。该dockerfile参数可用于指定不同的构建指令文件。为此,其值必须是要使用的备用构建指令文件的路径。

存档可以包含任意数量的其他文件,这些文件可以在构建上下文中访问(请参阅 ADD 构建命令)。

Docker 守护进程在开始构建之前执行初步验证Dockerfile,如果语法不正确,则返回错误。之后,逐条运行每条指令,直到输出新镜像的ID。

如果客户端通过退出或被杀死而断开连接,则构建将被取消。

查询参数

  • dockerfile - 构建上下文中的路径Dockerfile。如果remote指定并指向外部,则忽略该值Dockerfile
  • t – 应用于name:tag格式中图像的名称和可选标签。如果省略,则采用tag默认值。latest您可以提供一个或多个t参数。
  • 远程– Git 存储库 URI 或 HTTP/HTTPS 上下文 URI。如果 URI 指向单个文本文件,则该文件的内容将放置到名为 的文件中Dockerfile,并从该文件构建图像。如果 URI 指向 tarball,则守护程序将下载该文件,并将其中的内容用作构建的上下文。如果 URI 指向 tarball 并且dockerfile还指定了参数,则 tarball 内必须存在具有相应路径的文件。
  • q – 抑制详细的构建输出。
  • nocache – 构建镜像时不使用缓存。
  • pull - 即使本地存在较旧的映像,也尝试拉取映像。
  • rm - 成功构建后删除中间容器(默认行为)。
  • forcerm - 始终移除中间容器(包括rm)。
  • 内存- 设置构建的内存限制。
  • memswap - 总内存(内存+交换),-1以启用无限交换。
  • cpushares - CPU 份额(相对权重)。
  • cpusetcpus - 允许执行的CPU(例如,0-3, 0,1)。
  • cpuperiod - CPU 周期的长度(以微秒为单位)。
  • cpuquota - 容器在一个 CPU 周期内可以获得的 CPU 时间的微秒数。
  • buildargs – 构建时变量的字符串对的 JSON 映射。用户在构建时传递这些值。 Docker 使用buildargs作为通过 DockerfileRUN指令运行的命令或其他 Dockerfile 指令中的变量扩展的环境上下文。这并不是为了传递秘密值。 阅读有关 buildargs 指令的更多信息
  • shmsize - 大小/dev/shm(以字节为单位)。大小必须大于 0。如果省略,系统将使用 64MB。
  • labels – 用于在图像上设置标签的字符串对的 JSON 映射。

请求标头

  • 内容类型– 设置为"application/x-tar".

  • X-Registry-Config – 具有以下结构的 base64-url-safe-encoded 注册表身份验证配置 JSON 对象:

        {
            "docker.example.com": {
                "username": "janedoe",
                "password": "hunter2"
            },
            "https://index.docker.io/v1/": {
                "username": "mobydock",
                "password": "conta1n3rize14"
            }
        }
    

    该对象将注册表的主机名映射到包含该注册表的“用户名”和“密码”的对象。可以指定多个注册表,因为构建可能基于需要身份验证才能从任意注册表中提取的映像。仅需要注册表域名(如果不是默认的“443”,还需要端口)。然而(由于遗留原因)“官方”Docker, Inc. 托管的注册表必须同时指定“https://”前缀和“/v1/”后缀,即使 Docker 更喜欢使用 v2 注册表 API。

状态代码

  • 200 – 没有错误
  • 500 – 服务器错误

创建图像

POST /images/create

通过从注册表中提取或导入来创建映像

请求示例

POST /v1.24/images/create?fromImage=busybox&tag=latest HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{"status": "Pulling..."}
{"status": "Pulling", "progress": "1 B/ 100 B", "progressDetail": {"current": 1, "total": 100}}
{"error": "Invalid..."}
...

当使用此端点从注册表中提取映像时, X-Registry-Auth标头可用于包含 Base64 编码的 AuthConfig 对象。

查询参数

  • fromImage – 要拉取的图像的名称。该名称可以包括标签或摘要。该参数只能在拉取镜像时使用。如果 HTTP 连接关闭,则拉取将被取消。
  • fromSrc – 要导入的源。该值可以是可从中检索图像或-从请求正文中读取图像的 URL。该参数只能在导入图像时使用。
  • repo – 导入图像时为图像指定的存储库名称。存储库可能包含标签。该参数只能在导入图像时使用。
  • tag – 标签或摘要。如果拉取图像时为空,则会导致拉取给定图像的所有标签。

请求标头

  • X-Registry-Auth – base64 编码的 AuthConfig 对象,包含登录信息或令牌

    • 基于凭据的登录:

    { "用户名": "jdoe", "密码": "秘密", "电子邮件": "jdoe@acme.com" } ```

    • 基于令牌的登录:

    {“identitytoken”:“9cbaf023786cd7...”} ```

状态代码

  • 200 – 没有错误
  • 404 - 存储库不存在或没有读取权限
  • 500 – 服务器错误

检查图像

GET /images/(name)/json

返回图像的低级信息name

请求示例

GET /v1.24/images/example/json HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
   "Id" : "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c",
   "Container" : "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a",
   "Comment" : "",
   "Os" : "linux",
   "Architecture" : "amd64",
   "Parent" : "sha256:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c",
   "ContainerConfig" : {
      "Tty" : false,
      "Hostname" : "e611e15f9c9d",
      "Volumes" : null,
      "Domainname" : "",
      "AttachStdout" : false,
      "PublishService" : "",
      "AttachStdin" : false,
      "OpenStdin" : false,
      "StdinOnce" : false,
      "NetworkDisabled" : false,
      "OnBuild" : [],
      "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c",
      "User" : "",
      "WorkingDir" : "",
      "Entrypoint" : null,
      "MacAddress" : "",
      "AttachStderr" : false,
      "Labels" : {
         "com.example.license" : "GPL",
         "com.example.version" : "1.0",
         "com.example.vendor" : "Acme"
      },
      "Env" : [
         "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      ],
      "ExposedPorts" : null,
      "Cmd" : [
         "/bin/sh",
         "-c",
         "#(nop) LABEL com.example.vendor=Acme com.example.license=GPL com.example.version=1.0"
      ]
   },
   "DockerVersion" : "1.9.0-dev",
   "VirtualSize" : 188359297,
   "Size" : 0,
   "Author" : "",
   "Created" : "2015-09-10T08:30:53.26995814Z",
   "GraphDriver" : {
      "Name" : "aufs",
      "Data" : null
   },
   "RepoDigests" : [
      "localhost:5000/test/busybox/example@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"
   ],
   "RepoTags" : [
      "example:1.0",
      "example:latest",
      "example:stable"
   ],
   "Config" : {
      "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c",
      "NetworkDisabled" : false,
      "OnBuild" : [],
      "StdinOnce" : false,
      "PublishService" : "",
      "AttachStdin" : false,
      "OpenStdin" : false,
      "Domainname" : "",
      "AttachStdout" : false,
      "Tty" : false,
      "Hostname" : "e611e15f9c9d",
      "Volumes" : null,
      "Cmd" : [
         "/bin/bash"
      ],
      "ExposedPorts" : null,
      "Env" : [
         "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      ],
      "Labels" : {
         "com.example.vendor" : "Acme",
         "com.example.version" : "1.0",
         "com.example.license" : "GPL"
      },
      "Entrypoint" : null,
      "MacAddress" : "",
      "AttachStderr" : false,
      "WorkingDir" : "",
      "User" : ""
   },
   "RootFS": {
       "Type": "layers",
       "Layers": [
           "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6",
           "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"
       ]
   }
}

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的图像
  • 500 – 服务器错误

获取图像的历史记录

GET /images/(name)/history

返回图像的历史记录name

请求示例

GET /v1.24/images/ubuntu/history HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

[
    {
        "Id": "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710",
        "Created": 1398108230,
        "CreatedBy": "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /",
        "Tags": [
            "ubuntu:lucid",
            "ubuntu:10.04"
        ],
        "Size": 182964289,
        "Comment": ""
    },
    {
        "Id": "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8",
        "Created": 1398108222,
        "CreatedBy": "/bin/sh -c #(nop) MAINTAINER Tianon Gravi <admwiggin@gmail.com> - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/",
        "Tags": null,
        "Size": 0,
        "Comment": ""
    },
    {
        "Id": "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158",
        "Created": 1371157430,
        "CreatedBy": "",
        "Tags": [
            "scratch12:latest",
            "scratch:latest"
        ],
        "Size": 0,
        "Comment": "Imported from -"
    }
]

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的图像
  • 500 – 服务器错误

将镜像推送到注册表

POST /images/(name)/push

将镜像推name送到注册表

请求示例

POST /v1.24/images/test/push HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{"status": "Pushing..."}
{"status": "Pushing", "progress": "1/? (n/a)", "progressDetail": {"current": 1}}}
{"error": "Invalid..."}
...

如果您希望将映像推送到私有注册表,则该映像必须已经在引用该注册表hostnameport.然后应在 URL 中使用此存储库名称。这会重复命令行的流程。

如果 HTTP 连接关闭,推送将被取消。

请求示例

POST /v1.24/images/registry.acme.com:5000/test/push HTTP/1.1

查询参数

  • tag – 与注册表中的图像关联的标签。这是可选的。

请求标头

  • X-Registry-Auth – base64 编码的 AuthConfig 对象,包含登录信息或令牌

    • 基于凭据的登录:

    { "用户名": "jdoe", "密码": "秘密", "电子邮件": "jdoe@acme.com", } ```

    • 基于身份令牌的登录:

    {“identitytoken”:“9cbaf023786cd7...”} ```

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的图像
  • 500 – 服务器错误

将图像标记到存储库中

POST /images/(name)/tag

将图像标记name到存储库中

请求示例

POST /v1.24/images/test/tag?repo=myrepo&tag=v42 HTTP/1.1

响应示例

HTTP/1.1 201 Created

查询参数

  • repo – 要标记的存储库
  • tag - 新标签名称

状态代码

  • 201 – 没有错误
  • 400 – 错误参数
  • 404 – 没有这样的图像
  • 409 – 冲突
  • 500 – 服务器错误

删除图像

DELETE /images/(name)

name从文件系统中删除图像

请求示例

DELETE /v1.24/images/test HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-type: application/json

[
 {"Untagged": "3e2f21a89f"},
 {"Deleted": "3e2f21a89f"},
 {"Deleted": "53b4f83ac9"}
]

查询参数

  • 强制– 1/True/true 或 0/False/false, 默认 false
  • noprune – 1/True/true 或 0/False/false, 默认 false

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的图像
  • 409 – 冲突
  • 500 – 服务器错误

搜索图片

GET /images/search

在Docker Hub上搜索镜像 。

注意:响应键已从 API v1.6 更改为反映注册表服务器发送到 docker 守护程序请求的 JSON。

请求示例

GET /v1.24/images/search?term=sshd HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

[
        {
            "description": "",
            "is_official": false,
            "is_automated": false,
            "name": "wma55/u1210sshd",
            "star_count": 0
        },
        {
            "description": "",
            "is_official": false,
            "is_automated": false,
            "name": "jdswinbank/sshd",
            "star_count": 0
        },
        {
            "description": "",
            "is_official": false,
            "is_automated": false,
            "name": "vgauthier/sshd",
            "star_count": 0
        }
...
]

查询参数

  • term – 要搜索的术语
  • limit – 返回的最大搜索结果
  • filters – 要在图像列表上处理的过滤器的 JSON 编码值(map[string][]string)。可用的过滤器:
  • stars=<number>
  • is-automated=(true|false)
  • is-official=(true|false)

状态代码

  • 200 – 没有错误
  • 500 – 服务器错误

3.3 其他

检查身份验证配置

POST /auth

验证注册表的凭据并获取身份令牌(如果有),以便无需密码即可访问注册表。

请求示例

POST /v1.24/auth HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
     "username": "hannibal",
     "password": "xxxx",
     "serveraddress": "https://index.docker.io/v1/"
}

响应示例

HTTP/1.1 200 OK

{
     "Status": "Login Succeeded",
     "IdentityToken": "9cbaf023786cd7..."
}

状态代码

  • 200 – 没有错误
  • 204 – 没有错误
  • 500 – 服务器错误

显示系统范围的信息

GET /info

显示系统范围的信息

请求示例

GET /v1.24/info HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
    "Architecture": "x86_64",
    "ClusterStore": "etcd://localhost:2379",
    "CgroupDriver": "cgroupfs",
    "Containers": 11,
    "ContainersRunning": 7,
    "ContainersStopped": 3,
    "ContainersPaused": 1,
    "CpuCfsPeriod": true,
    "CpuCfsQuota": true,
    "Debug": false,
    "DockerRootDir": "/var/lib/docker",
    "Driver": "btrfs",
    "DriverStatus": [[""]],
    "ExperimentalBuild": false,
    "HttpProxy": "http://test:test@localhost:8080",
    "HttpsProxy": "https://test:test@localhost:8080",
    "ID": "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS",
    "IPv4Forwarding": true,
    "Images": 16,
    "IndexServerAddress": "https://index.docker.io/v1/",
    "InitPath": "/usr/bin/docker",
    "InitSha1": "",
    "KernelMemory": true,
    "KernelVersion": "3.12.0-1-amd64",
    "Labels": [
        "storage=ssd"
    ],
    "MemTotal": 2099236864,
    "MemoryLimit": true,
    "NCPU": 1,
    "NEventsListener": 0,
    "NFd": 11,
    "NGoroutines": 21,
    "Name": "prod-server-42",
    "NoProxy": "9.81.1.160",
    "OomKillDisable": true,
    "OSType": "linux",
    "OperatingSystem": "Boot2Docker",
    "Plugins": {
        "Volume": [
            "local"
        ],
        "Network": [
            "null",
            "host",
            "bridge"
        ]
    },
    "RegistryConfig": {
        "IndexConfigs": {
            "docker.io": {
                "Mirrors": null,
                "Name": "docker.io",
                "Official": true,
                "Secure": true
            }
        },
        "InsecureRegistryCIDRs": [
            "127.0.0.0/8"
        ]
    },
    "SecurityOptions": [
        "apparmor",
        "seccomp",
        "selinux"
    ],
    "ServerVersion": "1.9.0",
    "SwapLimit": false,
    "SystemStatus": [["State", "Healthy"]],
    "SystemTime": "2015-03-10T11:11:23.730591467-07:00"
}

状态代码

  • 200 – 没有错误
  • 500 – 服务器错误

显示docker版本信息

GET /version

显示docker版本信息

请求示例

GET /v1.24/version HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
     "Version": "1.12.0",
     "Os": "linux",
     "KernelVersion": "3.19.0-23-generic",
     "GoVersion": "go1.6.3",
     "GitCommit": "deadbee",
     "Arch": "amd64",
     "ApiVersion": "1.24",
     "BuildTime": "2016-06-14T07:09:13.444803460+00:00",
     "Experimental": true
}

状态代码

  • 200 – 没有错误
  • 500 – 服务器错误

Ping docker 服务器

GET /_ping

Ping docker 服务器

请求示例

GET /v1.24/_ping HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: text/plain

OK

状态代码

  • 200 - 没有错误
  • 500-服务器错误

根据容器的更改创建新映像

POST /commit

根据容器的更改创建新映像

请求示例

POST /v1.24/commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
     "Hostname": "",
     "Domainname": "",
     "User": "",
     "AttachStdin": false,
     "AttachStdout": true,
     "AttachStderr": true,
     "Tty": false,
     "OpenStdin": false,
     "StdinOnce": false,
     "Env": null,
     "Cmd": [
             "date"
     ],
     "Mounts": [
       {
         "Source": "/data",
         "Destination": "/data",
         "Mode": "ro,Z",
         "RW": false
       }
     ],
     "Labels": {
             "key1": "value1",
             "key2": "value2"
      },
     "WorkingDir": "",
     "NetworkDisabled": false,
     "ExposedPorts": {
             "22/tcp": {}
     }
}

响应示例

HTTP/1.1 201 Created
Content-Type: application/json

{"Id": "596069db4bf5"}

JSON 参数

  • config - 容器的配置

查询参数

  • 容器——源容器
  • repo – 存储库
  • 标签——标签
  • 评论——提交消息
  • 作者– 作者(例如,“John Hannibal Smith < hannibal@a-team.com >”)
  • 暂停– 1/True/true 或 0/False/false, 是否在提交之前暂停容器
  • 更改– 提交时应用的 Dockerfile 指令

状态代码

  • 201 – 没有错误
  • 404 – 没有这样的容器
  • 500 – 服务器错误

监控Docker的事件

GET /events

通过流式传输实时从 docker 获取容器事件。

Docker 容器报告以下事件:

attach, commit, copy, create, destroy, detach, die, exec_create, exec_detach, exec_start, export, health_status, kill, oom, pause, rename, resize, restart, start, stop, top, unpause, update

Docker 镜像报告以下事件:

delete, import, load, pull, push, save, tag, untag

Docker 卷报告以下事件:

create, mount, unmount, destroy

Docker 网络报告以下事件:

create, connect, disconnect, destroy

Docker 守护进程报告以下事件:

reload

请求示例

GET /v1.24/events?since=1374067924

响应示例

HTTP/1.1 200 OK
Content-Type: application/json
Server: Docker/1.12.0 (linux)
Date: Fri, 29 Apr 2016 15:18:06 GMT
Transfer-Encoding: chunked

{
  "status": "pull",
  "id": "alpine:latest",
  "Type": "image",
  "Action": "pull",
  "Actor": {
    "ID": "alpine:latest",
    "Attributes": {
      "name": "alpine"
    }
  },
  "time": 1461943101,
  "timeNano": 1461943101301854122
}
{
  "status": "create",
  "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
  "from": "alpine",
  "Type": "container",
  "Action": "create",
  "Actor": {
    "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
    "Attributes": {
      "com.example.some-label": "some-label-value",
      "image": "alpine",
      "name": "my-container"
    }
  },
  "time": 1461943101,
  "timeNano": 1461943101381709551
}
{
  "status": "attach",
  "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
  "from": "alpine",
  "Type": "container",
  "Action": "attach",
  "Actor": {
    "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
    "Attributes": {
      "com.example.some-label": "some-label-value",
      "image": "alpine",
      "name": "my-container"
    }
  },
  "time": 1461943101,
  "timeNano": 1461943101383858412
}
{
  "Type": "network",
  "Action": "connect",
  "Actor": {
    "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474",
    "Attributes": {
      "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
      "name": "bridge",
      "type": "bridge"
    }
  },
  "time": 1461943101,
  "timeNano": 1461943101394865557
}
{
  "status": "start",
  "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
  "from": "alpine",
  "Type": "container",
  "Action": "start",
  "Actor": {
    "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
    "Attributes": {
      "com.example.some-label": "some-label-value",
      "image": "alpine",
      "name": "my-container"
    }
  },
  "time": 1461943101,
  "timeNano": 1461943101607533796
}
{
  "status": "resize",
  "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
  "from": "alpine",
  "Type": "container",
  "Action": "resize",
  "Actor": {
    "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
    "Attributes": {
      "com.example.some-label": "some-label-value",
      "height": "46",
      "image": "alpine",
      "name": "my-container",
      "width": "204"
    }
  },
  "time": 1461943101,
  "timeNano": 1461943101610269268
}
{
  "status": "die",
  "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
  "from": "alpine",
  "Type": "container",
  "Action": "die",
  "Actor": {
    "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
    "Attributes": {
      "com.example.some-label": "some-label-value",
      "exitCode": "0",
      "image": "alpine",
      "name": "my-container"
    }
  },
  "time": 1461943105,
  "timeNano": 1461943105079144137
}
{
  "Type": "network",
  "Action": "disconnect",
  "Actor": {
    "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474",
    "Attributes": {
      "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
      "name": "bridge",
      "type": "bridge"
    }
  },
  "time": 1461943105,
  "timeNano": 1461943105230860245
}
{
  "status": "destroy",
  "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
  "from": "alpine",
  "Type": "container",
  "Action": "destroy",
  "Actor": {
    "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
    "Attributes": {
      "com.example.some-label": "some-label-value",
      "image": "alpine",
      "name": "my-container"
    }
  },
  "time": 1461943105,
  "timeNano": 1461943105338056026
}

查询参数

  • - 时间戳。显示自时间戳以来创建的所有事件,然后进行流式传输
  • 直到——时间戳。显示在给定时间戳之前创建的事件并停止流式传输
  • filters – 要在事件列表上处理的过滤器的 json 编码值(map[string][]string)。可用的过滤器:
  • container=<string>; -- 过滤容器
  • event=<string>; -- 要过滤的事件
  • image=<string>; -- 要过滤的图像
  • label=<string>; -- 要过滤的图像和容器标签
  • type=<string>; -- 或containerimagevolumenetworkdaemon
  • volume=<string>; -- 过滤体积
  • network=<string>; -- 网络过滤
  • daemon=<string>; -- 要过滤的守护进程名称或 ID

状态代码

  • 200 – 没有错误
  • 400 - 错误参数
  • 500 – 服务器错误

获取包含存储库中所有图像的 tarball

GET /images/(name)/get

获取包含指定存储库的所有图像和元数据的 tarball name

如果name是特定名称和标签(例如 ubuntu:latest),则仅返回该图像(及其父图像)。如果name是图像 ID,则类似地仅返回该图像(及其父图像),但不包括 tarball 中的“存储库”文件,因为没有引用图像名称。

有关更多详细信息,请参阅 图像 tarball 格式。

请求示例

GET /v1.24/images/ubuntu/get

响应示例

HTTP/1.1 200 OK
Content-Type: application/x-tar

Binary data stream

状态代码

  • 200 – 没有错误
  • 500 – 服务器错误

获取包含所有图像的 tarball

GET /images/get

获取包含一个或多个存储库的所有图像和元数据的 tarball。

对于参数的每个值names:如果它是特定名称和标签(例如 ubuntu:latest),则仅返回该图像(及其父级);如果它是图像 ID,则类似地仅返回该图像(及其父级),并且“存储库”文件中不会引用该图像 ID 的名称。

有关更多详细信息,请参阅 图像 tarball 格式。

请求示例

GET /v1.24/images/get?names=myname%2Fmyapp%3Alatest&names=busybox

响应示例

HTTP/1.1 200 OK
Content-Type: application/x-tar

Binary data stream

状态代码

  • 200 – 没有错误
  • 500 – 服务器错误

将包含一组图像和标签的 tarball 加载到 docker 中

POST /images/load

将一组图像和标签加载到 Docker 存储库中。有关更多详细信息,请参阅 图像 tarball 格式。

请求示例

POST /v1.24/images/load
Content-Type: application/x-tar
Content-Length: 12345

Tarball in body

响应示例

HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked

{"status":"Loading layer","progressDetail":{"current":32768,"total":1292800},"progress":"[=                                                 ] 32.77 kB/1.293 MB","id":"8ac8bfaff55a"}
{"status":"Loading layer","progressDetail":{"current":65536,"total":1292800},"progress":"[==                                                ] 65.54 kB/1.293 MB","id":"8ac8bfaff55a"}
{"status":"Loading layer","progressDetail":{"current":98304,"total":1292800},"progress":"[===                                               ]  98.3 kB/1.293 MB","id":"8ac8bfaff55a"}
{"status":"Loading layer","progressDetail":{"current":131072,"total":1292800},"progress":"[=====                                             ] 131.1 kB/1.293 MB","id":"8ac8bfaff55a"}
...
{"stream":"Loaded image: busybox:latest\n"}

响应示例

如果“quiet”查询参数设置为true/ 1( ?quiet=1),则会抑制进度详细信息,并且操作完成后仅返回确认消息。

HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked

{"stream":"Loaded image: busybox:latest\n"}

查询参数

  • Quiet – 布尔值,在加载期间抑制进度细节。如果省略则默认为0/ false

状态代码

  • 200 – 没有错误
  • 500 – 服务器错误

图像 tarball 格式

图像 tarball 的每个图像层包含一个目录(使用其长 ID 命名),每个目录包含以下文件:

  • VERSION:当前1.0- 文件格式版本
  • json:详细的图层信息,类似docker inspect layer_id
  • layer.tar:包含本层文件系统更改的 tar 文件

layer.tar文件包含用于存储属性更改和删除的aufs样式文件和目录。.wh..wh.aufs

如果 tarball 定义了存储库,则 tarball 还应repositories在根目录中包含一个文件,其中包含映射到层 ID 的存储库和标记名称的列表。

{"hello-world":
    {"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"}
}

执行创建

POST /containers/(id or name)/exec

在正在运行的容器中设置 exec 实例id

请求示例

POST /v1.24/containers/e90e34656806/exec HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
  "AttachStdin": true,
  "AttachStdout": true,
  "AttachStderr": true,
  "Cmd": ["sh"],
  "DetachKeys": "ctrl-p,ctrl-q",
  "Privileged": true,
  "Tty": true,
  "User": "123:456"
}

响应示例

HTTP/1.1 201 Created
Content-Type: application/json

{
     "Id": "f90e34656806",
     "Warnings":[]
}

JSON 参数

  • AttachStdin - 布尔值,附加到stdin命令exec
  • AttachStdout - 布尔值,附加到stdout命令exec
  • AttachStderr - 布尔值,附加到stderr命令exec
  • DetachKeys – 覆盖用于分离容器的按键序列。格式是单个字符,[a-Z]或者ctrl-<value><value>以下之一:a-z@^[,_
  • Tty - 分配伪 TTY 的布尔值。
  • Cmd - 指定为字符串或字符串数​​组运行的命令。
  • Privileged - 布尔值,以扩展权限运行 exec 进程。
  • 用户- 指定用户的字符串值,以及(可选)在容器内运行 exec 进程的组。格式为以下之一:"user""user:group""uid""uid:gid"

状态代码

  • 201 – 没有错误
  • 404 – 没有这样的容器
  • 409 - 容器已暂停
  • 500-服务器错误

执行启动

POST /exec/(id)/start

启动先前设置的exec实例id。如果detach为 true,则该 API 在启动exec命令后返回。否则,此 API 将使用该命令建立交互式会话exec

请求示例

POST /v1.24/exec/e90e34656806/start HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
 "Detach": false,
 "Tty": false
}

响应示例

HTTP/1.1 200 OK
Content-Type: application/vnd.docker.raw-stream

{% raw %}
{{ STREAM }}
{% endraw %}

JSON 参数

  • 分离- 与命令分离exec
  • Tty - 分配伪 TTY 的布尔值。

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的执行实例
  • 409 - 容器已暂停

直播详情

POST /containers/(id or name)/attach类似于API的流行为

执行调整大小

POST /exec/(id)/resize

调整命令tty使用的会话的大小。单位是字符数。仅当指定为创建和启动命令的一部分时,此 API 才有效。execidttyexec

请求示例

POST /v1.24/exec/e90e34656806/resize?h=40&w=80 HTTP/1.1
Content-Type: text/plain

响应示例

HTTP/1.1 201 Created
Content-Type: text/plain

查询参数

  • htty –会话高度
  • w——宽度

状态代码

  • 201 – 没有错误
  • 404 – 没有这样的执行实例

执行检查

GET /exec/(id)/json

exec返回有关命令的低级信息id

请求示例

GET /v1.24/exec/11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39/json HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
  "CanRemove": false,
  "ContainerID": "b53ee82b53a40c7dca428523e34f741f3abc51d9f297a14ff874bf761b995126",
  "DetachKeys": "",
  "ExitCode": 2,
  "ID": "f33bbfb39f5b142420f4759b2348913bd4a8d1a6d7fd56499cb41a1bb91d7b3b",
  "OpenStderr": true,
  "OpenStdin": true,
  "OpenStdout": true,
  "ProcessConfig": {
    "arguments": [
      "-c",
      "exit 2"
    ],
    "entrypoint": "sh",
    "privileged": false,
    "tty": true,
    "user": "1000"
  },
  "Running": false
}

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的执行实例
  • 500-服务器错误

3.4 体积

列出卷

GET /volumes

请求示例

GET /v1.24/volumes HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
  "Volumes": [
    {
      "Name": "tardis",
      "Driver": "local",
      "Mountpoint": "/var/lib/docker/volumes/tardis",
      "Labels": null,
      "Scope": "local"
    }
  ],
  "Warnings": []
}

查询参数

  • 过滤器map[string][]string-要在卷列表上处理的过滤器 (a ) 的 JSON 编码值。可用的过滤器:
    • name=<volume-name>匹配卷名的全部或部分。
    • dangling=<boolean>当设置为true(或1) 时,返回所有“悬空”卷(容器未使用)。当设置为false(或0) 时,仅返回一个或多个容器正在使用的卷。
    • driver=<volume-driver-name>匹配卷驱动程序名称的全部或部分。

状态代码

  • 200 - 没有错误
  • 500-服务器错误

创建卷

POST /volumes/create

创建卷

请求示例

POST /v1.24/volumes/create HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
  "Name": "tardis",
  "Labels": {
    "com.example.some-label": "some-value",
    "com.example.some-other-label": "some-other-value"
  },
  "Driver": "custom"
}

响应示例

HTTP/1.1 201 Created
Content-Type: application/json

{
  "Name": "tardis",
  "Driver": "custom",
  "Mountpoint": "/var/lib/docker/volumes/tardis",
  "Status": {
    "hello": "world"
  },
  "Labels": {
    "com.example.some-label": "some-value",
    "com.example.some-other-label": "some-other-value"
  },
  "Scope": "local"
}

状态代码

  • 201 - 没有错误
  • 500-服务器错误

JSON 参数

  • 名称- 新卷的名称。如果未指定,Docker 会生成一个名称。
  • 驱动程序- 要使用的卷驱动程序的名称。默认为local名称。
  • DriverOpts - 驱动程序选项和值的映射。这些选项直接传递给驱动程序并且是特定于驱动程序的。
  • 标签- 要在卷上设置的标签,指定为映射:{"key":"value","key2":"value2"}

响应中的 JSON 字段

请参阅 检查卷部分或有关响应中返回的 JSON 字段的详细信息。

检查卷

GET /volumes/(name)

返回卷的低级信息name

请求示例

GET /v1.24/volumes/tardis

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
  "Name": "tardis",
  "Driver": "custom",
  "Mountpoint": "/var/lib/docker/volumes/tardis/_data",
  "Status": {
    "hello": "world"
  },
  "Labels": {
      "com.example.some-label": "some-value",
      "com.example.some-other-label": "some-other-value"
  },
  "Scope": "local"
}

状态代码

  • 200 - 没有错误
  • 404 - 没有这样的卷
  • 500-服务器错误

响应中的 JSON 字段

API 响应中可以返回以下字段。响应中可能会省略空字段或卷驱动程序不支持的字段。

  • 名称- 卷的名称。
  • 驱动程序- 卷使用的卷驱动程序的名称。
  • 挂载点- 主机上卷的挂载路径。
  • 状态- 有关卷的低级详细信息,由卷驱动程序提供。详细信息作为带有键/值对的映射返回:{"key":"value","key2":"value2"}。该Status字段是可选的,如果卷驱动程序不支持此功能,则该字段将被省略。
  • 标签- 在卷上设置的标签,指定为映射:{"key":"value","key2":"value2"}
  • 范围- 范围描述卷存在的级别,可以是 global集群范围或local机器级别之一。默认为local.

删除卷

DELETE /volumes/(name)

指示驱动程序移除卷 ( name)。

请求示例

DELETE /v1.24/volumes/tardis HTTP/1.1

响应示例

HTTP/1.1 204 No Content

状态代码

  • 204 - 没有错误
  • 404 - 没有这样的卷或卷驱动程序
  • 409 - 卷正在使用中,无法删除
  • 500-服务器错误

3.5 网络

列出网络

GET /networks

请求示例

GET /v1.24/networks?filters={"type":{"custom":true}} HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

[
  {
    "Name": "bridge",
    "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "Internal": false,
    "IPAM": {
      "Driver": "default",
      "Config": [
        {
          "Subnet": "172.17.0.0/16"
        }
      ]
    },
    "Containers": {
      "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": {
        "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda",
        "MacAddress": "02:42:ac:11:00:02",
        "IPv4Address": "172.17.0.2/16",
        "IPv6Address": ""
      }
    },
    "Options": {
      "com.docker.network.bridge.default_bridge": "true",
      "com.docker.network.bridge.enable_icc": "true",
      "com.docker.network.bridge.enable_ip_masquerade": "true",
      "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
      "com.docker.network.bridge.name": "docker0",
      "com.docker.network.driver.mtu": "1500"
    }
  },
  {
    "Name": "none",
    "Id": "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794",
    "Scope": "local",
    "Driver": "null",
    "EnableIPv6": false,
    "Internal": false,
    "IPAM": {
      "Driver": "default",
      "Config": []
    },
    "Containers": {},
    "Options": {}
  },
  {
    "Name": "host",
    "Id": "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e",
    "Scope": "local",
    "Driver": "host",
    "EnableIPv6": false,
    "Internal": false,
    "IPAM": {
      "Driver": "default",
      "Config": []
    },
    "Containers": {},
    "Options": {}
  }
]

查询参数

  • 过滤器- JSON 编码的网络列表过滤器。过滤器值为以下之一:
    • driver=<driver-name>匹配网络驱动程序。
    • id=<network-id>匹配全部或部分网络 ID。
    • label=<key>label=<key>=<value>网络标签。
    • name=<network-name>匹配全部或部分网络名称。
    • type=["custom"|"builtin"]按类型过滤网络。该custom关键字返回所有用户定义的网络。

状态代码

  • 200 - 没有错误
  • 500-服务器错误

检查网络

GET /networks/(id or name)

返回网络上的低级信息id

请求示例

GET /v1.24/networks/7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99 HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
  "Name": "net01",
  "Id": "7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99",
  "Scope": "local",
  "Driver": "bridge",
  "EnableIPv6": false,
  "IPAM": {
    "Driver": "default",
    "Config": [
      {
        "Subnet": "172.19.0.0/16",
        "Gateway": "172.19.0.1"
      }
    ],
    "Options": {
        "foo": "bar"
    }
  },
  "Internal": false,
  "Containers": {
    "19a4d5d687db25203351ed79d478946f861258f018fe384f229f2efa4b23513c": {
      "Name": "test",
      "EndpointID": "628cadb8bcb92de107b2a1e516cbffe463e321f548feb37697cce00ad694f21a",
      "MacAddress": "02:42:ac:13:00:02",
      "IPv4Address": "172.19.0.2/16",
      "IPv6Address": ""
    }
  },
  "Options": {
    "com.docker.network.bridge.default_bridge": "true",
    "com.docker.network.bridge.enable_icc": "true",
    "com.docker.network.bridge.enable_ip_masquerade": "true",
    "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
    "com.docker.network.bridge.name": "docker0",
    "com.docker.network.driver.mtu": "1500"
  },
  "Labels": {
    "com.example.some-label": "some-value",
    "com.example.some-other-label": "some-other-value"
  }
}

状态代码

  • 200 - 没有错误
  • 404-找不到网络
  • 500-服务器错误

创建网络

POST /networks/create

创建网络

请求示例

POST /v1.24/networks/create HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
  "Name":"isolated_nw",
  "CheckDuplicate":true,
  "Driver":"bridge",
  "EnableIPv6": true,
  "IPAM":{
    "Driver": "default",
    "Config":[
      {
        "Subnet":"172.20.0.0/16",
        "IPRange":"172.20.10.0/24",
        "Gateway":"172.20.10.11"
      },
      {
        "Subnet":"2001:db8:abcd::/64",
        "Gateway":"2001:db8:abcd::1011"
      }
    ],
    "Options": {
      "foo": "bar"
    }
  },
  "Internal":true,
  "Options": {
    "com.docker.network.bridge.default_bridge": "true",
    "com.docker.network.bridge.enable_icc": "true",
    "com.docker.network.bridge.enable_ip_masquerade": "true",
    "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
    "com.docker.network.bridge.name": "docker0",
    "com.docker.network.driver.mtu": "1500"
  },
  "Labels": {
    "com.example.some-label": "some-value",
    "com.example.some-other-label": "some-other-value"
  }
}

响应示例

HTTP/1.1 201 Created
Content-Type: application/json

{
  "Id": "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30",
  "Warning": ""
}

状态代码

  • 201 - 没有错误
  • 403 - 预定义网络不支持操作
  • 404 - 找不到插件
  • 500-服务器错误

JSON 参数

  • 名称- 新网络的名称。这是必填字段
  • CheckDuplicate - 请求守护进程检查具有相同名称的网络。默认为false.由于网络主要基于随机 ID 而不是基于名称进行键入,并且网络名称严格来说是使用 ID 唯一标识的网络的用户友好别名,因此没有保证检查重复项的方法。此参数 CheckDuplicate 旨在尽最大努力检查具有相同名称的任何网络,但不能保证捕获所有名称冲突。
  • 驱动程序- 要使用的网络驱动程序插件的名称。默认为bridge驱动程序
  • 内部- 限制外部对网络的访问
  • IPAM - 可选的网络自定义 IP 方案
    • 驱动程序- 要使用的 IPAM 驱动程序的名称。默认为default驱动程序
    • 配置- IPAM 配置选项列表,指定为映射: {"Subnet": <CIDR>, "IPRange": <CIDR>, "Gateway": <IP address>, "AuxAddress": <device_name:IP address>}
    • 选项- 特定于驱动程序的选项,指定为映射:{"option":"value" [,"option2":"value2"]}
  • EnableIPv6 - 在网络上启用 IPv6
  • 选项- 驱动程序使用的网络特定选项
  • 标签- 在网络上设置的标签,指定为地图:{"key":"value" [,"key2":"value2"]}

将容器连接到网络

POST /networks/(id or name)/connect

将容器连接到网络

请求示例

POST /v1.24/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/connect HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
  "Container":"3613f73ba0e4",
  "EndpointConfig": {
    "IPAMConfig": {
        "IPv4Address":"172.24.56.89",
        "IPv6Address":"2001:db8::5689"
    }
  }
}

响应示例

HTTP/1.1 200 OK

状态代码

  • 200 - 没有错误
  • 403 - 群范围网络不支持操作
  • 404 - 未找到网络或容器
  • 500内部服务器错误

JSON 参数

  • 容器- 要连接到网络的容器 ID/名称

断开容器与网络的连接

POST /networks/(id or name)/disconnect

断开容器与网络的连接

请求示例

POST /v1.24/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/disconnect HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
  "Container":"3613f73ba0e4",
  "Force":false
}

响应示例

HTTP/1.1 200 OK

状态代码

  • 200 - 没有错误
  • 403 - 群范围网络不支持操作
  • 404 - 未找到网络或容器
  • 500内部服务器错误

JSON 参数

  • 容器- 要与网络断开连接的容器 ID/名称
  • 强制- 强制容器与网络断开连接

删除网络

DELETE /networks/(id or name)

指示驱动程序删除网络 ( id)。

请求示例

DELETE /v1.24/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30 HTTP/1.1

响应示例

HTTP/1.1 204 No Content

状态代码

  • 204 - 没有错误
  • 403 - 预定义网络不支持操作
  • 404 - 没有这样的网络
  • 500-服务器错误

3.6 插件(实验性)

列出插件

GET /plugins

返回有关已安装插件的信息。

请求示例

GET /v1.24/plugins HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

[
  {
    "Id": "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078",
    "Name": "tiborvass/no-remove",
    "Tag": "latest",
    "Active": true,
    "Config": {
      "Mounts": [
        {
          "Name": "",
          "Description": "",
          "Settable": null,
          "Source": "/data",
          "Destination": "/data",
          "Type": "bind",
          "Options": [
            "shared",
            "rbind"
          ]
        },
        {
          "Name": "",
          "Description": "",
          "Settable": null,
          "Source": null,
          "Destination": "/foobar",
          "Type": "tmpfs",
          "Options": null
        }
      ],
      "Env": [
        "DEBUG=1"
      ],
      "Args": null,
      "Devices": null
    },
    "Manifest": {
      "ManifestVersion": "v0",
      "Description": "A test plugin for Docker",
      "Documentation": "https://docker.github.net.cn/engine/extend/plugins/",
      "Interface": {
        "Types": [
          "docker.volumedriver/1.0"
        ],
        "Socket": "plugins.sock"
      },
      "Entrypoint": [
        "plugin-no-remove",
        "/data"
      ],
      "Workdir": "",
      "User": {
      },
      "Network": {
        "Type": "host"
      },
      "Capabilities": null,
      "Mounts": [
        {
          "Name": "",
          "Description": "",
          "Settable": null,
          "Source": "/data",
          "Destination": "/data",
          "Type": "bind",
          "Options": [
            "shared",
            "rbind"
          ]
        },
        {
          "Name": "",
          "Description": "",
          "Settable": null,
          "Source": null,
          "Destination": "/foobar",
          "Type": "tmpfs",
          "Options": null
        }
      ],
      "Devices": [
        {
          "Name": "device",
          "Description": "a host device to mount",
          "Settable": null,
          "Path": "/dev/cpu_dma_latency"
        }
      ],
      "Env": [
        {
          "Name": "DEBUG",
          "Description": "If set, prints debug messages",
          "Settable": null,
          "Value": "1"
        }
      ],
      "Args": {
        "Name": "args",
        "Description": "command line arguments",
        "Settable": null,
        "Value": [

        ]
      }
    }
  }
]

状态代码

  • 200 - 没有错误
  • 500-服务器错误

安装插件

POST /plugins/pull?name=<plugin name>

拉取并安装插件。安装插件后,可以使用 POST /plugins/(plugin name)/enable端点启用它。

请求示例

POST /v1.24/plugins/pull?name=tiborvass/no-remove:latest HTTP/1.1

:latest标签是可选的,如果省略则用作默认标签。当使用此端点从注册表中提取插件时,X-Registry-Auth标头可用于包含 Base64 编码的 AuthConfig 对象。有关更多详细信息,请参阅 创建图像部分。

响应示例

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 175

[
  {
    "Name": "network",
    "Description": "",
    "Value": [
      "host"
    ]
  },
  {
    "Name": "mount",
    "Description": "",
    "Value": [
      "/data"
    ]
  },
  {
    "Name": "device",
    "Description": "",
    "Value": [
      "/dev/cpu_dma_latency"
    ]
  }
]

查询参数

  • name - 要拉取的插件的名称。该名称可以包括标签或摘要。此参数是必需的。

状态代码

  • 200 - 没有错误
  • 500 - 解析引用时出错/不是有效的存储库/标签:存储库名称必须至少有一个组成部分
  • 500 - 插件已存在

检查插件

GET /plugins/(plugin name)

返回有关已安装插件的详细信息。

请求示例

GET /v1.24/plugins/tiborvass/no-remove:latest HTTP/1.1

:latest标签是可选的,如果省略则用作默认标签。

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
  "Id": "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078",
  "Name": "tiborvass/no-remove",
  "Tag": "latest",
  "Active": false,
  "Config": {
    "Mounts": [
      {
        "Name": "",
        "Description": "",
        "Settable": null,
        "Source": "/data",
        "Destination": "/data",
        "Type": "bind",
        "Options": [
          "shared",
          "rbind"
        ]
      },
      {
        "Name": "",
        "Description": "",
        "Settable": null,
        "Source": null,
        "Destination": "/foobar",
        "Type": "tmpfs",
        "Options": null
      }
    ],
    "Env": [
      "DEBUG=1"
    ],
    "Args": null,
    "Devices": null
  },
  "Manifest": {
    "ManifestVersion": "v0",
    "Description": "A test plugin for Docker",
    "Documentation": "https://docker.github.net.cn/engine/extend/plugins/",
    "Interface": {
      "Types": [
        "docker.volumedriver/1.0"
      ],
      "Socket": "plugins.sock"
    },
    "Entrypoint": [
      "plugin-no-remove",
      "/data"
    ],
    "Workdir": "",
    "User": {
    },
    "Network": {
      "Type": "host"
    },
    "Capabilities": null,
    "Mounts": [
      {
        "Name": "",
        "Description": "",
        "Settable": null,
        "Source": "/data",
        "Destination": "/data",
        "Type": "bind",
        "Options": [
          "shared",
          "rbind"
        ]
      },
      {
        "Name": "",
        "Description": "",
        "Settable": null,
        "Source": null,
        "Destination": "/foobar",
        "Type": "tmpfs",
        "Options": null
      }
    ],
    "Devices": [
      {
        "Name": "device",
        "Description": "a host device to mount",
        "Settable": null,
        "Path": "/dev/cpu_dma_latency"
      }
    ],
    "Env": [
      {
        "Name": "DEBUG",
        "Description": "If set, prints debug messages",
        "Settable": null,
        "Value": "1"
      }
    ],
    "Args": {
      "Name": "args",
      "Description": "command line arguments",
      "Settable": null,
      "Value": [

      ]
    }
  }
}

状态代码

  • 200 - 没有错误
  • 404 - 插件未安装

启用插件

POST /plugins/(plugin name)/enable

启用插件

请求示例

POST /v1.24/plugins/tiborvass/no-remove:latest/enable HTTP/1.1

:latest标签是可选的,如果省略则用作默认标签。

响应示例

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8

状态代码

  • 200 - 没有错误
  • 404 - 插件未安装
  • 500 - 插件已启用

禁用插件

POST /plugins/(plugin name)/disable

禁用插件

请求示例

POST /v1.24/plugins/tiborvass/no-remove:latest/disable HTTP/1.1

:latest标签是可选的,如果省略则用作默认标签。

响应示例

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8

状态代码

  • 200 - 没有错误
  • 404 - 插件未安装
  • 500 - 插件已被禁用

删除插件

DELETE /plugins/(plugin name)

删除一个插件

请求示例

DELETE /v1.24/plugins/tiborvass/no-remove:latest HTTP/1.1

:latest标签是可选的,如果省略则用作默认标签。

响应示例

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8

状态代码

  • 200 - 没有错误
  • 404 - 插件未安装
  • 500 - 插件处于活动状态

3.7 节点

注意:节点操作要求引擎是集群的一部分。

列出节点

GET /nodes

列出节点

请求示例

GET /v1.24/nodes HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

[
  {
    "ID": "24ifsmvkjbyhk",
    "Version": {
      "Index": 8
    },
    "CreatedAt": "2016-06-07T20:31:11.853781916Z",
    "UpdatedAt": "2016-06-07T20:31:11.999868824Z",
    "Spec": {
      "Name": "my-node",
      "Role": "manager",
      "Availability": "active"
      "Labels": {
          "foo": "bar"
      }
    },
    "Description": {
      "Hostname": "bf3067039e47",
      "Platform": {
        "Architecture": "x86_64",
        "OS": "linux"
      },
      "Resources": {
        "NanoCPUs": 4000000000,
        "MemoryBytes": 8272408576
      },
      "Engine": {
        "EngineVersion": "1.12.0",
        "Labels": {
            "foo": "bar",
        }
        "Plugins": [
          {
            "Type": "Volume",
            "Name": "local"
          },
          {
            "Type": "Network",
            "Name": "bridge"
          }
          {
            "Type": "Network",
            "Name": "null"
          }
          {
            "Type": "Network",
            "Name": "overlay"
          }
        ]
      }
    },
    "Status": {
      "State": "ready"
    },
    "ManagerStatus": {
      "Leader": true,
      "Reachability": "reachable",
      "Addr": "172.17.0.2:2377""
    }
  }
]

查询参数

  • 过滤器map[string][]string–要在节点列表上处理的过滤器 (a ) 的 JSON 编码值。可用的过滤器:
    • id=<node id>
    • label=<engine label>
    • membership=( accepted| pending)`
    • name=<node name>
    • role=( manager| worker)`

状态代码

  • 200 – 没有错误
  • 406 - 节点不是群的一部分
  • 500 – 服务器错误

检查节点

GET /nodes/(id or name)

返回节点的低级信息id

请求示例

  GET /v1.24/nodes/24ifsmvkjbyhk HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
  "ID": "24ifsmvkjbyhk",
  "Version": {
    "Index": 8
  },
  "CreatedAt": "2016-06-07T20:31:11.853781916Z",
  "UpdatedAt": "2016-06-07T20:31:11.999868824Z",
  "Spec": {
    "Name": "my-node",
    "Role": "manager",
    "Availability": "active"
    "Labels": {
        "foo": "bar"
    }
  },
  "Description": {
    "Hostname": "bf3067039e47",
    "Platform": {
      "Architecture": "x86_64",
      "OS": "linux"
    },
    "Resources": {
      "NanoCPUs": 4000000000,
      "MemoryBytes": 8272408576
    },
    "Engine": {
      "EngineVersion": "1.12.0",
      "Labels": {
          "foo": "bar",
      }
      "Plugins": [
        {
          "Type": "Volume",
          "Name": "local"
        },
        {
          "Type": "Network",
          "Name": "bridge"
        }
        {
          "Type": "Network",
          "Name": "null"
        }
        {
          "Type": "Network",
          "Name": "overlay"
        }
      ]
    }
  },
  "Status": {
    "State": "ready"
  },
  "ManagerStatus": {
    "Leader": true,
    "Reachability": "reachable",
    "Addr": "172.17.0.2:2377""
  }
}

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的节点
  • 406 – 节点不是群的一部分
  • 500 – 服务器错误

删除一个节点

DELETE /nodes/(id or name)

从集群中删除一个节点。

请求示例

DELETE /v1.24/nodes/24ifsmvkjbyhk HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8

查询参数

  • 强制- 1/True/true 或 0/False/false,强制从群中删除节点。默认false

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的节点
  • 406 – 节点不是群的一部分
  • 500 – 服务器错误

更新一个节点

POST /nodes/(id)/update

更新一个节点。

请求的有效负载POST是新的NodeSpec,并且覆盖NodeSpec指定节点的当前有效负载。

如果省略AvailabilityRole,则会返回错误。省略的任何其他字段都会将当前值重置为空值或默认的集群范围值。

请求示例

POST /v1.24/nodes/24ifsmvkjbyhk/update?version=8 HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
  "Availability": "active",
  "Name": "node-name",
  "Role": "manager",
  "Labels": {
    "foo": "bar"
  }
}

响应示例

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8

查询参数

  • version – 正在更新的节点对象的版本号。这是避免写入冲突所必需的。

JSON 参数:

  • 注释– 与节点关联的可选元数据。
    • 名称– 用户定义的节点名称。
    • 标签– 与节点关联的标签映射(例如 {"key":"value", "key2":"value2"})。
  • 角色- 节点的角色(工作人员|经理)。
  • 可用性- 节点的可用性(活动|暂停|耗尽)。

状态代码

  • 200 – 没有错误
  • 404 – 没有这样的节点
  • 406 – 节点不是群的一部分
  • 500 – 服务器错误

3.8 群体

检查群

GET /swarm

检查群

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
  "CreatedAt" : "2016-08-15T16:00:20.349727406Z",
  "Spec" : {
    "Dispatcher" : {
      "HeartbeatPeriod" : 5000000000
    },
    "Orchestration" : {
     "TaskHistoryRetentionLimit" : 10
    },
    "CAConfig" : {
      "NodeCertExpiry" : 7776000000000000
    },
    "Raft" : {
      "LogEntriesForSlowFollowers" : 500,
      "HeartbeatTick" : 1,
      "SnapshotInterval" : 10000,
      "ElectionTick" : 3
    },
    "TaskDefaults" : {},
    "Name" : "default"
  },
 "JoinTokens" : {
    "Worker" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-6qmn92w6bu3jdvnglku58u11a",
    "Manager" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-8llk83c4wm9lwioey2s316r9l"
 },
 "ID" : "70ilmkj2f6sp2137c753w2nmt",
 "UpdatedAt" : "2016-08-15T16:32:09.623207604Z",
 "Version" : {
   "Index" : 51
}

}

状态代码

  • 200 - 没有错误
  • 406 – 节点不是群的一部分
  • 500 - 服务器错误

初始化一个新的集群

POST /swarm/init

初始化一个新的群。 HTTP 响应的正文包括节点 ID。

请求示例

POST /v1.24/swarm/init HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
  "ListenAddr": "0.0.0.0:2377",
  "AdvertiseAddr": "192.168.1.1:2377",
  "ForceNewCluster": false,
  "Spec": {
    "Orchestration": {},
    "Raft": {},
    "Dispatcher": {},
    "CAConfig": {}
  }
}

响应示例

HTTP/1.1 200 OK
Content-Length: 28
Content-Type: application/json
Date: Thu, 01 Sep 2016 21:49:13 GMT
Server: Docker/1.12.0 (linux)

"7v2t30z9blmxuhnyo6s4cpenp"

状态代码

  • 200 – 没有错误
  • 400 – 错误参数
  • 406 – 节点已经是集群的一部分
  • 500-服务器错误

JSON 参数:

  • ListenAddr – 用于管理器间通信的侦听地址,以及确定用于 VXLAN 隧道端点 (VTEP) 的网络接口。这可以是 形式的地址/端口组合192.168.1.1:4567,也可以是后跟端口号的接口,例如eth0:4567。如果省略端口号,则使用默认的集群侦听端口。
  • AdvertiseAddr – 通告给其他节点的外部可访问地址。这可以是 形式的地址/端口组合192.168.1.1:4567,也可以是后跟端口号的接口,例如eth0:4567。如果省略端口号,则使用侦听地址中的端口号。如果AdvertiseAddr未指定,则会在可能的情况下自动检测。
  • ForceNewCluster – 强制创建新集群。
  • Spec – 新群的配置设置。
    • Orchestration – 群的编排方面的配置设置。
      • TaskHistoryRetentionLimit – 存储的任务历史记录的最大数量。
    • Raft – Raft 相关配置。
      • SnapshotInterval – 快照之间的日志条目数。
      • KeepOldSnapshots – 在当前快照之外保留的快照数量。
      • LogEntriesForSlowFollowers – 创建快照后要保留以同步慢速关注者的日志条目数。
      • HeartbeatTick – 每次心跳之间的滴答数(以秒为单位)。
      • ElectionTick – 在没有领导者的情况下触发新选举所需的滴答数(以秒为单位)。
    • 调度程序– 任务调度程序的配置设置。
      • HeartbeatPeriod – 代理向调度程序发送心跳的延迟。
    • CAConfig – 证书颁发机构配置。
      • NodeCertExpiry – 节点证书自动过期。
      • 外部CA - 用于将签名请求转发到外部证书颁发机构的配置。
        • 协议- 与外部 CA 通信的协议(当前仅支持“cfssl”)。
        • URL - 应发送证书签名请求的 URL。
        • 选项- 具有键/值对的对象,这些键/值对被解释为外部 CA 驱动程序的协议特定选项。

加入现有群体

POST /swarm/join

加入现有群体

请求示例

POST /v1.24/swarm/join HTTP/1.1
Content-Type: application/json

{
  "ListenAddr": "0.0.0.0:2377",
  "AdvertiseAddr": "192.168.1.1:2377",
  "RemoteAddrs": ["node1:2377"],
  "JoinToken": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2"
}

响应示例

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8

状态代码

  • 200 – 没有错误
  • 400 – 错误参数
  • 406 – 节点已经是集群的一部分
  • 500-服务器错误

JSON 参数:

  • ListenAddr – 如果节点升级为管理器,则用于管理器间通信的侦听地址,以及确定用于 VXLAN 隧道端点 (VTEP) 的网络接口。
  • AdvertiseAddr – 通告给其他节点的外部可访问地址。这可以是 形式的地址/端口组合192.168.1.1:4567,也可以是后跟端口号的接口,例如eth0:4567。如果省略端口号,则使用侦听地址中的端口号。如果AdvertiseAddr未指定,则会在可能的情况下自动检测。
  • RemoteAddr – 已参与集群的任何管理器节点的地址。
  • JoinToken – 加入该群的秘密令牌。

留下一大群

POST /swarm/leave

留下一大群

请求示例

POST /v1.24/swarm/leave HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8

查询参数

  • - 布尔值(0/1,假/真)。强制离开 swarm,即使这是最后一个管理器或者它会破坏集群。

状态代码

  • 200 – 没有错误
  • 406 – 节点不是群的一部分
  • 500-服务器错误

更新群

POST /swarm/update

更新群

请求示例

POST /v1.24/swarm/update HTTP/1.1
Content-Length: 12345

{
  "Name": "default",
  "Orchestration": {
    "TaskHistoryRetentionLimit": 10
  },
  "Raft": {
    "SnapshotInterval": 10000,
    "LogEntriesForSlowFollowers": 500,
    "HeartbeatTick": 1,
    "ElectionTick": 3
  },
  "Dispatcher": {
    "HeartbeatPeriod": 5000000000
  },
  "CAConfig": {
    "NodeCertExpiry": 7776000000000000
  },
  "JoinTokens": {
    "Worker": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx",
    "Manager": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2"
  }
}

响应示例

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8

查询参数

  • version – 正在更新的 swarm 对象的版本号。这是避免写入冲突所必需的。
  • rotateWorkerToken - 设置为true(或1)以轮换工作线程加入令牌。
  • rotateManagerToken - 设置为true(或1)以轮换管理器加入令牌。

状态代码

  • 200 – 没有错误
  • 400 – 错误参数
  • 406 – 节点不是群的一部分
  • 500-服务器错误

JSON 参数:

  • Orchestration – 群的编排方面的配置设置。
    • TaskHistoryRetentionLimit – 存储的任务历史记录的最大数量。
  • Raft – Raft 相关配置。
    • SnapshotInterval – 快照之间的日志条目数。
    • KeepOldSnapshots – 在当前快照之外保留的快照数量。
    • LogEntriesForSlowFollowers – 创建快照后要保留以同步慢速关注者的日志条目数。
    • HeartbeatTick – 每次心跳之间的滴答数(以秒为单位)。
    • ElectionTick – 在没有领导者的情况下触发新选举所需的滴答数(以秒为单位)。
  • 调度程序– 任务调度程序的配置设置。
    • HeartbeatPeriod – 代理向调度程序发送心跳的延迟。
  • CAConfig – CA 配置。
    • NodeCertExpiry – 节点证书自动过期。
    • 外部CA - 用于将签名请求转发到外部证书颁发机构的配置。
      • 协议- 与外部 CA 通信的协议(当前仅支持“cfssl”)。
      • URL - 应发送证书签名请求的 URL。
      • 选项- 具有键/值对的对象,这些键/值对被解释为外部 CA 驱动程序的协议特定选项。
  • JoinTokens - 其他节点可以用来加入群的令牌。
    • Worker - 用于作为工人加入的令牌。
    • 经理- 用于作为经理加入的令牌。

3.9 服务

注意:服务操作需要首先成为集群的一部分。

列出服务

GET /services

列出服务

请求示例

GET /v1.24/services HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Type: application/json

[
  {
    "ID": "9mnpnzenvg8p8tdbtq4wvbkcz",
    "Version": {
      "Index": 19
    },
    "CreatedAt": "2016-06-07T21:05:51.880065305Z",
    "UpdatedAt": "2016-06-07T21:07:29.962229872Z",
    "Spec": {
      "Name": "hopeful_cori",
      "TaskTemplate": {
        "ContainerSpec": {
          "Image": "redis"
        },
        "Resources": {
          "Limits": {},
          "Reservations": {}
        },
        "RestartPolicy": {
          "Condition": "any",
          "MaxAttempts": 0
        },
        "Placement": {
          "Constraints": [
            "node.role == worker"
          ]
        }
      },
      "Mode": {
        "Replicated": {
          "Replicas": 1
        }
      },
      "UpdateConfig": {
        "Parallelism": 1,
        "FailureAction": "pause"
      },
      "EndpointSpec": {
        "Mode": "vip",
        "Ports": [
          {
            "Protocol": "tcp",
            "TargetPort": 6379,
            "PublishedPort": 30001
          }
        ]
      }
    },
    "Endpoint": {
      "Spec": {
        "Mode": "vip",
        "Ports": [
          {
            "Protocol": "tcp",
            "TargetPort": 6379,
            "PublishedPort": 30001
          }
        ]
      },
      "Ports": [
        {
          "Protocol": "tcp",
          "TargetPort": 6379,
          "PublishedPort": 30001
        }
      ],
      "VirtualIPs": [
        {
          "NetworkID": "4qvuz4ko70xaltuqbt8956gd1",
          "Addr": "10.255.0.2/16"
        },
        {
          "NetworkID": "4qvuz4ko70xaltuqbt8956gd1",
          "Addr": "10.255.0.3/16"
        }
      ]
    }
  }
]

查询参数

  • 过滤器map[string][]string–要在服务列表上处理的过滤器 (a ) 的 JSON 编码值。可用的过滤器:
    • id=<service id>
    • label=<service label>
    • name=<service name>

状态代码

  • 200 – 没有错误
  • 406 – 节点不是群的一部分
  • 500 – 服务器错误

创建服务

POST /services/create

创建服务。当使用此端点通过注册表中的私有存储库创建服务时,X-Registry-Auth必须使用标头来包含 base64 编码的 AuthConfig 对象。有关更多详细信息,请参阅 创建图像部分。

请求示例

POST /v1.24/services/create HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
  "Name": "web",
  "TaskTemplate": {
    "ContainerSpec": {
      "Image": "nginx:alpine",
      "Mounts": [
        {
          "ReadOnly": true,
          "Source": "web-data",
          "Target": "/usr/share/nginx/html",
          "Type": "volume",
          "VolumeOptions": {
            "DriverConfig": {
            },
            "Labels": {
              "com.example.something": "something-value"
            }
          }
        }
      ],
      "User": "33"
    },
    "Networks": [
        {
          "Target": "overlay1"
        }
    ],
    "LogDriver": {
      "Name": "json-file",
      "Options": {
        "max-file": "3",
        "max-size": "10M"
      }
    },
    "Placement": {
      "Constraints": [
        "node.role == worker"
      ]
    },
    "Resources": {
      "Limits": {
        "MemoryBytes": 104857600
      },
      "Reservations": {
      }
    },
    "RestartPolicy": {
      "Condition": "on-failure",
      "Delay": 10000000000,
      "MaxAttempts": 10
    }
  },
  "Mode": {
    "Replicated": {
      "Replicas": 4
    }
  },
  "UpdateConfig": {
    "Delay": 30000000000,
    "Parallelism": 2,
    "FailureAction": "pause"
  },
  "EndpointSpec": {
    "Ports": [
      {
        "Protocol": "tcp",
        "PublishedPort": 8080,
        "TargetPort": 80
      }
    ]
  },
  "Labels": {
    "foo": "bar"
  }
}

响应示例

HTTP/1.1 201 Created
Content-Type: application/json

{
  "ID":"ak7w3gjqoa3kuz8xcpnyy0pvl"
}

状态代码

  • 201 – 没有错误
  • 403 - 网络不符合服务资格
  • 406 – 节点不是群的一部分
  • 409 – 名称与现有对象冲突
  • 500-服务器错误

JSON 参数

  • 名称– 用户定义的服务名称。
  • 标签– 与服务关联的标签映射(例如{"key":"value", "key2":"value2"})。
  • TaskTemplate – 作为新服务一部分启动的任务规范。
    • ContainerSpec - 容器的容器设置作为此任务的一部分启动。
      • Image – 指定用于容器的图像名称的字符串。
      • 命令– 要在映像中运行的命令。
      • Args – 命令的参数。
      • Env – 格式的环境变量列表["VAR=value"[,"VAR2=value2"]]
      • Dir – 指定运行命令的工作目录的字符串。
      • 用户– 指定容器内用户的字符串值。
      • 标签– 与服务关联的标签映射(例如 {"key":"value", "key2":"value2"})。
      • 安装– 添加到作为服务一部分创建的容器的安装规范。
        • 目标– 容器路径。
        • – 挂载源(例如卷名称、主机路径)。
        • 类型– 安装类型(bind、 或volume)。
        • ReadOnly – 一个布尔值,指示挂载是否应为只读。
        • BindOptions - 类型的可选配置bind
          • 传播– 值为[r]private[r]shared或 的传播模式[r]slave
        • VolumeOptions – 类型的可选配置volume
          • NoCopy – 一个布尔值,指示是否应使用来自目标的数据填充卷。 (默认假)
          • 标签– 用户定义的卷名称和标签。
          • DriverConfig – 驱动程序特定选项的映射。
            • 名称- 用于创建卷的驱动程序的名称。
            • 选项- 驱动程序特定选项的键/值映射。
      • StopGracePeriod – 在强制终止容器之前等待容器终止的时间。
    • LogDriver - 作为服务一部分创建的容器的日志配置。
      • 名称- 要使用的日志记录驱动程序的名称 ( json-file, syslog, journald, gelf, fluentd, awslogs, splunk, etwlogs, none)。
      • 选项- 驱动程序特定的选项。
    • 资源– 适用于作为服务一部分创建的每个单独容器的资源要求。
      • 限制– 定义资源限制。
        • NanoCPU – CPU 限制以 10 -9个CPU 份额为单位。
        • MemoryBytes – 内存限制(以字节为单位)。
      • 预留– 定义资源预留。
        • NanoCPU – 以 10 -9个CPU 份额为单位的 CPU 预留。
        • MemoryBytes – 内存预留(以字节为单位)。
    • RestartPolicy – 重新启动策略的规范,适用于作为此服务的一部分创建的容器。
      • 条件– 重新启动的条件(noneon-failureany)。
      • 延迟– 重新启动尝试之间的延迟。
      • MaxAttempts – 放弃之前重新启动给定容器的最大尝试次数(默认值为 0,将被忽略)。
      • Window – Windows 是用于评估重启策略的时间窗口(默认值为 0,无界)。
    • 放置– 对服务可以运行的位置的限制。
      • 约束– 一系列约束,例如[ "node.role == manager" ]
  • 模式– 服务的调度模式(replicatedglobal,默认为replicated)。
  • UpdateConfig – 服务更新策略的规范。
    • 并行度– 一次迭代中要更新的最大任务数(0 表示无限并行度)。
    • 延迟– 更新之间的时间量。
    • FailureAction - 如果更新的任务无法运行或在更新期间停止运行,则采取的操作。值为continuepause
  • 网络– 要将服务附加到的网络名称或 ID 的数组。
  • EndpointSpec – 可配置为访问和负载平衡服务的属性。
    • 模式– 用于任务之间内部负载平衡的解析模式(vipdnsrr)。vip如果未提供则默认为。
    • 端口– 可从外部访问此服务的公开端口列表,格式为: {"Protocol": <"tcp"|"udp">, "PublishedPort": <port>, "TargetPort": <port>}。仅当vip使用解析模式时才能提供端口。

请求标头

  • 内容类型– 设置为"application/json".
  • X-Registry-Auth – base64 编码的 AuthConfig 对象,包含登录信息或令牌。 有关更多详细信息,请参阅 创建图像部分。

删除服务

DELETE /services/(id or name)

停止并删除服务id

请求示例

DELETE /v1.24/services/16253994b7c4 HTTP/1.1

响应示例

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8

状态代码

  • 200 – 没有错误
  • 404——没有这样的服务
  • 406 - 节点不是群的一部分
  • 500 – 服务器错误

检查一项或多项服务

GET /services/(id or name)

返回有关服务的信息id

请求示例

GET /v1.24/services/1cb4dnqcyx6m66g2t538x3rxha HTTP/1.1

响应示例

{
  "ID": "ak7w3gjqoa3kuz8xcpnyy0pvl",
  "Version": {
    "Index": 95
  },
  "CreatedAt": "2016-06-07T21:10:20.269723157Z",
  "UpdatedAt": "2016-06-07T21:10:20.276301259Z",
  "Spec": {
    "Name": "redis",
    "TaskTemplate": {
      "ContainerSpec": {
        "Image": "redis"
      },
      "Resources": {
        "Limits": {},
        "Reservations": {}
      },
      "RestartPolicy": {
        "Condition": "any",
        "MaxAttempts": 0
      },
      "Placement": {}
    },
    "Mode": {
      "Replicated": {
        "Replicas": 1
      }
    },
    "UpdateConfig": {
      "Parallelism": 1,
      "FailureAction": "pause"
    },
    "EndpointSpec": {
      "Mode": "vip",
      "Ports": [
        {
          "Protocol": "tcp",
          "TargetPort": 6379,
          "PublishedPort": 30001
        }
      ]
    }
  },
  "Endpoint": {
    "Spec": {
      "Mode": "vip",
      "Ports": [
        {
          "Protocol": "tcp",
          "TargetPort": 6379,
          "PublishedPort": 30001
        }
      ]
    },
    "Ports": [
      {
        "Protocol": "tcp",
        "TargetPort": 6379,
        "PublishedPort": 30001
      }
    ],
    "VirtualIPs": [
      {
        "NetworkID": "4qvuz4ko70xaltuqbt8956gd1",
        "Addr": "10.255.0.4/16"
      }
    ]
  }
}

状态代码

  • 200 – 没有错误
  • 404——没有这样的服务
  • 406 - 节点不是群的一部分
  • 500 – 服务器错误

更新服务

POST /services/(id)/update

更新一个服务。当使用此端点使用注册表中的私有存储库创建服务时,X-Registry-Auth标头可用于更新为服务存储的身份验证信息。标头包含一个 base64 编码的 AuthConfig 对象。有关更多详细信息,请参阅 创建图像部分。

请求示例

POST /v1.24/services/1cb4dnqcyx6m66g2t538x3rxha/update?version=23 HTTP/1.1
Content-Type: application/json
Content-Length: 12345

{
  "Name": "top",
  "TaskTemplate": {
    "ContainerSpec": {
      "Image": "busybox",
      "Args": [
        "top"
      ]
    },
    "Resources": {
      "Limits": {},
      "Reservations": {}
    },
    "RestartPolicy": {
      "Condition": "any",
      "MaxAttempts": 0
    },
    "Placement": {}
  },
  "Mode": {
    "Replicated": {
      "Replicas": 1
    }
  },
  "UpdateConfig": {
    "Parallelism": 1
  },
  "EndpointSpec": {
    "Mode": "vip"
  }
}

响应示例

HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8

JSON 参数

  • 名称– 用户定义的服务名称。请注意,不支持重命名服务。
  • 标签– 与服务关联的标签映射(例如{"key":"value", "key2":"value2"})。
  • TaskTemplate – 作为新服务一部分启动的任务规范。
    • ContainerSpec - 容器的容器设置作为此任务的一部分启动。
      • Image – 指定用于容器的图像名称的字符串。
      • 命令– 要在映像中运行的命令。
      • Args – 命令的参数。
      • Env – 格式的环境变量列表["VAR=value"[,"VAR2=value2"]]
      • Dir – 指定运行命令的工作目录的字符串。
      • 用户– 指定容器内用户的字符串值。
      • 标签– 与服务关联的标签映射(例如 {"key":"value", "key2":"value2"})。
      • 安装– 添加到作为新服务一部分创建的容器的安装规范。
        • 目标– 容器路径。
        • – 挂载源(例如卷名称、主机路径)。
        • 类型– 安装类型(bind、 或volume)。
        • ReadOnly – 一个布尔值,指示挂载是否应为只读。
        • BindOptionsbind -类型的可选配置
          • 传播– 值为[r]private[r]shared或 的传播模式[r]slave
        • VolumeOptions – 类型的可选配置volume
          • NoCopy – 一个布尔值,指示是否应使用来自目标的数据填充卷。 (默认假)
          • 标签– 用户定义的卷名称和标签。
          • DriverConfig – 驱动程序特定选项的映射。
            • 名称- 用于创建卷的驱动程序的名称
            • 选项- 驱动程序特定选项的键/值映射
      • StopGracePeriod – 在强制终止容器之前等待容器终止的时间。
    • 资源– 适用于作为服务一部分创建的每个单独容器的资源要求。
      • 限制– 定义资源限制。
        • CPU – CPU 限制
        • 内存– 内存限制
      • 预留– 定义资源预留。
        • CPU ——CPU预留
        • 内存– 内存预留
    • RestartPolicy – 重新启动策略的规范,适用于作为此服务的一部分创建的容器。
      • 条件– 重新启动的条件(noneon-failureany)。
      • 延迟– 重新启动尝试之间的延迟。
      • MaxAttempts – 放弃之前重新启动给定容器的最大尝试次数(默认值为 0,将被忽略)。
      • Window – Windows 是用于评估重启策略的时间窗口(默认值为 0,无界)。
    • 放置– 对服务可以运行的位置的限制。
      • 约束– 一系列约束,例如[ "node.role == manager" ]
  • 模式– 服务的调度模式(replicatedglobal,默认为replicated)。
  • UpdateConfig – 服务更新策略的规范。
    • 并行度– 一次迭代中要更新的最大任务数(0 表示无限并行度)。
    • 延迟– 更新之间的时间量。
  • 网络– 要将服务附加到的网络名称或 ID 的数组。
  • EndpointSpec – 可配置为访问和负载平衡服务的属性。
    • 模式– 用于任务之间内部负载平衡的解析模式(vipdnsrr)。vip如果未提供则默认为。
    • 端口– 可从外部访问此服务的公开端口列表,格式为: {"Protocol": <"tcp"|"udp">, "PublishedPort": <port>, "TargetPort": <port>}。仅当vip使用解析模式时才能提供端口。

查询参数

  • version – 正在更新的服务对象的版本号。这是避免写入冲突所必需的。

请求标头

  • 内容类型– 设置为"application/json".
  • X-Registry-Auth – base64 编码的 AuthConfig 对象,包含登录信息或令牌。 有关更多详细信息,请参阅 创建图像部分。

状态代码

  • 200 – 没有错误
  • 404——没有这样的服务
  • 406 - 节点不是群的一部分
  • 500 – 服务器错误

3.10 任务

注意:任务操作要求引擎是集群的一部分。

列出任务

GET /tasks

列出任务

请求示例

GET /v1.24/tasks HTTP/1.1

响应示例

[
  {
    "ID": "0kzzo1i0y4jz6027t0k7aezc7",
    "Version": {
      "Index": 71
    },
    "CreatedAt": "2016-06-07T21:07:31.171892745Z",
    "UpdatedAt": "2016-06-07T21:07:31.376370513Z",
    "Spec": {
      "ContainerSpec": {
        "Image": "redis"
      },
      "Resources": {
        "Limits": {},
        "Reservations": {}
      },
      "RestartPolicy": {
        "Condition": "any",
        "MaxAttempts": 0
      },
      "Placement": {}
    },
    "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz",
    "Slot": 1,
    "NodeID": "60gvrl6tm78dmak4yl7srz94v",
    "Status": {
      "Timestamp": "2016-06-07T21:07:31.290032978Z",
      "State": "running",
      "Message": "started",
      "ContainerStatus": {
        "ContainerID": "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035",
        "PID": 677
      }
    },
    "DesiredState": "running",
    "NetworksAttachments": [
      {
        "Network": {
          "ID": "4qvuz4ko70xaltuqbt8956gd1",
          "Version": {
            "Index": 18
          },
          "CreatedAt": "2016-06-07T20:31:11.912919752Z",
          "UpdatedAt": "2016-06-07T21:07:29.955277358Z",
          "Spec": {
            "Name": "ingress",
            "Labels": {
              "com.docker.swarm.internal": "true"
            },
            "DriverConfiguration": {},
            "IPAMOptions": {
              "Driver": {},
              "Configs": [
                {
                  "Subnet": "10.255.0.0/16",
                  "Gateway": "10.255.0.1"
                }
              ]
            }
          },
          "DriverState": {
            "Name": "overlay",
            "Options": {
              "com.docker.network.driver.overlay.vxlanid_list": "256"
            }
          },
          "IPAMOptions": {
            "Driver": {
              "Name": "default"
            },
            "Configs": [
              {
                "Subnet": "10.255.0.0/16",
                "Gateway": "10.255.0.1"
              }
            ]
          }
        },
        "Addresses": [
          "10.255.0.10/16"
        ]
      }
    ],
  },
  {
    "ID": "1yljwbmlr8er2waf8orvqpwms",
    "Version": {
      "Index": 30
    },
    "CreatedAt": "2016-06-07T21:07:30.019104782Z",
    "UpdatedAt": "2016-06-07T21:07:30.231958098Z",
    "Name": "hopeful_cori",
    "Spec": {
      "ContainerSpec": {
        "Image": "redis"
      },
      "Resources": {
        "Limits": {},
        "Reservations": {}
      },
      "RestartPolicy": {
        "Condition": "any",
        "MaxAttempts": 0
      },
      "Placement": {}
    },
    "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz",
    "Slot": 1,
    "NodeID": "60gvrl6tm78dmak4yl7srz94v",
    "Status": {
      "Timestamp": "2016-06-07T21:07:30.202183143Z",
      "State": "shutdown",
      "Message": "shutdown",
      "ContainerStatus": {
        "ContainerID": "1cf8d63d18e79668b0004a4be4c6ee58cddfad2dae29506d8781581d0688a213"
      }
    },
    "DesiredState": "shutdown",
    "NetworksAttachments": [
      {
        "Network": {
          "ID": "4qvuz4ko70xaltuqbt8956gd1",
          "Version": {
            "Index": 18
          },
          "CreatedAt": "2016-06-07T20:31:11.912919752Z",
          "UpdatedAt": "2016-06-07T21:07:29.955277358Z",
          "Spec": {
            "Name": "ingress",
            "Labels": {
              "com.docker.swarm.internal": "true"
            },
            "DriverConfiguration": {},
            "IPAMOptions": {
              "Driver": {},
              "Configs": [
                {
                  "Subnet": "10.255.0.0/16",
                  "Gateway": "10.255.0.1"
                }
              ]
            }
          },
          "DriverState": {
            "Name": "overlay",
            "Options": {
              "com.docker.network.driver.overlay.vxlanid_list": "256"
            }
          },
          "IPAMOptions": {
            "Driver": {
              "Name": "default"
            },
            "Configs": [
              {
                "Subnet": "10.255.0.0/16",
                "Gateway": "10.255.0.1"
              }
            ]
          }
        },
        "Addresses": [
          "10.255.0.5/16"
        ]
      }
    ]
  }
]

查询参数

  • 过滤器map[string][]string–要在服务列表上处理的过滤器 (a ) 的 JSON 编码值。可用的过滤器:
    • id=<task id>
    • name=<task name>
    • service=<service name>
    • node=<node id or name>
    • label=key或者label="key=value"
    • desired-state=(running | shutdown | accepted)

状态代码

  • 200 – 没有错误
  • 406 - 节点不是群的一部分
  • 500 – 服务器错误

检查任务

GET /tasks/(id)

获取任务的详细信息id

请求示例

GET /v1.24/tasks/0kzzo1i0y4jz6027t0k7aezc7 HTTP/1.1

响应示例

{
  "ID": "0kzzo1i0y4jz6027t0k7aezc7",
  "Version": {
    "Index": 71
  },
  "CreatedAt": "2016-06-07T21:07:31.171892745Z",
  "UpdatedAt": "2016-06-07T21:07:31.376370513Z",
  "Spec": {
    "ContainerSpec": {
      "Image": "redis"
    },
    "Resources": {
      "Limits": {},
      "Reservations": {}
    },
    "RestartPolicy": {
      "Condition": "any",
      "MaxAttempts": 0
    },
    "Placement": {}
  },
  "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz",
  "Slot": 1,
  "NodeID": "60gvrl6tm78dmak4yl7srz94v",
  "Status": {
    "Timestamp": "2016-06-07T21:07:31.290032978Z",
    "State": "running",
    "Message": "started",
    "ContainerStatus": {
      "ContainerID": "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035",
      "PID": 677
    }
  },
  "DesiredState": "running",
  "NetworksAttachments": [
    {
      "Network": {
        "ID": "4qvuz4ko70xaltuqbt8956gd1",
        "Version": {
          "Index": 18
        },
        "CreatedAt": "2016-06-07T20:31:11.912919752Z",
        "UpdatedAt": "2016-06-07T21:07:29.955277358Z",
        "Spec": {
          "Name": "ingress",
          "Labels": {
            "com.docker.swarm.internal": "true"
          },
          "DriverConfiguration": {},
          "IPAMOptions": {
            "Driver": {},
            "Configs": [
              {
                "Subnet": "10.255.0.0/16",
                "Gateway": "10.255.0.1"
              }
            ]
          }
        },
        "DriverState": {
          "Name": "overlay",
          "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "256"
          }
        },
        "IPAMOptions": {
          "Driver": {
            "Name": "default"
          },
          "Configs": [
            {
              "Subnet": "10.255.0.0/16",
              "Gateway": "10.255.0.1"
            }
          ]
        }
      },
      "Addresses": [
        "10.255.0.10/16"
      ]
    }
  ]
}

状态代码

  • 200 – 没有错误
  • 404 – 未知任务
  • 406 - 节点不是群的一部分
  • 500 – 服务器错误

4. 更进一步

4.1 内部docker运行

例如,docker run命令行进行以下 API 调用:

  • 创建容器

  • 如果状态码是404,则表示该镜像不存在:

    • 尝试拉它。
    • 然后,重试创建容器。
  • 启动容器。

  • 如果您未处于分离模式:

  • 附加到容器,使用logs=1(从容器的开始)stdoutstderrstream=1

  • 如果处于分离模式或仅stdin附加模式,则显示容器的 ID。

4.2 劫持

在此版本的 API 中, 、 使用劫持在同一套接字上/attach传输stdinstdout、 和。stderr

为了提示潜在代理有关连接劫持的信息,Docker 客户端会发送与 Websocket 类似的连接升级标头。

Upgrade: tcp
Connection: Upgrade

当 Docker 守护进程检测到Upgrade标头时,它将其状态代码从200 OK切换到101 UPGRADED并重新发送相同的标头。

4.3 CORS 请求

--api-cors-header要设置对引擎 API 的跨源请求,请在守护进程模式下运行 Docker 时指定值 。设置 *(星号)允许全部,默认或空白表示 CORS 禁用

$ dockerd -H="192.168.1.9:2375" --api-cors-header="http://foo.bar"