引擎API v1.24

预计阅读时间:99分钟

1.简介

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

2.错误

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

{
    "message": "page not found"
}

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

3.端点

3.1容器

列出容器

GET /containers/json

列出容器

请求示例

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

响应示例

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

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

查询参数

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

状态码

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

创建一个容器

POST /containers/create

创建一个容器

请求示例

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

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

响应示例

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

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

JSON参数

  • 主机名-一个字符串值,其中包含要用于容器的主机名。这必须是有效的RFC 1123主机名。
  • 域名-一个字符串值,其中包含要用于容器的域名。
  • 用户-一个字符串值,用于指定容器内的用户。
  • AttachStdin-布尔值,附加到stdin
  • AttachStdout-布尔值,附加到stdout
  • AttachStderr-布尔值,附加到stderr
  • Tty-布尔值,将标准流附加到tty,包括stdin是否未关闭。
  • OpenStdin-布尔值,打开stdin
  • StdinOnce-布尔值,stdin在连接的1个客户端断开连接后关闭。
  • Env-以下形式的环境变量列表["VAR=value", ...]
  • 标签-将标签图添加到容器中。要指定地图:{"key":"value", ... }
  • Cmd-要运行的命令,指定为字符串或字符串数​​组。
  • 入口点-设置用于容器为字符串或字符串数组的入口点。
  • 图像-一个字符串,指定要用于容器的图像名称。
  • -将容器内的安装点路径(字符串)映射到空对象的对象。
  • Healthcheck-检查容器是否健康的测试。
    • 测试-要执行的测试。可能的值包括:+{}从映像或父映像继承运行状况检查+{"NONE"}禁用运行状况检查+{"CMD", args...}直接执行参数+{"CMD-SHELL", command}使用系统默认外壳程序运行命令
    • 间隔-两次检查之间等待的时间(以纳秒为单位)。它应该为0或至少1000000(1 ms)。0表示继承。
    • 超时-考虑挂起支票之前要等待的时间。它应该为0或至少1000000(1 ms)。0表示继承。
    • 重试-认为容器不健康所需的连续失败次数。0表示继承。
    • StartPeriod-开始运行状况重试倒计时之前等待容器初始化的时间(以纳秒为单位)。它应该为0或至少1000000(1 ms)。0表示继承。
  • WorkingDir-一个字符串,用于指定要在其中运行命令的工作目录。
  • NetworkDisabled-布尔值,如果为true,则禁用容器的联网
  • ExposedPorts-以以下形式将端口映射到空对象的对象: "ExposedPorts": { "<port>/<tcp|udp>: {}" }
  • StopSignal-信号以字符串或无符号整数形式停止容器。SIGTERM默认。
  • 主机配置
    • 绑定–此容器的卷绑定列表。每个卷绑定都是以下形式之一的字符串:
      • host-src:container-dest将主机路径绑定安装到容器中。两者host-src,并且container-dest必须是 绝对路径。
      • host-src:container-dest:ro使绑定安装在容器内为只读。两者host-src,并且container-dest必须是绝对路径。
      • volume-name:container-dest将由卷驱动程序管理的卷绑定安装到容器中。container-dest必须是 绝对路径。
      • volume-name:container-dest:ro将卷以只读方式安装在容器内。 container-dest必须是绝对路径。
    • Tmpfs –容器目录的映射,应由tmpfs挂载及其相应的挂载选项代替。形式的JSON对象{ "/run": "rw,noexec,nosuid,size=65536k" }
    • 链接-容器的链接列表。每个链接条目应采用的形式container_name:alias
    • 内存-内存限制(以字节为单位)。
    • MemorySwap-总内存限制(内存+交换);设置-1为启用无限交换。您必须使用memory,并使交换值大于memory
    • MemoryReservation-内存软限制,以字节为单位。
    • KernelMemory-内核内存限制(以字节为单位)。
    • CpuPercent-一个整数值,包含可用CPU的可用百分比。(仅适用于Windows守护程序)
    • CpuShares-包含容器的CPU份额的整数值(即相对于其他容器的相对重量)。
    • CpuPeriod -CPU周期的长度(以微秒为单位)。
    • CpuQuota-容器在CPU周期内可以获得的CPU时间的微秒
    • CpusetCpus-包含cgroups CpusetCpus要使用的字符串值。
    • CpusetMems-允许执行(0-3,0,1)的内存节点(MEM)。仅在NUMA系统上有效。
    • IOMaximumBandwidth-以IOps表示的最大IO绝对速率。
    • IOMaximumIOps-最大IO绝对速率,以每秒字节数为单位。
    • BlkioWeight-块IO权重(相对权重)接受介于10和1000之间的权重值。
    • BlkioWeightDevice-块IO权重(相对设备权重),形式为: "BlkioWeightDevice": [{"Path": "device_path", "Weight": weight}]
    • BlkioDeviceReadBps-以以下形式限制从设备读取的速率(每秒字节数) "BlkioDeviceReadBps": [{"Path": "device_path", "Rate": rate}],例如: "BlkioDeviceReadBps": [{"Path": "/dev/sda", "Rate": "1024"}]"
    • BlkioDeviceWriteBps-以以下形式限制对设备的写入速率(每秒字节数) "BlkioDeviceWriteBps": [{"Path": "device_path", "Rate": rate}],例如: "BlkioDeviceWriteBps": [{"Path": "/dev/sda", "Rate": "1024"}]"
    • BlkioDeviceReadIOps-以以下形式限制从设备读取的速率(每秒的IO): "BlkioDeviceReadIOps": [{"Path": "device_path", "Rate": rate}]例如: "BlkioDeviceReadIOps": [{"Path": "/dev/sda", "Rate": "1000"}]
    • BlkioDeviceWriteIOps-以以下形式限制对设备的写入速率(每秒的IO): "BlkioDeviceWriteIOps": [{"Path": "device_path", "Rate": rate}]例如: "BlkioDeviceWriteIOps": [{"Path": "/dev/sda", "Rate": "1000"}]
    • MemorySwappiness-调整容器的内存交换行为。接受0到100之间的整数。
    • OomKillDisable-布尔值,是否为容器禁用OOM Killer。
    • OomScoreAdj-一个整数值,包含为调整OOM杀手首选项而赋予容器的分数。
    • PidMode-设置容器的PID(进程)命名空间模式; "container:<name|id>":加入另一个容器的PID名称空间 "host":在容器内使用主机的PID名称空间
    • PidsLimit-调整容器的pids限制。设置-1为无限。
    • PortBindings-裸露的容器端口及其应映射到的主机端口的映射。{ <port>/<protocol>: [{ "HostPort": "<port>" }] } 请注意,形式为JSON的JSON对象 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-要从另一个容器继承的卷的列表。指定形式<container name>[:<ro|rw>]
    • CapAdd-要添加到容器的内核功能列表。
    • Capdrop-从容器中删除的内核功能列表。
    • GroupAdd-容器进程将作为其运行的其他组的列表
    • RestartPolicy –容器退出时要应用的行为。该值是具有以下Name属性的对象:"always"始终重新启动,始终重新"unless-stopped"启动(除非用户手动停止了容器,否则"on-failure"仅当容器退出代码为非零时才重新启动)。如果on-failure使用,则MaximumRetryCount 控制放弃前重试的次数。默认为不重新启动。(可选)在每次重新启动之前添加一个不断增加的延迟(从100mS开始,是以前的延迟的两倍),以防止服务器泛滥。
    • UsernsMode- 启用用户名空间重新映射选项时,设置容器的用户名空间模式。支持的值为:host
    • NetworkMode-设置容器的联网模式。支持的标准值是:bridgehostnone,和container:<name|id>。任何其他值都将用作此容器应连接到的自定义网络的名称。
    • 设备-要添加到以JSON对象形式指定的容器中的设备列表 { "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}
    • Ulimits-在容器中设置的ulimit列表,指定为 { "Name": <name>, "Soft": <soft limit>, "Hard": <hard limit> },例如: Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }
    • Sysctls-容器中要设置的内核参数(sysctls)的列表,指定为 { <name>: <Value> },例如: { "net.ipv4.ip_forward": "1" }
    • SecurityOpt:字符串值列表,用于自定义MLS系统(例如SELinux)的标签。
    • StorageOpt:每个容器的存储驱动程序选项。选项可以以表格形式传递 {"size":"120G"}
    • LogConfig-容器的日志配置,以JSON对象形式指定 { "Type": "<driver_name>", "Config": {"key1": "val1"}}。可用类型:json-filesyslogjournaldgelffluentdawslogssplunketwlogsnonejson-file日志记录驱动程序。
    • CgroupParent-cgroups在其下cgroup创建容器的路径。如果该路径不是绝对路径,则认为该路径是相对于cgroupsinit进程的路径而言的。如果Cgroup不存在,则会创建它们。
    • VolumeDriver-该容器用户用来安装卷的驱动程序。
    • ShmSize-/dev/shm以字节为单位的大小。大小必须大于0。如果省略,则系统使用64MB。

查询参数

  • 名称–将指定的名称分配给容器。必须匹配/?[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": "devicemapper",
	"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,
		"LxcConf": [],
		"Memory": 0,
		"MemorySwap": 0,
		"MemoryReservation": 0,
		"KernelMemory": 0,
		"OomKillDisable": false,
		"OomScoreAdj": 500,
		"NetworkMode": "bridge",
		"PidMode": "",
		"PortBindings": {},
		"Privileged": false,
		"ReadonlyRootfs": false,
		"PublishAllPorts": false,
		"RestartPolicy": {
			"MaximumRetryCount": 2,
			"Name": "on-failure"
		},
		"LogConfig": {
			"Config": null,
			"Type": "json-file"
		},
		"SecurityOpt": null,
		"Sysctls": {
		        "net.ipv4.ip_forward": "1"
		},
		"StorageOpt": null,
		"VolumesFrom": null,
		"Ulimits": [{}],
		"VolumeDriver": "",
		"ShmSize": 67108864
	},
	"HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname",
	"HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts",
	"LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log",
	"Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39",
	"Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2",
	"MountLabel": "",
	"Name": "/boring_euclid",
	"NetworkSettings": {
		"Bridge": "",
		"SandboxID": "",
		"HairpinMode": false,
		"LinkLocalIPv6Address": "",
		"LinkLocalIPv6PrefixLen": 0,
		"Ports": null,
		"SandboxKey": "",
		"SecondaryIPAddresses": null,
		"SecondaryIPv6Addresses": null,
		"EndpointID": "",
		"Gateway": "",
		"GlobalIPv6Address": "",
		"GlobalIPv6PrefixLen": 0,
		"IPAddress": "",
		"IPPrefixLen": 0,
		"IPv6Gateway": "",
		"MacAddress": "",
		"Networks": {
			"bridge": {
				"NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
				"EndpointID": "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d",
				"Gateway": "172.17.0.1",
				"IPAddress": "172.17.0.2",
				"IPPrefixLen": 16,
				"IPv6Gateway": "",
				"GlobalIPv6Address": "",
				"GlobalIPv6PrefixLen": 0,
				"MacAddress": "02:42:ac:12:00:02"
			}
		}
	},
	"Path": "/bin/sh",
	"ProcessLabel": "",
	"ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf",
	"RestartCount": 1,
	"State": {
		"Error": "",
		"ExitCode": 9,
		"FinishedAt": "2015-01-06T15:47:32.080254511Z",
		"OOMKilled": false,
		"Dead": false,
		"Paused": false,
		"Pid": 0,
		"Restarting": false,
		"Running": true,
		"StartedAt": "2015-01-06T15:47:32.072697474Z",
		"Status": "running"
	},
	"Mounts": [
		{
			"Name": "fac362...80535",
			"Source": "/data",
			"Destination": "/data",
			"Driver": "local",
			"Mode": "ro,Z",
			"RW": false,
			"Propagation": ""
		}
	]
}

请求示例,其中包含尺寸信息

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

带有大小信息的示例响应

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

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

查询参数

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

状态码

  • 200 –没有错误
  • 404 –无此类容器
  • 500 –服务器错误

列出容器中运行的进程

GET /containers/(id or name)/top

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

请求示例

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

响应示例

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

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

请求示例

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

响应示例

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

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

查询参数

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

状态码

  • 200 –没有错误
  • 404 –无此类容器
  • 500 –服务器错误

获取容器日志

GET /containers/(id or name)/logs

从容器获取stdoutstderr记录日志id

注意:此端点仅适用于带有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

 
 {{ STREAM }}

查询参数

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

状态码

  • 101 –没有错误,提示代理有关劫持
  • 200 –没有错误,没有找到升级头
  • 404 –无此类容器
  • 500 –服务器错误

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

GET /containers/(id or name)/changes

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

请求示例

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

响应示例

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

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

Kind

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

状态码

  • 200 –没有错误
  • 404 –无此类容器
  • 500 –服务器错误

导出容器

GET /containers/(id or name)/export

导出容器中的内容 id

请求示例

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

响应示例

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


{{ TAR STREAM }}

状态码

  • 200 –没有错误
  • 404 –无此类容器
  • 500 –服务器错误

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

GET /containers/(id or name)/stats

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

请求示例

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

响应示例

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

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

precpu_stats是的CPU统计先前读取,其被用于计算的CPU使用率百分比。它不是该cpu_stats字段的确切副本。

查询参数

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

状态码

  • 200 –没有错误
  • 404 –无此类容器
  • 500 –服务器错误

调整容器的TTY大小

POST /containers/(id or name)/resize

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

请求示例

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

响应示例

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

查询参数

  • htty会话高度
  • w –宽度

状态码

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

启动一个容器

POST /containers/(id or name)/start

启动容器 id

请求示例

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

响应示例

HTTP/1.1 204 No Content

查询参数

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

状态码

  • 204 –没有错误
  • 304 –容器已经开始
  • 404 –无此类容器
  • 500 –服务器错误

停止容器

POST /containers/(id or name)/stop

停止容器 id

请求示例

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

响应示例

HTTP/1.1 204 No Content

查询参数

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

状态码

  • 204 –没有错误
  • 304 –容器已停止
  • 404 –无此类容器
  • 500 –服务器错误

重新启动容器

POST /containers/(id or name)/restart

重新启动容器 id

请求示例

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

响应示例

HTTP/1.1 204 No Content

查询参数

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

状态码

  • 204 –没有错误
  • 404 –无此类容器
  • 500 –服务器错误

杀死一个容器

POST /containers/(id or name)/kill

杀死容器 id

请求示例

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

响应示例

HTTP/1.1 204 No Content

查询参数

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

状态码

  • 204 –没有错误
  • 404 –无此类容器
  • 500 –服务器错误

更新容器

POST /containers/(id or name)/update

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

请求示例

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

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

响应示例

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

   {
       "Warnings": []
   }

状态码

  • 200 –没有错误
  • 400 –错误的参数
  • 404 –无此类容器
  • 500 –服务器错误

重命名容器

POST /containers/(id or name)/rename

将容器重命名idnew_name

请求示例

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

响应示例

HTTP/1.1 204 No Content

查询参数

  • 名称-容器的新名称

状态码

  • 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


{{ STREAM }}

查询参数

  • detachKeys –覆盖用于分离容器的键序列。格式是一个单独的字符[a-Z]ctrl-<value> 其中<value>是下列之一:a-z@^[,_
  • logs – 1 / True / true或0 / False / false,返回日志。默认值false
  • – 1 / True / true或0 / False / false,返回流。默认值false
  • stdin – 1 / True / true或0 / False / false,如果stream=true附加到stdin。默认值false
  • stdout – 1 / True / true或0 / False / false,如果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 –服务器错误

流详细信息

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

格式为标题有效负载(框架)。

标题

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

它在前八个字节上进行编码,如下所示:

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

STREAM_TYPE 可:

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

SIZE1, SIZE2, SIZE3, SIZE4uint32编码为big endian的大小的四个字节。

有效载荷

有效负载是原始流。

执行

实现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.

附加到容器(网络套接字)

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

id通过websocket附加到容器

根据RFC 6455实现websocket协议握手

范例要求

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

回应范例

{{ STREAM }}

查询参数

  • detachKeys –覆盖用于分离容器的键序列。格式是一个单独的字符[a-Z]ctrl-<value> 其中<value>是下列之一:a-z@^[,_
  • logs – 1 / True / true或0 / False / false,返回日志。默认值false
  • – 1 / True / true或0 / False / false,返回流。默认值false
  • stdin – 1 / True / true或0 / False / false,如果stream=true附加到stdin。默认值false
  • stdout – 1 / True / true或0 / False / false,如果logs=true返回 stdout日志,则stream=true附加到stdout。默认值false
  • stderr – 1 / True / true或0 / False / false,如果logs=true返回 stderr日志,则stream=true附加到stderr。默认值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 /真/真或0 /假/假,删除与容器关联的卷。默认值false
  • 强制-1 /真/真或0 /假/假,杀死然后取出容器。默认值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

在container的文件系统中获取资源的tar存档id

查询参数

  • 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=


{{ TAR STREAM }}

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

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

HEAD请求可以如果只有此信息被需要,也可以向此端点制成。

状态码

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

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

PUT /containers/(id or name)/archive

将要提取的tar存档上传到container的文件系统中的路径 id

查询参数

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

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

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

请求示例

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


{{ TAR STREAM }}

响应示例

HTTP/1.1 200 OK

状态码

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

3.2图片

列出图片

GET /images/json

请求示例

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

响应示例

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

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

带有摘要信息的示例请求

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

带有示例摘要信息的示例响应

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

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

该响应显示了Id与两个存储库(RepoTags)相关联的单个图像localhost:5000/test/busybox::和playdate。调用者可以使用任何一个RepoTagslocalhost:5000/test/busybox:latestplaydate:latest引用图像。

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

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

查询参数

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

从Dockerfile构建映像

POST /build

从Dockerfile构建映像

请求示例

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


{{ TAR STREAM }}

响应示例

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

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

输入流必须是tar与下列算法之一压缩存档:identity(无压缩), ,gzip,。bzip2xz

归档文件必须包含一个构建说明文件,通常Dockerfile在归档文件的根目录中调用 。该dockerfile参数可用于指定其他构建指令文件。为此,其值必须是要使用的替代构建说明文件的路径。

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

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

如果客户端通过退出或终止连接来断开连接,则构建将被取消。

查询参数

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

请求标头

  • 内容类型–设置为"application/x-tar"
  • X-Registry- Config-具有以下结构的base64-url-safe-encoded注册表Auth Config JSON对象:

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

    该对象将注册表的主机名映射到包含该注册表的“用户名”和“密码”的对象。可以指定多个注册表,因为构建可能基于需要验证才能从任意注册表中提取的映像。仅需要注册表域名(如果不是默认的“ 443”,则为端口)。但是(出于传统原因),即使Docker倾向于使用v2注册表API,也必须同时使用“ https://”前缀和“ / v1 /”后缀来指定“正式的” Docker,Inc.托管的注册表。

状态码

  • 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 –导入映像时为映像指定的存储库名称。回购可能包含标签。仅在导入图像时才可以使用此参数。
  • 标签-标签或摘要。如果在拉动图像时为空,则将拉动给定图像的所有标签。

请求标头

  • 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..."}
...

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

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

请求示例

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

查询参数

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

请求标头

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

查询参数

  • 强制– 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
        }
...
]

查询参数

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

状态码

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

3.3其他

检查身份验证配置

POST /auth

验证注册表的凭据,并获取身份令牌(如果有),以在不使用密码的情况下访问注册表。

请求示例

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

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

响应示例

HTTP/1.1 200 OK

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

状态码

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

显示系统范围的信息

GET /info

显示系统范围的信息

请求示例

GET /v1.24/info HTTP/1.1

响应示例

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

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

状态码

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

显示Docker版本信息

GET /version

显示Docker版本信息

请求示例

GET /v1.24/version HTTP/1.1

响应示例

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

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

状态码

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

对Docker服务器执行Ping操作

GET /_ping

对Docker服务器执行Ping操作

请求示例

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

查询参数

  • 容器–源容器
  • 回购–仓库
  • 标签–标签
  • 评论–提交消息
  • 作者–作者(例如,“约翰·汉尼拔·史密斯< hannibal@a-team.com >”)
  • 暂停– 1 / True / true或0 / False / false,是否在提交之前暂停容器
  • 更改–提交时应用的Dockerfile指令

状态码

  • 201 –没有错误
  • 404 –无此类容器
  • 500 –服务器错误

监控Docker的事件

GET /events

通过流实时从Docker获取容器事件。

Docker容器报告以下事件:

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

Docker映像报告以下事件:

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

Docker卷报告以下事件:

create, mount, unmount, destroy

Docker网络报告以下事件:

create, connect, disconnect, destroy

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

reload

请求示例

GET /v1.24/events?since=1374067924

响应示例

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

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

查询参数

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

状态码

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

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

GET /images/(name)/get

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

如果name是特定的名称和标记(例如ubuntu:latest),则仅返回该图像(及其父图像)。如果name是图像ID,则仅返回该图像(及其父图像),但是在tarball中排除了“存储库”文件,因为没有引用图像名称。

有关更多详细信息,请参见图像压缩文件格式

范例要求

GET /v1.24/images/ubuntu/get

响应示例

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

Binary data stream

状态码

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

获取包含所有图像的压缩包

GET /images/get

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

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

有关更多详细信息,请参见图像压缩文件格式

范例要求

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:包含文件系统的tarfile在这一层中发生了变化

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

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

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

执行创建

POST /containers/(id or name)/exec

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

请求示例

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

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

响应示例

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

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

JSON参数

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

状态码

  • 201 –没有错误
  • 404 –无此类容器
  • 409-容器已暂停
  • 500-服务器错误

执行开始

POST /exec/(id)/start

启动先前设置的exec实例id。如果detach为true,则在启动exec命令后返回此API 。否则,此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


{{ STREAM }}

JSON参数

  • 分离-从exec命令分离。
  • Tty-布尔值,用于分配伪TTY。

状态码

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

流详细信息

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

调整大小

POST /exec/(id)/resize

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

请求示例

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

响应示例

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

查询参数

  • htty会话高度
  • w –宽度

状态码

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

执行检查

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 –没有这样的exec实例
  • 500-服务器错误

3.4卷

清单卷

GET /volumes

请求示例

GET /v1.24/volumes HTTP/1.1

响应示例

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

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

查询参数

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

状态码

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

创建一个卷

POST /volumes/create

创建一个卷

请求示例

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

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

响应示例

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

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

状态码

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

JSON参数

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

响应中的JSON字段

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

检查体积

GET /volumes/(name)

返回有关卷的低级信息 name

请求示例

GET /v1.24/volumes/tardis

响应示例

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

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

状态码

  • 200-没有错误
  • 404-无此数量
  • 500-服务器错误

响应中的JSON字段

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

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

删除卷

DELETE /volumes/(name)

指示驱动程序删除音量(name)。

请求示例

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

响应示例

HTTP/1.1 204 No Content

状态码

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

3.5网络

列出网络

GET /networks

请求示例

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

响应示例

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

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

查询参数

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

状态码

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

检查网络

GET /networks/(id or name)

返回网络上的底层信息 id

请求示例

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

响应示例

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

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

状态码

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

创建一个网络

POST /networks/create

创建一个网络

请求示例

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

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

响应示例

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

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

状态码

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

JSON参数

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

将容器连接到网络

POST /networks/(id or name)/connect

将容器连接到网络

请求示例

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

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

响应示例

HTTP/1.1 200 OK

状态码

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

JSON参数

  • container-要连接到网络的container-id / name

断开容器与网络的连接

POST /networks/(id or name)/disconnect

断开容器与网络的连接

请求示例

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

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

响应示例

HTTP/1.1 200 OK

状态码

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

JSON参数

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

删除网络

DELETE /networks/(id or name)

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

请求示例

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

响应示例

HTTP/1.1 204 No Content

状态码

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

3.6插件(实验性)

列出插件

GET /plugins

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

请求示例

GET /v1.24/plugins HTTP/1.1

响应示例

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

[
  {
    "Id": "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078",
    "Name": "tiborvass/no-remove",
    "Tag": "latest",
    "Active": true,
    "Config": {
      "Mounts": [
        {
          "Name": "",
          "Description": "",
          "Settable": null,
          "Source": "/data",
          "Destination": "/data",
          "Type": "bind",
          "Options": [
            "shared",
            "rbind"
          ]
        },
        {
          "Name": "",
          "Description": "",
          "Settable": null,
          "Source": null,
          "Destination": "/foobar",
          "Type": "tmpfs",
          "Options": null
        }
      ],
      "Env": [
        "DEBUG=1"
      ],
      "Args": null,
      "Devices": null
    },
    "Manifest": {
      "ManifestVersion": "v0",
      "Description": "A test plugin for Docker",
      "Documentation": "https://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=<plugin name>

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

请求示例

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

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

响应示例

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

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

查询参数

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

状态码

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

查询参数

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

状态码

  • 200 –没有错误
  • 406-节点不属于群体
  • 500 –服务器错误

检查节点

GET /nodes/(id or name)

返回节点上的底层信息 id

请求示例

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

响应示例

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

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

状态码

  • 200 –没有错误
  • 404 –没有这样的节点
  • 406 –节点不属于群
  • 500 –服务器错误

删除节点

DELETE /nodes/(id or name)

从群集中删除一个节点。

请求示例

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

响应示例

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

查询参数

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

状态码

  • 200 –没有错误
  • 404 –没有这样的节点
  • 406 –节点不属于群
  • 500 –服务器错误

更新节点

POST /nodes/(id)/update

更新节点。

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

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

范例要求

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

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

响应示例

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

查询参数

  • 版本–要更新的节点对象的版本号。这是必需的,以避免写冲突。

JSON参数:

  • 注释–与节点关联的可选Medata。
    • 名称–节点的用户定义名称。
    • 标签–与节点关联的标签图(例如 {"key":"value", "key2":"value2"})。
  • 角色-节点的角色(工人 经理)。
  • 可用性-节点的可用性(活动 暂停 流走)。

状态码

  • 200 –没有错误
  • 404 –没有这样的节点
  • 406 –节点不属于群
  • 500 –服务器错误

3.8群

检查群

GET /swarm

检查群

响应示例

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

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

状态码

  • 200-没有错误
  • 406 –节点不属于群
  • 500-严重错误

初始化一个新的群体

POST /swarm/init

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

请求示例

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

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

响应示例

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

"7v2t30z9blmxuhnyo6s4cpenp"

状态码

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

JSON参数:

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

加入现有的群体

POST /swarm/join

加入现有的群体

请求示例

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

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

响应示例

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

状态码

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

JSON参数:

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

留下一群

POST /swarm/leave

留下一群

请求示例

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

响应示例

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

查询参数

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

状态码

  • 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

查询参数

  • 版本–正在更新的swarm对象的版本号。这是必需的,以避免写冲突。
  • rotationWorkerToken-设置为true(或1)以旋转工作程序连接令牌。
  • rotationManagerToken-设置为true(或1)以旋转管理器联接令牌。

状态码

  • 200 –没有错误
  • 400 –错误的参数
  • 406 –节点不属于群
  • 500-服务器错误

JSON参数:

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

3.9服务

注意:维修操作首先必须是一群人的一部分。

列出服务

GET /services

列出服务

请求示例

GET /v1.24/services HTTP/1.1

响应示例

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

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

查询参数

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

状态码

  • 200 –没有错误
  • 406 –节点不属于群
  • 500 –服务器错误

创建服务

POST /services/create

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

请求示例

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

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

响应示例

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

{
  "ID":"ak7w3gjqoa3kuz8xcpnyy0pvl"
}

状态码

  • 201 –没有错误
  • 403-网络不符合服务条件
  • 406 –节点不属于群
  • 409 –名称与现有对象冲突
  • 500-服务器错误

JSON参数

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

请求标头

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

删除服务

DELETE /services/(id or name)

停止并删除服务 id

请求示例

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

响应示例

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

状态码

  • 200 –没有错误
  • 404 –无此类服务
  • 406-节点不属于群体
  • 500 –服务器错误

检查一项或多项服务

GET /services/(id or name)

返回有关服务的信息id

请求示例

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

响应示例

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

状态码

  • 200 –没有错误
  • 404 –无此类服务
  • 406-节点不属于群体
  • 500 –服务器错误

更新服务

POST /services/(id)/update

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

请求示例

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

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

响应示例

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

JSON参数

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

查询参数

  • 版本–要更新的服务对象的版本号。这是必需的,以避免写冲突。

请求标头

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

状态码

  • 200 –没有错误
  • 404 –无此类服务
  • 406-节点不属于群体
  • 500 –服务器错误

3.10任务

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

列出任务

GET /tasks

列出任务

请求示例

GET /v1.24/tasks HTTP/1.1

响应示例

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

查询参数

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

状态码

  • 200 –没有错误
  • 406-节点不属于群体
  • 500 –服务器错误

检查任务

GET /tasks/(id)

获取有关任务的详细信息 id

请求示例

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

响应示例

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

状态码

  • 200 –没有错误
  • 404 –未知任务
  • 406-节点不属于群体
  • 500 –服务器错误

4.更进一步

4.1内部 docker run

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

  • 创建容器

  • 如果状态码为404,则表示该图片不存在:
    • 尝试拉扯它。
    • 然后,重试创建容器。
  • 启动容器。

  • 如果您不在分离模式下:
  • 使用logs=1(从容器的开头开始stdoutstderr从容器开始)附加到容器上stream=1

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

4.2劫持

在这个版本的API, /attach,利用劫持到运输stdinstdout以及stderr在同一个插座。

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

Upgrade: tcp
Connection: Upgrade

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

4.3 CORS要求

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

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