引擎API v1.24

1. 简介

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

2. 错误

Engine 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 个容器,包括非运行中的容器。
  • since – 仅显示自Id以来创建的容器,包括非运行的容器。
  • before – 仅显示在Id之前创建的容器,包括非运行的容器。
  • size – 1/True/true 或 0/False/false, 显示容器的尺寸
  • filters - 一个JSON编码的过滤器值(一个map[string][]string),用于处理容器列表。可用的过滤器:
  • exited=; -- 退出代码为 的容器;
  • status=(created|restarting|running|paused|exited|dead)
  • label=keylabel="key=value" 容器的标签
  • isolation=(default|process|hyperv) (仅适用于Windows守护进程)
  • ancestor=([:], )
  • before=(<容器ID><容器名称>)
  • since=(<容器ID><容器名称>)
  • volume=(<卷名称><挂载点目标>)
  • network=(<网络ID><网络名称>)

状态码:

  • 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主机名。
  • Domainname - 一个字符串值,包含用于容器的域名。
  • 用户 - 一个字符串值,用于指定容器内的用户。
  • AttachStdin - 布尔值,附加到 stdin
  • AttachStdout - 布尔值,附加到 stdout
  • AttachStderr - 布尔值,附加到 stderr
  • Tty - 布尔值,将标准流附加到tty,包括未关闭的stdin
  • OpenStdin - 布尔值,打开 stdin,
  • StdinOnce - 布尔值,在1个连接的客户端断开后关闭 stdin
  • 环境变量 - 一个环境变量列表,格式为 ["VAR=value", ...]
  • 标签 - 向容器添加标签映射。要指定映射:{"key":"value", ... }
  • Cmd - 以字符串或字符串数组形式指定的要运行的命令。
  • 入口点 - 将容器的入口点设置为字符串或字符串数组。
  • Image - 一个字符串,指定用于容器的镜像名称。
  • - 一个对象,将容器内的挂载点路径(字符串)映射到空对象。
  • 健康检查 - 用于检查容器是否健康的测试。
    • **Test** - 要执行的测试。可能的值为:
          + `{}` 从镜像或父镜像继承健康检查
          + `{"NONE"}` 禁用健康检查
          + `{"CMD", args...}` 直接执行参数
          + `{"CMD-SHELL", command}` 使用系统的默认 shell 运行命令
      
    • **Interval** - 检查之间的等待时间,以纳秒为单位。应为 0 或至少 1000000(1 毫秒)。0 表示继承。
      
    • **Timeout** - 在认为检查挂起之前等待的时间,以纳秒为单位。应为 0 或至少 1000000(1 毫秒)。0 表示继承。
      
    • **Retries** - 将容器视为不健康所需的连续失败次数。0 表示继承。
      
    • **StartPeriod** - 在开始健康重试倒计时之前等待容器初始化的时间,以纳秒为单位。应为 0 或至少 1000000(1 毫秒)。0 表示继承。
      
  • WorkingDir - 一个字符串,指定命令运行的工作目录。
  • NetworkDisabled - 布尔值,当为true时,禁用容器的网络功能
  • ExposedPorts - 一个将端口映射到空对象的对象,形式如下: "ExposedPorts": { "/: {}" }
  • StopSignal - 用于停止容器的信号,可以是字符串或无符号整数。默认为SIGTERM
  • HostConfig
    • 绑定 – 此容器的卷绑定列表。每个卷绑定是以下形式之一的字符串:

      • host-src:container-dest to bind-mount a host path into the container. Both host-src, and container-dest must be an absolute path.
      • host-src:container-dest:ro to make the bind mount read-only inside the container. Both host-src, and container-dest must be an absolute path.
      • volume-name:container-dest to bind-mount a volume managed by a volume driver into the container. container-dest must be an absolute path.
      • volume-name:container-dest:ro to mount the volume read-only inside the container. container-dest must be an absolute path.
    • 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 - 允许执行的内存节点(MEMs)(0-3, 0,1)。仅在NUMA系统上有效。

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

    • 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:": 加入另一个容器的PID命名空间 "host": 在容器内使用主机的PID命名空间

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

    • PortBindings - 暴露的容器端口和它们应映射到的主机端口的映射。一个JSON对象,形式为 { /: [{ "HostPort": "" }] } 请注意,port被指定为字符串而不是整数值。

    • PublishAllPorts - 为容器的所有暴露端口分配一个临时的主机端口。指定为布尔值。

      端口在容器停止时会被释放,在容器启动时会被分配。重新启动容器时,分配的端口可能会发生变化。

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

    • 特权 - 使容器完全访问主机。指定为布尔值。

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

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

    • DnsOptions - DNS选项列表

    • DnsSearch - DNS搜索域列表

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

    • VolumesFrom - 从另一个容器继承的卷列表。 以[:]的形式指定

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

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

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

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

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

    • NetworkMode - 设置容器的网络模式。支持的标准值有:bridge, host, none, 和 container:。任何其他值将被视为该容器应连接到的自定义网络的名称。

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

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

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

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

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

    • LogConfig - 容器的日志配置,以JSON对象的形式指定,格式为 { "Type": "", "Config": {"key1": "val1"}}. 可用类型:json-file, syslog, journald, gelf, fluentd, awslogs, splunk, etwlogs, none. json-file 日志驱动。

    • CgroupParent - 容器cgroup创建的cgroups路径。如果路径不是绝对路径,则路径被认为是相对于初始化进程的cgroups路径。如果cgroups不存在,则会创建它们。

    • 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_args – 使用的 ps 参数(例如,aux),默认为 -ef

状态码:

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

获取容器日志

GET /containers/(id or name)/logs

从容器 id 获取 stdoutstderr 日志

注意: 此端点仅适用于使用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 %}

查询参数:

  • details - 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(未过滤)
  • timestamps – 1/True/true 或 0/False/false,为每条日志行打印时间戳。默认 false
  • tail – 输出日志末尾的指定行数:all。默认为全部。

状态码:

  • 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字段的精确副本。

查询参数:

  • stream – 1/True/true 或 0/False/false,拉取一次统计信息然后断开连接。默认 true

状态码:

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

调整容器TTY大小

POST /containers/(id or name)/resize

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

示例请求:

  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-,其中 是以下之一: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

将容器的id重命名为new_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-,其中 是以下之一:a-z, @, ^, [, ,_
  • logs – 1/True/true 或 0/False/false,返回日志。默认 false
  • stream – 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,如果 logs=true,返回 stdout 日志,如果 stream=true,附加到 stdout。默认 false
  • stderr – 1/True/true 或 0/False/false,如果 logs=true,返回 stderr 日志,如果 stream=true,附加到 stderr。默认 false

状态码:

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

流详情:

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

格式是一个Header和一个Payload(帧)。

标题

头部包含流写入的信息(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

通过websocket连接到容器的id

根据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-,其中 是以下之一:a-z, @, ^, [, ,_
  • logs – 1/True/true 或 0/False/false,返回日志。默认 false
  • stream – 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
  • force - 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

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

查询参数:

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

    如果不是绝对路径,则相对于容器的根目录。 由path指定的资源必须存在。要断言资源 预期是一个目录,path应以//.结尾 (假设路径分隔符为/)。如果path/.结尾,则表示 只应复制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响应体中,可能是以下之一:
    • 必须指定路径参数(path 不能为空)
    • 不是目录(path 被断言为目录但实际存在为文件)
  • 404 - 客户端错误,资源未找到,可能是以下原因之一: – 没有这样的容器(容器 id 不存在)
    • 没有这样的文件或目录(path 不存在)
  • 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响应体中,可能是以下之一:
    • 必须指定路径参数(path 不能为空)
    • 不是目录(path 应该是一个目录,但存在为文件)
    • 无法用非目录覆盖现有目录 (如果 noOverwriteDirNonDir
    • 无法用目录覆盖现有非目录 (如果 noOverwriteDirNonDir
  • 403 - 客户端错误,权限被拒绝,卷或容器根文件系统被标记为只读。
  • 404 - 客户端错误,资源未找到,可能是以下原因之一: – 没有这样的容器(容器 id 不存在)
    • 没有这样的文件或目录(path 资源不存在)
  • 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": {}
  }
]

响应显示了一个与两个仓库(RepoTags)关联的单个图像Idlocalhost:5000/test/busyboxplaydate。调用者可以使用RepoTags值中的任何一个localhost:5000/test/busybox:latestplaydate:latest来引用该图像。

你也可以使用RepoDigests值来引用一个镜像。在这个响应中, 数组只有一个引用,那就是指向 localhost:5000/test/busybox仓库;playdate仓库没有 摘要。你可以使用这个值来引用这个摘要: localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...

请参阅docker rundocker build命令,了解命令行上的摘要和标签引用示例。

查询参数:

  • all – 1/True/true 或 0/False/false,默认为 false
  • filters – 一个JSON编码的过滤器值(一个map[string][]string),用于处理图像列表。可用的过滤器:
  • dangling=true
  • label=keylabel="key=value" 图像标签的
  • before=([:], )
  • since=([:], )
  • filter - 仅返回具有指定名称的图像

从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参数。
  • remote – 一个Git仓库的URI或HTTP/HTTPS上下文URI。如果URI指向一个单独的文本文件,文件的内容将被放入一个名为Dockerfile的文件中,并且镜像将从该文件构建。如果URI指向一个压缩包,文件将被守护进程下载,并且其中的内容将用作构建的上下文。如果URI指向一个压缩包并且还指定了dockerfile参数,压缩包内必须有一个具有相应路径的文件。
  • q – 抑制冗长的构建输出。
  • nocache – 在构建镜像时不使用缓存。
  • pull - 尝试拉取镜像,即使本地存在较旧的镜像。
  • rm - 在成功构建后移除中间容器(默认行为)。
  • forcerm - 始终移除中间容器(包括 rm)。
  • memory - 设置构建的内存限制。
  • memswap - 总内存(内存 + 交换空间),-1 表示启用无限制的交换空间。
  • cpushares - CPU份额(相对权重)。
  • cpusetcpus - 允许执行的CPU(例如,0-3, 0,1)。
  • cpuperiod - CPU周期的长度,以微秒为单位。
  • cpuquota - 容器在一个CPU周期内可以获得的CPU时间微秒数。
  • buildargs – 用于构建时变量的字符串对的JSON映射。用户在构建时传递这些值。Docker使用buildargs作为通过Dockerfile的RUN指令运行的命令的环境上下文,或用于其他Dockerfile指令中的变量扩展。这不适用于传递秘密值。 阅读更多关于buildargs指令的信息
  • shmsize - /dev/shm 的大小,以字节为单位。大小必须大于0。如果省略,系统将使用64MB。
  • labels – 用于设置在图像上的标签的字符串对的JSON映射。

请求头:

  • Content-type – 设置为 "application/x-tar"

  • X-Registry-Config – 一个经过base64-url-safe编码的Registry Auth Config 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对象,包含登录信息或令牌

    • 基于凭证的登录:

    { "username": "jdoe", "password": "secret", "email": "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对象,包含登录信息或令牌

    • 基于凭证的登录:

    { "username": "jdoe", "password": "secret", "email": "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"}
]

查询参数:

  • force – 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=
  • 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 the docker server

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 - 容器的配置

查询参数:

  • container – 源容器
  • repo – 仓库
  • tag – 标签
  • comment – 提交信息
  • author – 作者 (例如, "John Hannibal Smith < hannibal@a-team.com>")
  • pause – 1/True/true 或 0/False/false,是否在提交前暂停容器
  • changes – 在提交时应用的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
}

查询参数:

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

状态码:

  • 200 – 无错误
  • 400 - 错误的参数
  • 500 – 服务器错误

获取包含仓库中所有镜像的tarball

GET /images/(name)/get

获取一个包含由name指定的仓库的所有图像和元数据的tarball。

如果 name 是一个特定的名称和标签(例如 ubuntu:latest),那么只返回该镜像(及其父镜像)。如果 name 是一个镜像 ID,同样只返回该镜像(及其父镜像),但在 tarball 中排除了 'repositories' 文件,因为没有引用镜像名称。

查看 image tarball format 以获取更多详细信息。

示例请求

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的'repositories'文件中不会有任何名称引用。

查看 image tarball format 以获取更多详细信息。

示例请求

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仓库中。 有关更多详细信息,请参阅 镜像压缩包格式

示例请求

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 – 服务器错误

镜像压缩包格式

一个镜像压缩包包含每个镜像层的一个目录(使用其长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"}
}

Exec Create

POST /containers/(id or name)/exec

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

示例请求:

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

状态码:

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

执行开始

POST /exec/(id)/start

启动先前设置的exec实例id。如果detach为真,此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 - 布尔值,用于分配一个伪终端。

状态码:

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

流详情:

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

Exec Resize

POST /exec/(id)/resize

调整由exec命令id使用的tty会话的大小。单位是字符数。 此API仅在创建和启动exec命令时指定了tty的情况下有效。

示例请求:

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": []
}

查询参数:

  • filters - 过滤器的JSON编码值(一个map[string][]string),用于处理卷列表。可用的过滤器:
    • name= 匹配卷名称的全部或部分。
    • dangling= 当设置为true(或1)时,返回所有“悬挂”的卷(未被容器使用)。当设置为false(或0)时,仅返回被一个或多个容器使用的卷。
    • driver= 匹配卷驱动名称的全部或部分。

状态码:

  • 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 会生成一个名称。
  • Driver - 使用的卷驱动程序的名称。默认为 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响应中返回。空字段或卷驱动程序不支持的字段可能在响应中被省略。

  • 名称 - 卷的名称。
  • Driver - 卷所使用的卷驱动程序的名称。
  • 挂载点 - 卷在主机上的挂载路径。
  • 状态 - 关于卷的低级详细信息,由卷驱动程序提供。 详细信息以键/值对的形式返回:{"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": {}
  }
]

查询参数:

  • filters - JSON 编码的网络列表过滤器。过滤器的值为以下之一:
    • driver= 匹配网络的驱动程序。
    • id= 匹配网络ID的全部或部分。
    • label=label== 匹配网络标签。
    • 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旨在提供对具有相同名称的任何网络的最佳努力检查, 但不能保证捕获所有名称冲突。
  • Driver - 使用的网络驱动插件的名称。默认为 bridge 驱动
  • 内部 - 限制外部访问网络
  • IPAM - 可选的网络自定义IP方案
    • Driver - 使用的IPAM驱动程序的名称。默认为default驱动程序
    • Config - IPAM配置选项列表,指定为映射: {"Subnet": , "IPRange": , "Gateway": , "AuxAddress": }
    • Options - 驱动程序特定的选项,指定为映射:{"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 参数:

  • container - 要连接到网络的容器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/名称
  • Force - 强制容器从网络断开连接

移除网络

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://docs.docker.com/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=

拉取并安装一个插件。插件安装后,可以使用 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://docs.docker.com/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""
    }
  }
]

查询参数:

  • filters – 一个JSON编码的过滤器值(一个map[string][]string),用于处理节点列表。可用的过滤器有:
    • id=<节点ID>
    • label=<引擎标签>
    • membership=(accepted|pending)`
    • 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

查询参数:

  • force - 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"})。
  • Role - 节点的角色 (worker|manager)。
  • 可用性 - 节点的可用性(active|pause|drain)。

状态码:

  • 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。如果省略端口号,则使用默认的swarm监听端口。
  • AdvertiseAddr – 向其他节点通告的外部可访问地址。这可以是192.168.1.1:4567形式的地址/端口组合,或者是接口后跟端口号,如eth0:4567。如果省略端口号,则使用监听地址的端口号。如果未指定AdvertiseAddr,则在可能的情况下会自动检测。
  • ForceNewCluster – 强制创建一个新的集群。
  • Spec – 新集群的配置设置。
    • Orchestration – 集群编排方面的配置设置。
      • TaskHistoryRetentionLimit – 存储的任务历史的最大数量。
    • Raft – Raft相关的配置。
      • SnapshotInterval – 快照之间的日志条目数。
      • KeepOldSnapshots – 在当前快照之外保留的快照数量。
      • LogEntriesForSlowFollowers – 在创建快照后保留的日志条目数,以便同步慢速跟随者。
      • HeartbeatTick – 每次心跳之间的滴答数(以秒为单位)。
      • ElectionTick – 在没有领导者的情况下触发新选举所需的滴答数(以秒为单位)。
    • Dispatcher – 任务调度器的配置设置。
      • HeartbeatPeriod – 代理向调度器发送心跳的延迟。
    • CAConfig – 证书颁发机构配置。
      • NodeCertExpiry – 节点证书的自动过期时间。
      • ExternalCA - 将签名请求转发到外部证书颁发机构的配置。
        • Protocol - 与外部CA通信的协议(目前仅支持"cfssl")。
        • URL - 证书签名请求应发送到的URL。
        • Options - 一个包含键/值对的对象,这些键/值对被解释为外部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 – 已经参与swarm的任何管理节点的地址。
  • 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

查询参数:

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

状态码:

  • 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 参数:

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

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"
        }
      ]
    }
  }
]

查询参数:

  • filters – 一个JSON编码的过滤器值(一个map[string][]string),用于处理服务列表。可用的过滤器有:
    • id=
    • label=
    • 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 – 指定容器使用的镜像名称的字符串。
      • Command – 在镜像中运行的命令。
      • Args – 命令的参数。
      • Env – 环境变量列表,格式为 ["VAR=value"[,"VAR2=value2"]]
      • Dir – 指定命令运行的工作目录的字符串。
      • User – 指定容器内用户的字符串值。
      • Labels – 与服务关联的标签映射(例如, {"key":"value", "key2":"value2"})。
      • Mounts – 作为服务一部分创建的容器要添加的挂载规范。
        • Target – 容器路径。
        • Source – 挂载源(例如卷名、主机路径)。
        • Type – 挂载类型(bindvolume)。
        • ReadOnly – 指示挂载是否为只读的布尔值。
        • BindOptions - bind 类型的可选配置。
          • Propagation – 传播模式,值为 [r]private[r]shared[r]slave
        • VolumeOptionsvolume 类型的可选配置。
          • NoCopy – 指示是否应从目标填充卷数据的布尔值。(默认值为 false)
          • Labels – 用户定义的卷名称和标签。
          • DriverConfig – 驱动程序特定选项的映射。
            • Name - 用于创建卷的驱动程序的名称。
            • Options - 驱动程序特定选项的键/值映射。
      • StopGracePeriod – 在强制终止容器之前等待容器终止的时间量。
    • LogDriver - 作为服务一部分创建的容器的日志配置。
      • Name - 要使用的日志记录驱动程序的名称(json-filesyslogjournaldgelffluentdawslogssplunketwlogsnone)。
      • Options - 驱动程序特定选项。
    • Resources – 适用于作为服务一部分创建的每个单独容器的资源需求。
      • Limits – 定义资源限制。
        • NanoCPUs – CPU 限制,单位为 10-9 CPU 份额。
        • MemoryBytes – 内存限制,单位为字节。
      • Reservation – 定义资源预留。
        • NanoCPUs – CPU 预留,单位为 10-9 CPU 份额。
        • MemoryBytes – 内存预留,单位为字节。
    • RestartPolicy – 适用于作为此服务一部分创建的容器的重启策略规范。
      • Condition – 重启条件(noneon-failureany)。
      • Delay – 重启尝试之间的延迟。
      • MaxAttempts – 在放弃之前重启给定容器的最大尝试次数(默认值为 0,表示忽略)。
      • Window – 用于评估重启策略的时间窗口(默认值为 0,表示无限制)。
    • Placement – 服务可以运行的位置限制。
      • Constraints – 约束数组,例如 [ "node.role == manager" ]
  • 模式 – 服务的调度模式(replicatedglobal,默认为 replicated)。
  • UpdateConfig – 服务更新策略的规范。
    • Parallelism – 一次迭代中要更新的最大任务数(0 表示无限制并行)。
    • Delay – 更新之间的时间间隔。
    • FailureAction - 如果更新任务无法运行或在更新期间停止运行,则采取的操作。值为 continuepause
  • 网络 – 要附加服务的网络名称或ID的数组。
  • EndpointSpec – 可以配置以访问和负载均衡服务的属性。
    • Mode – 用于任务之间内部负载均衡的解析模式(vipdnsrr)。如果未提供,则默认为 vip
    • Ports – 此服务可从外部访问的暴露端口列表,形式为: {"Protocol": <"tcp"|"udp">, "PublishedPort": , "TargetPort": }。 只有在使用 vip 解析模式时才能提供端口。

请求头:

  • Content-type – 设置为 "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 – 指定容器使用的镜像名称的字符串。
      • Command – 在镜像中运行的命令。
      • Args – 命令的参数。
      • Env – 环境变量列表,格式为 ["VAR=value"[,"VAR2=value2"]]
      • Dir – 指定命令运行的工作目录的字符串。
      • User – 指定容器内用户的字符串值。
      • Labels – 与服务关联的标签映射(例如,{"key":"value", "key2":"value2"})。
      • Mounts – 作为新服务的一部分创建的容器要添加的挂载规范。
        • Target – 容器路径。
        • Source – 挂载源(例如,卷名称,主机路径)。
        • Type – 挂载类型(bindvolume)。
        • ReadOnly – 指示挂载是否为只读的布尔值。
        • BindOptions - bind 类型的可选配置
          • Propagation – 传播模式,值为 [r]private[r]shared[r]slave
        • VolumeOptionsvolume 类型的可选配置。
          • NoCopy – 指示是否应从目标填充卷数据的布尔值。(默认值为 false)
          • Labels – 用户定义的卷名称和标签。
          • DriverConfig – 驱动程序特定选项的映射。
            • Name - 用于创建卷的驱动程序的名称
            • Options - 驱动程序特定选项的键/值映射
      • StopGracePeriod – 在强制终止容器之前等待容器终止的时间量。
    • Resources – 适用于作为服务的一部分创建的每个单独容器的资源需求。
      • Limits – 定义资源限制。
        • CPU – CPU 限制
        • Memory – 内存限制
      • Reservation – 定义资源预留。
        • CPU – CPU 预留
        • Memory – 内存预留
    • RestartPolicy – 适用于作为此服务的一部分创建的容器的重启策略规范。
      • Condition – 重启条件(noneon-failureany)。
      • Delay – 重启尝试之间的延迟。
      • MaxAttempts – 在放弃之前重启给定容器的最大尝试次数(默认值为 0,表示忽略)。
      • Window – 用于评估重启策略的时间窗口(默认值为 0,表示无限制)。
    • Placement – 服务可以运行的位置限制。
      • Constraints – 约束数组,例如 [ "node.role == manager" ]
  • 模式 – 服务的调度模式(replicatedglobal,默认为 replicated)。
  • UpdateConfig – 服务更新策略的规范。
    • Parallelism – 一次迭代中要更新的最大任务数(0 表示无限制并行)。
    • Delay – 更新之间的时间间隔。
  • 网络 – 要附加服务的网络名称或ID的数组。
  • EndpointSpec – 可以配置以访问和负载均衡服务的属性。
    • Mode – 用于任务之间内部负载均衡的解析模式(vipdnsrr)。如果未提供,则默认为 vip
    • Ports – 此服务可从外部访问的暴露端口列表,形式为: {"Protocol": <"tcp"|"udp">, "PublishedPort": , "TargetPort": }。 只有在使用 vip 解析模式时才能提供端口。

查询参数:

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

请求头:

  • Content-type – 设置为 "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"
        ]
      }
    ]
  }
]

查询参数:

  • filters – 一个JSON编码的过滤器值(一个map[string][]string),用于处理服务列表。可用的过滤器有:
    • id=<任务id>
    • name=<任务名称>
    • service=<服务名称>
    • node=<节点id或名称>
    • label=keylabel="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 run 内部

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

  • 创建容器

  • 如果状态码是404,意味着图片不存在:

    • Try to pull it.
    • Then, retry to create the container.
  • 启动容器。

  • 如果您不在分离模式下:

  • 附加到容器,使用 logs=1(以获取容器启动时的 stdoutstderr)和 stream=1

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

4.2 劫持

在这个版本的API中,/attach使用劫持技术在同一套接字上传输stdinstdoutstderr

为了提示潜在的代理关于连接劫持的情况,Docker 客户端发送类似于 websocket 的连接升级头。

Upgrade: tcp
Connection: Upgrade

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

4.3 CORS 请求

要为Engine API设置跨源请求,请在以守护进程模式运行Docker时,为--api-cors-header提供值。设置为*(星号)允许所有请求,默认或空白表示禁用CORS。

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