引擎 API v1.24
1. 简介
- 守护进程监听
unix:///var/run/docker.sock
但是你可以将 Docker 绑定到另一个主机/端口或 Unix 套接字。 - API 往往是 REST。但是,对于一些复杂的命令,例如
attach
或pull
,HTTP 连接将被劫持以传输stdout
,stdin
和stderr
. - 一个
Content-Length
header 应存在于POST
对终端节点的请求 期待一个身体。 - 要锁定到特定版本的 API,请在 URL 前面加上版本
要使用的 API。例如
/v1.18/info
.如果未包含 URL 时,使用支持的最高 API 版本。 - 如果守护程序不支持 URL 中指定的 API 版本,则 HTTP
400 Bad Request
返回错误消息。
2. 错误
引擎 API 使用标准 HTTP 状态代码来指示 API 调用的成功或失败。响应的正文将是以下格式的 JSON:
{
"message": "page not found"
}
为每个终端节点返回的状态代码在下面的终端节点文档中指定。
3. 端点
3.1 容器
列出容器
GET /containers/json
列出容器
请求示例:
GET /v1.24/containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"Id": "8dfafdbc3a40",
"Names":["/boring_feynman"],
"Image": "ubuntu:latest",
"ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
"Command": "echo 1",
"Created": 1367854155,
"State": "exited",
"Status": "Exit 0",
"Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}],
"Labels": {
"com.example.vendor": "Acme",
"com.example.license": "GPL",
"com.example.version": "1.0"
},
"SizeRw": 12288,
"SizeRootFs": 0,
"HostConfig": {
"NetworkMode": "default"
},
"NetworkSettings": {
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
"EndpointID": "2cdc4edb1ded3631c81f57966563e5c8525b81121bb3706a9a9a3ae102711f3f",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
},
"Mounts": [
{
"Name": "fac362...80535",
"Source": "/data",
"Destination": "/data",
"Driver": "local",
"Mode": "ro,Z",
"RW": false,
"Propagation": ""
}
]
},
{
"Id": "9cd87474be90",
"Names":["/coolName"],
"Image": "ubuntu:latest",
"ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
"Command": "echo 222222",
"Created": 1367854155,
"State": "exited",
"Status": "Exit 0",
"Ports": [],
"Labels": {},
"SizeRw": 12288,
"SizeRootFs": 0,
"HostConfig": {
"NetworkMode": "default"
},
"NetworkSettings": {
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
"EndpointID": "88eaed7b37b38c2a3f0c4bc796494fdf51b270c2d22656412a2ca5d559a64d7a",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.8",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:08"
}
}
},
"Mounts": []
},
{
"Id": "3176a2479c92",
"Names":["/sleepy_dog"],
"Image": "ubuntu:latest",
"ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
"Command": "echo 3333333333333333",
"Created": 1367854154,
"State": "exited",
"Status": "Exit 0",
"Ports":[],
"Labels": {},
"SizeRw":12288,
"SizeRootFs":0,
"HostConfig": {
"NetworkMode": "default"
},
"NetworkSettings": {
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
"EndpointID": "8b27c041c30326d59cd6e6f510d4f8d1d570a228466f956edf7815508f78e30d",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.6",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:06"
}
}
},
"Mounts": []
},
{
"Id": "4cb07b47f9fb",
"Names":["/running_cat"],
"Image": "ubuntu:latest",
"ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
"Command": "echo 444444444444444444444444444444444",
"Created": 1367854152,
"State": "exited",
"Status": "Exit 0",
"Ports": [],
"Labels": {},
"SizeRw": 12288,
"SizeRootFs": 0,
"HostConfig": {
"NetworkMode": "default"
},
"NetworkSettings": {
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
"EndpointID": "d91c7b2f0644403d7ef3095985ea0e2370325cd2332ff3a3225c4247328e66e9",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.5",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:05"
}
}
},
"Mounts": []
}
]
查询参数:
- all – 1/True/true 或 0/False/false,显示所有容器。 默认情况下,仅显示正在运行的容器(即,默认为 false)
- limit – 显示
limit
上次创建时间 容器,包括未运行的容器。 - since – 仅显示自 Id 以来创建的容器,包括 未运行的。
- before – 仅显示在 Id 之前创建的容器,包括 未运行的。
- size – 1/True/true 或 0/False/false,显示容器 大小
- filters - 过滤器的 JSON 编码值(一个
map[string][]string
) 处理。可用筛选器: exited=<int>
;-- 退出代码为<int>
;status=
(created
|restarting
|running
|paused
|exited
|dead
)label=key
或label="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 参数:
- Hostname - 一个字符串值,其中包含要用于 容器。这必须是有效的 RFC 1123 主机名。
- Domainname - 包含要使用的域名的字符串值 对于容器。
- User - 一个字符串值,用于指定容器内的用户。
- AttachStdin - 布尔值,附加到
stdin
. - AttachStdout - 布尔值,附加到
stdout
. - AttachStderr - 布尔值,附加到
stderr
. - Tty - 布尔值,将标准流附加到
tty
包括stdin
如果它没有关闭。 - OpenStdin - 布尔值,打开
stdin
, - StdinOnce - 布尔值,关闭
stdin
在 1 个连接的客户端断开连接后。 - Env - 以
["VAR=value", ...]
- 标签 - 将标签映射添加到容器。要指定映射:
{"key":"value", ... }
- Cmd — 要运行的命令,指定为字符串或字符串数组。
- Entrypoint - 将容器的入口点设置为字符串或数组 的字符串。
- Image - 指定要用于容器的镜像名称的字符串。
- 卷 - 对象映射 container 来清空对象。
- Healthcheck - 为检查容器是否运行状况良好而执行的测试。
**Test** - The test to perform. Possible values are: + `{}` inherit healthcheck from image or parent image + `{"NONE"}` disable healthcheck + `{"CMD", args...}` exec arguments directly + `{"CMD-SHELL", command}` run command with system's default shell
**Interval** - The time to wait between checks in nanoseconds. It should be 0 or at least 1000000 (1 ms). 0 means inherit.
**Timeout** - The time to wait before considering the check to have hung. It should be 0 or at least 1000000 (1 ms). 0 means inherit.
**Retries** - The number of consecutive failures needed to consider a container as unhealthy. 0 means inherit.
**StartPeriod** - The time to wait for container initialization before starting health-retries countdown in nanoseconds. It should be 0 or at least 1000000 (1 ms). 0 means inherit.
- WorkingDir - 一个字符串,用于指定命令的工作目录 磨合。
- NetworkDisabled - 布尔值,当 true 禁用 容器
- ExposedPorts - 将端口映射到空对象的对象,其形式为:
"ExposedPorts": { "<port>/<tcp|udp>: {}" }
- StopSignal - 以字符串或无符号整数形式停止容器的信号。
SIGTERM
默认情况下。 - HostConfig 主机配置
Binds (绑定) – 此容器的卷绑定列表。每个卷绑定都是以下形式之一的字符串:
host-src:container-dest
要将主机路径绑定到 容器。双host-src
和container-dest
必须是绝对路径。host-src:container-dest:ro
将 Bind Mount 设置为只读 在容器内。双host-src
和container-dest
必须是 绝对路径。volume-name:container-dest
绑定挂载由 volume 驱动程序下载到容器中。container-dest
必须是绝对路径。volume-name:container-dest:ro
以只读方式挂载卷 在容器内。container-dest
必须是绝对路径。
Tmpfs – 应替换为 tmpfs 挂载的容器目录映射,以及它们对应的 挂载选项。表单中的 JSON 对象
{ "/run": "rw,noexec,nosuid,size=65536k" }
.链接 - 容器的链接列表。每个链接条目都应该是 以
container_name:alias
.内存 - 内存限制(以字节为单位)。
MemorySwap - 总内存限制 (内存 + 交换);设置
-1
以启用无限交换。 您必须将其与memory
并使 Swap 值大于memory
.MemoryReservation - 内存软限制(以字节为单位)。
KernelMemory - 内核内存限制(以字节为单位)。
CpuPercent - 一个整数值,其中包含可用 CPU 的可用百分比。(仅限 Windows 守护程序)
CpuShares - 包含容器的 CPU 份额的整数值 (即与其他容器的相对重量)。
CpuPeriod - CPU 周期的长度(以微秒为单位)。
CpuQuota - 容器在一个 CPU 周期内可以获得的 CPU 时间微秒。
CpusetCpus - 包含
cgroups CpusetCpus
使用。CpusetMems - 允许执行的内存节点 (MEM) (0-3, 0,1)。仅在 NUMA 系统上有效。
IOMaximumBandwidth - 以 IOps 为单位的最大 IO 绝对速率。
IOMaximumIOps - 最大 IO 绝对速率(以每秒字节数为单位)。
BlkioWeight - 块 IO 权重(相对权重)接受介于 10 和 1000 之间的权重值。
BlkioWeightDevice - 块 IO 权重(相对设备权重),其形式为:
"BlkioWeightDevice": [{"Path": "device_path", "Weight": weight}]
BlkioDeviceReadBps - 限制设备读取速率(每秒字节数),其形式为:
"BlkioDeviceReadBps": [{"Path": "device_path", "Rate": rate}]
例如:"BlkioDeviceReadBps": [{"Path": "/dev/sda", "Rate": "1024"}]"
BlkioDeviceWriteBps - 以以下形式限制对设备的写入速率(每秒字节数):
"BlkioDeviceWriteBps": [{"Path": "device_path", "Rate": rate}]
例如:"BlkioDeviceWriteBps": [{"Path": "/dev/sda", "Rate": "1024"}]"
BlkioDeviceReadIOps - 限制设备读取速率(每秒 IO),形式为:
"BlkioDeviceReadIOps": [{"Path": "device_path", "Rate": rate}]
例如:"BlkioDeviceReadIOps": [{"Path": "/dev/sda", "Rate": "1000"}]
BlkioDeviceWriteIOps - 以以下形式限制对设备的写入速率(每秒 IO):
"BlkioDeviceWriteIOps": [{"Path": "device_path", "Rate": rate}]
例如:"BlkioDeviceWriteIOps": [{"Path": "/dev/sda", "Rate": "1000"}]
MemorySwappiness - 调整容器的内存交换行为。接受介于 0 和 100 之间的整数。
OomKillDisable - 布尔值,是否为容器禁用 OOM Killer。
OomScoreAdj - 一个整数值,其中包含为优化 OOM 终止程序首选项而为容器提供的分数。
PidMode - 设置容器的 PID (进程) 命名空间模式;
"container:<name|id>"
:加入另一个容器的 PID 命名空间"host"
:在容器内使用主机的 PID 命名空间PidsLimit - 调整容器的 PIDS 限制。设置为 -1 表示无限制。
PortBindings - 公开的容器端口及其主机端口的映射 应映射到。表单中的 JSON 对象
{ <port>/<protocol>: [{ "HostPort": "<port>" }] }
请注意,port
指定为字符串,而不是整数值。PublishAllPorts - 为容器的所有 暴露的端口。指定为布尔值。
当容器停止时,将取消分配端口,并在容器启动时分配端口。 重新启动容器时,分配的端口可能会更改。
端口是从依赖于内核的临时端口范围中选择的。 例如,在 Linux 上,范围由
/proc/sys/net/ipv4/ip_local_port_range
.Privileged (特权) - 为容器提供对主机的完全访问权限。指定为 布尔值。
ReadonlyRootfs - 以只读方式挂载容器的根文件系统。 指定为布尔值。
Dns - 容器要使用的 DNS 服务器列表。
DnsOptions - DNS 选项列表
DnsSearch - DNS 搜索域列表
ExtraHosts - 要添加到 容器的
/etc/hosts
文件。在表单中指定["hostname:IP"]
.VolumesFrom - 要从另一个容器继承的卷列表。 在表单中指定
<container name>[:<ro|rw>]
CapAdd - 要添加到容器的内核功能列表。
Capdrop - 要从容器中删除的内核功能列表。
GroupAdd - 容器进程将作为其他组的列表
RestartPolicy – 容器退出时要应用的行为。这 value 是一个对象,其
Name
属性"always"
自 始终重启,"unless-stopped"
始终重新启动,除非 用户已手动停止容器,或者"on-failure"
仅在容器 退出代码为非零。如果on-failure
,MaximumRetryCount
控制在放弃之前重试的次数。 默认值为不重新启动。(可选) 不断增加的延迟(之前延迟的两倍,从 100 毫秒开始) 在每次重新启动之前添加,以防止服务器泛洪。UsernsMode - 启用 usernamespace 重新映射选项时,设置容器的 usernamespace 模式。 支持的值为:
host
.NetworkMode - 设置容器的网络模式。支持 标准值为:
bridge
,host
,none
和container:<name|id>
.采用任何其他值 作为此容器应连接到的自定义网络的名称。Devices - 要添加到容器中的设备列表,在 形式
{ "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}
Ulimits - 要在容器中设置的 ulimits 列表,指定为
{ "Name": <name>, "Soft": <soft limit>, "Hard": <hard limit> }
例如:Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }
Sysctls - 要在容器中设置的内核参数 (sysctl) 列表,指定为
{ <name>: <Value> }
例如:{ "net.ipv4.ip_forward": "1" }
SecurityOpt:用于自定义 MLS 标签的字符串值列表 系统,例如 SELinux。
StorageOpt:每个容器的存储驱动程序选项。选项可以在表单中传递
{"size":"120G"}
LogConfig - 容器的日志配置,在表单中指定为 JSON 对象
{ "Type": "<driver_name>", "Config": {"key1": "val1"}}
. 可用类型:json-file
,syslog
,journald
,gelf
,fluentd
,awslogs
,splunk
,etwlogs
,none
.json-file
logging 驱动程序。CgroupParent - 路径
cgroups
在该容器的cgroup
已创建。如果 path 不是 absolutut 的,则认为该 path 是相对于cgroups
init 进程的路径。如果 Cgroups 尚不存在,则创建 Cgroup。VolumeDriver - 此容器用于挂载卷的驱动程序。
ShmSize - 大小
/dev/shm
以字节为单位。大小必须大于 0。如果省略,系统将使用 64MB。
查询参数:
- name (名称) – 为容器分配指定的名称。必须
火柴
/?[a-zA-Z0-9_-]+
.
状态代码:
- 201 – 无错误
- 400 – 参数错误
- 404 – 没有这样的镜像
- 406 – 无法附加(容器未运行)
- 409 – 冲突
- 500 – 服务器错误
检查容器
GET /containers/(id or name)/json
返回容器的低级信息id
请求示例:
GET /v1.24/containers/4fa6e0f0c678/json HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"AppArmorProfile": "",
"Args": [
"-c",
"exit 9"
],
"Config": {
"AttachStderr": true,
"AttachStdin": false,
"AttachStdout": true,
"Cmd": [
"/bin/sh",
"-c",
"exit 9"
],
"Domainname": "",
"Entrypoint": null,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"ExposedPorts": null,
"Hostname": "ba033ac44011",
"Image": "ubuntu",
"Labels": {
"com.example.vendor": "Acme",
"com.example.license": "GPL",
"com.example.version": "1.0"
},
"MacAddress": "",
"NetworkDisabled": false,
"OnBuild": null,
"OpenStdin": false,
"StdinOnce": false,
"Tty": false,
"User": "",
"Volumes": {
"/volumes/data": {}
},
"WorkingDir": "",
"StopSignal": "SIGTERM"
},
"Created": "2015-01-06T15:47:31.485331387Z",
"Driver": "overlay2",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"IOMaximumBandwidth": 0,
"IOMaximumIOps": 0,
"BlkioWeight": 0,
"BlkioWeightDevice": [{}],
"BlkioDeviceReadBps": [{}],
"BlkioDeviceWriteBps": [{}],
"BlkioDeviceReadIOps": [{}],
"BlkioDeviceWriteIOps": [{}],
"CapAdd": null,
"CapDrop": null,
"ContainerIDFile": "",
"CpusetCpus": "",
"CpusetMems": "",
"CpuPercent": 80,
"CpuShares": 0,
"CpuPeriod": 100000,
"Devices": [],
"Dns": null,
"DnsOptions": null,
"DnsSearch": null,
"ExtraHosts": null,
"IpcMode": "",
"Links": null,
"Memory": 0,
"MemorySwap": 0,
"MemoryReservation": 0,
"KernelMemory": 0,
"OomKillDisable": false,
"OomScoreAdj": 500,
"NetworkMode": "bridge",
"PidMode": "",
"PortBindings": {},
"Privileged": false,
"ReadonlyRootfs": false,
"PublishAllPorts": false,
"RestartPolicy": {
"MaximumRetryCount": 2,
"Name": "on-failure"
},
"LogConfig": {
"Config": null,
"Type": "json-file"
},
"SecurityOpt": null,
"Sysctls": {
"net.ipv4.ip_forward": "1"
},
"StorageOpt": null,
"VolumesFrom": null,
"Ulimits": [{}],
"VolumeDriver": "",
"ShmSize": 67108864
},
"HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname",
"HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts",
"LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log",
"Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39",
"Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2",
"MountLabel": "",
"Name": "/boring_euclid",
"NetworkSettings": {
"Bridge": "",
"SandboxID": "",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": null,
"SandboxKey": "",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {
"bridge": {
"NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
"EndpointID": "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:02"
}
}
},
"Path": "/bin/sh",
"ProcessLabel": "",
"ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf",
"RestartCount": 1,
"State": {
"Error": "",
"ExitCode": 9,
"FinishedAt": "2015-01-06T15:47:32.080254511Z",
"OOMKilled": false,
"Dead": false,
"Paused": false,
"Pid": 0,
"Restarting": false,
"Running": true,
"StartedAt": "2015-01-06T15:47:32.072697474Z",
"Status": "running"
},
"Mounts": [
{
"Name": "fac362...80535",
"Source": "/data",
"Destination": "/data",
"Driver": "local",
"Mode": "ro,Z",
"RW": false,
"Propagation": ""
}
]
}
示例请求,包含大小信息:
GET /v1.24/containers/4fa6e0f0c678/json?size=1 HTTP/1.1
包含大小信息的响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{
....
"SizeRw": 0,
"SizeRootFs": 972,
....
}
查询参数:
- size – 1/True/true 或 0/False/false,返回容器大小信息。默认值为
false
.
状态代码:
- 200 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
列出容器内运行的进程
GET /containers/(id or name)/top
列出容器内运行的进程id
.在 Unix 系统上,此
通过运行ps
命令。此终端节点不是
在 Windows 上受支持。
请求示例:
GET /v1.24/containers/4fa6e0f0c678/top HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"Titles" : [
"UID", "PID", "PPID", "C", "STIME", "TTY", "TIME", "CMD"
],
"Processes" : [
[
"root", "13642", "882", "0", "17:03", "pts/0", "00:00:00", "/bin/bash"
],
[
"root", "13735", "13642", "0", "17:06", "pts/0", "00:00:00", "sleep 10"
]
]
}
请求示例:
GET /v1.24/containers/4fa6e0f0c678/top?ps_args=aux HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"Titles" : [
"USER","PID","%CPU","%MEM","VSZ","RSS","TTY","STAT","START","TIME","COMMAND"
]
"Processes" : [
[
"root","13642","0.0","0.1","18172","3184","pts/0","Ss","17:03","0:00","/bin/bash"
],
[
"root","13895","0.0","0.0","4348","692","pts/0","S+","17:15","0:00","sleep 10"
]
],
}
查询参数:
- ps_args –
ps
参数(例如aux
),默认为-ef
状态代码:
- 200 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
获取容器日志
GET /containers/(id or name)/logs
获取stdout
和stderr
来自容器的日志id
注意: 此终端节点仅适用于具有
json-file
或journald
记录驱动程序。
请求示例:
GET /v1.24/containers/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1
响应示例:
HTTP/1.1 101 UPGRADED
Content-Type: application/vnd.docker.raw-stream
Connection: Upgrade
Upgrade: tcp
{% raw %}
{{ STREAM }}
{% endraw %}
查询参数:
- details - 1/True/true 或 0/False/false,显示提供给日志的额外详细信息。违约
false
. - follow – 1/True/true 或 0/False/false,返回流。违约
false
. - stdout – 1/True/true 或 0/False/false,显示
stdout
日志。违约false
. - stderr – 1/True/true 或 0/False/false,显示
stderr
日志。违约false
. - since – 用于筛选日志的 UNIX 时间戳 (整数)。指定时间戳 将仅输出自该时间戳以来的日志条目。默认值:0(未筛选)
- timestamps – 1/True/true 或 0/False/false,打印时间戳
每个对数行。违约
false
. - tail – 在日志末尾输出指定的行数:
all
或<number>
.默认全部。
状态代码:
- 101 – 没有错误,提示代理关于劫持
- 200 – 无错误,未找到升级标头
- 404 – 没有这样的容器
- 500 – 服务器错误
检查容器文件系统上的更改
GET /containers/(id or name)/changes
检查容器上的更改id
的文件系统
请求示例:
GET /v1.24/containers/4fa6e0f0c678/changes HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"Path": "/dev",
"Kind": 0
},
{
"Path": "/dev/kmsg",
"Kind": 1
},
{
"Path": "/test",
"Kind": 1
}
]
的值Kind
:
0
:修改1
:加2
:删除
状态代码:
- 200 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
导出容器
GET /containers/(id or name)/export
导出容器的内容id
请求示例:
GET /v1.24/containers/4fa6e0f0c678/export HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/octet-stream
{% raw %}
{{ TAR STREAM }}
{% endraw %}
状态代码:
- 200 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
根据资源使用情况获取容器统计信息
GET /containers/(id or name)/stats
此终端节点返回容器资源使用情况统计信息的实时流。
请求示例:
GET /v1.24/containers/redis1/stats HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"read" : "2015-01-08T22:57:31.547920715Z",
"pids_stats": {
"current": 3
},
"networks": {
"eth0": {
"rx_bytes": 5338,
"rx_dropped": 0,
"rx_errors": 0,
"rx_packets": 36,
"tx_bytes": 648,
"tx_dropped": 0,
"tx_errors": 0,
"tx_packets": 8
},
"eth5": {
"rx_bytes": 4641,
"rx_dropped": 0,
"rx_errors": 0,
"rx_packets": 26,
"tx_bytes": 690,
"tx_dropped": 0,
"tx_errors": 0,
"tx_packets": 9
}
},
"memory_stats" : {
"stats" : {
"total_pgmajfault" : 0,
"cache" : 0,
"mapped_file" : 0,
"total_inactive_file" : 0,
"pgpgout" : 414,
"rss" : 6537216,
"total_mapped_file" : 0,
"writeback" : 0,
"unevictable" : 0,
"pgpgin" : 477,
"total_unevictable" : 0,
"pgmajfault" : 0,
"total_rss" : 6537216,
"total_rss_huge" : 6291456,
"total_writeback" : 0,
"total_inactive_anon" : 0,
"rss_huge" : 6291456,
"hierarchical_memory_limit" : 67108864,
"total_pgfault" : 964,
"total_active_file" : 0,
"active_anon" : 6537216,
"total_active_anon" : 6537216,
"total_pgpgout" : 414,
"total_cache" : 0,
"inactive_anon" : 0,
"active_file" : 0,
"pgfault" : 964,
"inactive_file" : 0,
"total_pgpgin" : 477
},
"max_usage" : 6651904,
"usage" : 6537216,
"failcnt" : 0,
"limit" : 67108864
},
"blkio_stats" : {},
"cpu_stats" : {
"cpu_usage" : {
"percpu_usage" : [
8646879,
24472255,
36438778,
30657443
],
"usage_in_usermode" : 50000000,
"total_usage" : 100215355,
"usage_in_kernelmode" : 30000000
},
"system_cpu_usage" : 739306590000000,
"throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0}
},
"precpu_stats" : {
"cpu_usage" : {
"percpu_usage" : [
8646879,
24350896,
36438778,
30657443
],
"usage_in_usermode" : 50000000,
"total_usage" : 100093996,
"usage_in_kernelmode" : 30000000
},
"system_cpu_usage" : 9492140000000,
"throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0}
}
}
这precpu_stats
是上一次读取的 CPU 统计信息,用于计算 CPU 使用率百分比。它不是cpu_stats
田。
查询参数:
- stream – 1/True/true 或 0/False/false,提取统计信息一次,然后断开连接。违约
true
.
状态代码:
- 200 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
调整容器大小 TTY
POST /containers/(id or name)/resize
使用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
查询参数:
- h – 高度
tty
会期 - w – 宽度
状态代码:
- 200 – 无错误
- 404 – 没有这样的容器
- 500 – 无法调整容器大小
启动容器
POST /containers/(id or name)/start
启动容器id
请求示例:
POST /v1.24/containers/e90e34656806/start HTTP/1.1
响应示例:
HTTP/1.1 204 No Content
查询参数:
- detachKeys – 覆盖用于分离
容器。格式为单个字符
[a-Z]
或ctrl-<value>
哪里<value>
是以下之一:a-z
, , , ,@
^
[
,
或。_
状态代码:
- 204 – 无错误
- 304 – 容器已启动
- 404 – 没有这样的容器
- 500 – 服务器错误
停止容器
POST /containers/(id or name)/stop
停止容器id
请求示例:
POST /v1.24/containers/e90e34656806/stop?t=5 HTTP/1.1
响应示例:
HTTP/1.1 204 No Content
查询参数:
- t – 终止容器之前等待的秒数
状态代码:
- 204 – 无错误
- 304 – 容器已停止
- 404 – 没有这样的容器
- 500 – 服务器错误
重启容器
POST /containers/(id or name)/restart
重启容器id
请求示例:
POST /v1.24/containers/e90e34656806/restart?t=5 HTTP/1.1
响应示例:
HTTP/1.1 204 No Content
查询参数:
- t – 终止容器之前等待的秒数
状态代码:
- 204 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
杀死一个容器
POST /containers/(id or name)/kill
杀死容器id
请求示例:
POST /v1.24/containers/e90e34656806/kill HTTP/1.1
响应示例:
HTTP/1.1 204 No Content
查询参数:
- signal - 要发送到容器的信号:整数或字符串,如
SIGINT
. 未设置时,SIGKILL
,并且调用等待容器退出。
状态代码:
- 204 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
更新容器
POST /containers/(id or name)/update
更新一个或多个容器的配置。
请求示例:
POST /v1.24/containers/e90e34656806/update HTTP/1.1
Content-Type: application/json
Content-Length: 12345
{
"BlkioWeight": 300,
"CpuShares": 512,
"CpuPeriod": 100000,
"CpuQuota": 50000,
"CpusetCpus": "0,1",
"CpusetMems": "0",
"Memory": 314572800,
"MemorySwap": 514288000,
"MemoryReservation": 209715200,
"KernelMemory": 52428800,
"RestartPolicy": {
"MaximumRetryCount": 4,
"Name": "on-failure"
}
}
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"Warnings": []
}
状态代码:
- 200 – 无错误
- 400 – 参数错误
- 404 – 没有这样的容器
- 500 – 服务器错误
重命名容器
POST /containers/(id or name)/rename
重命名容器id
更改为new_name
请求示例:
POST /v1.24/containers/e90e34656806/rename?name=new_name HTTP/1.1
响应示例:
HTTP/1.1 204 No Content
查询参数:
- name – 容器的新名称
状态代码:
- 204 – 无错误
- 404 – 没有这样的容器
- 409 - 已分配冲突名称
- 500 – 服务器错误
暂停容器
POST /containers/(id or name)/pause
暂停容器id
请求示例:
POST /v1.24/containers/e90e34656806/pause HTTP/1.1
响应示例:
HTTP/1.1 204 No Content
状态代码:
- 204 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
取消暂停容器
POST /containers/(id or name)/unpause
取消暂停容器id
请求示例:
POST /v1.24/containers/e90e34656806/unpause HTTP/1.1
响应示例:
HTTP/1.1 204 No Content
状态代码:
- 204 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
附加到容器
POST /containers/(id or name)/attach
附加到容器id
请求示例:
POST /v1.24/containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1
响应示例:
HTTP/1.1 101 UPGRADED
Content-Type: application/vnd.docker.raw-stream
Connection: Upgrade
Upgrade: tcp
{% raw %}
{{ STREAM }}
{% endraw %}
查询参数:
- detachKeys – 覆盖用于分离
容器。格式为单个字符
[a-Z]
或ctrl-<value>
哪里<value>
是以下之一:a-z
, , , ,@
^
[
,
或。_
- logs – 1/True/true 或 0/False/false,返回日志。违约
false
. - stream – 1/True/true 或 0/False/false,返回流。
违约
false
. - stdin – 1/True/true 或 0/False/false,如果
stream=true
附加 自stdin
.违约false
. - stdout – 1/True/true 或 0/False/false,如果
logs=true
返回stdout
log,如果stream=true
䵗stdout
.违约false
. - stderr – 1/True/true 或 0/False/false,如果
logs=true
返回stderr
log,如果stream=true
䵗stderr
.违约false
.
状态代码:
- 101 – 没有错误,提示代理关于劫持
- 200 – 无错误,未找到升级标头
- 400 – 参数错误
- 404 – 没有这样的容器
- 409 - 容器已暂停
- 500 – 服务器错误
流详细信息:
当使用 TTY 设置在POST /containers/create
,
流是来自进程 PTY 和客户端的stdin
.
禁用 TTY 时,将对流进行多路复用以分离stdout
和stderr
.
格式为 Header 和 Payload (frame)。
页眉
标头包含流写入的信息 (stdout
或stderr
).它还包含在
最后四个字节 (uint32
).
它在前 8 个字节上编码,如下所示:
header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}
STREAM_TYPE
可以是:
- 0:
stdin
(写在stdout
) - 1:
stdout
- 2:
stderr
SIZE1, SIZE2, SIZE3, SIZE4
是
这uint32
size 编码为 big endian。
有效载荷
payload 是原始流。
实现
实现 Attach 协议的最简单方法如下:
1. Read eight bytes.
2. Choose `stdout` or `stderr` depending on the first byte.
3. Extract the frame size from the last four bytes.
4. Read the extracted size and output it on the correct output.
5. Goto 1.
附加到容器 (websocket)
GET /containers/(id or name)/attach/ws
附加到容器id
通过 WebSocket
根据 RFC 6455 实现 websocket 协议握手
示例请求
GET /v1.24/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
响应示例
{% raw %}
{{ STREAM }}
{% endraw %}
查询参数:
- detachKeys – 覆盖用于分离
容器。格式为单个字符
[a-Z]
或ctrl-<value>
哪里<value>
是以下之一:a-z
, , , ,@
^
[
,
或。_
- logs – 1/True/true 或 0/False/false,返回日志。违约
false
. - stream – 1/True/true 或 0/False/false,返回流。
违约
false
.
状态代码:
- 200 – 无错误
- 400 – 参数错误
- 404 – 没有这样的容器
- 500 – 服务器错误
等待容器
POST /containers/(id or name)/wait
Block until container (阻止直到容器)id
stops,然后返回退出代码
请求示例:
POST /v1.24/containers/16253994b7c4/wait HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{"StatusCode": 0}
状态代码:
- 200 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
删除容器
DELETE /containers/(id or name)
移除容器id
从文件系统
请求示例:
DELETE /v1.24/containers/16253994b7c4?v=1 HTTP/1.1
响应示例:
HTTP/1.1 204 No Content
查询参数:
- v – 1/True/true 或 0/False/false,删除卷
关联到容器。违约
false
. - force - 1/True/true 或 0/False/false,则 Kill 然后删除容器。
违约
false
. - link - 1/True/true 或 0/False/false,删除指定的
链接。违约
false
.
状态代码:
- 204 – 无错误
- 400 – 参数错误
- 404 – 没有这样的容器
- 409 – 冲突
- 500 – 服务器错误
检索有关容器中的文件和文件夹的信息
HEAD /containers/(id or name)/archive
请参阅X-Docker-Container-Path-Stat
标头中的
以下部分。
获取容器中文件系统资源的存档
GET /containers/(id or name)/archive
获取容器文件系统中资源的 tar 存档id
.
查询参数:
path - 容器文件系统中要存档的资源。必填。
如果不是绝对路径,则它是相对于容器的根目录的。 path 指定的资源必须存在。要断言资源 应为目录,路径应以 或
/
/.
(假设路径分隔符为 )。如果 path 结尾于/
/.
然后这个 指示只有 path 目录的内容应为 复制。符号链接始终解析为其目标。注意:无法复制某些系统文件,例如资源 下
/proc
,/sys
,/dev
和用户在 容器。
请求示例:
GET /v1.24/containers/8cce319429b2/archive?path=/root HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/x-tar
X-Docker-Container-Path-Stat: eyJuYW1lIjoicm9vdCIsInNpemUiOjQwOTYsIm1vZGUiOjIxNDc0ODQwOTYsIm10aW1lIjoiMjAxNC0wMi0yN1QyMDo1MToyM1oiLCJsaW5rVGFyZ2V0IjoiIn0=
{% raw %}
{{ TAR STREAM }}
{% endraw %}
成功后,响应标头X-Docker-Container-Path-Stat
将设置为
base64 编码的 JSON 对象,其中包含一些文件系统头信息
存档的资源。上面的示例值将解码为以下内容
JSON 对象(为提高可读性而添加了空格):
{
"name": "root",
"size": 4096,
"mode": 2147484096,
"mtime": "2014-02-27T20:51:23Z",
"linkTarget": ""
}
一个HEAD
如果只有此信息是
期望。
状态代码:
- 200 - 成功,返回复制资源的存档
- 400 - 客户端错误、参数错误、JSON 响应正文中的详细信息,以下之一:
- 必须指定 path 参数(path 不能为空)
- 不是目录(path 被断言为目录,但作为 文件)
- 404 - 客户端错误,找不到资源,以下之一:
– 没有这样的容器 (container
id
不存在)- 没有这样的文件或目录(路径不存在)
- 500 - 服务器错误
将文件或文件夹的存档提取到容器中的目录
PUT /containers/(id or name)/archive
将要提取的 tar 存档上传到容器文件系统中的路径id
.
查询参数:
path - 容器中目录的路径 将存档的内容提取到其中。必填。
如果不是绝对路径,则它是相对于容器的根目录的。 path 资源必须存在。
noOverwriteDirNonDir - 如果为“1”、“true”或“True”,则为错误 如果解压缩给定内容将导致现有目录 替换为非目录,反之亦然。
请求示例:
PUT /v1.24/containers/8cce319429b2/archive?path=/vol1 HTTP/1.1
Content-Type: application/x-tar
{% raw %}
{{ TAR STREAM }}
{% endraw %}
响应示例:
HTTP/1.1 200 OK
状态代码:
- 200 – 已成功提取内容
- 400 - 客户端错误、参数错误、JSON 响应正文中的详细信息,以下之一:
- 必须指定 path 参数(path 不能为空)
- 不是目录(path 应该是一个目录,但作为一个文件存在)
- 无法使用非目录覆盖现有目录 (如果 noOverwriteDirNonDir)
- 无法使用 directory 覆盖现有的非目录 (如果 noOverwriteDirNonDir)
- 403 - 客户端错误、权限被拒绝、卷 或容器 rootfs 标记为只读。
- 404 - 客户端错误,找不到资源,以下之一:
– 没有这样的容器 (container
id
不存在)- 没有这样的文件或目录(path 资源不存在)
- 500 – 服务器错误
3.2 图片
列出图片
GET /images/json
请求示例:
GET /v1.24/images/json?all=0 HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"RepoTags": [
"ubuntu:12.04",
"ubuntu:precise",
"ubuntu:latest"
],
"Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c",
"Created": 1365714795,
"Size": 131506275,
"VirtualSize": 131506275,
"Labels": {}
},
{
"RepoTags": [
"ubuntu:12.10",
"ubuntu:quantal"
],
"ParentId": "27cf784147099545",
"Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc",
"Created": 1364102658,
"Size": 24653,
"VirtualSize": 180116135,
"Labels": {
"com.example.version": "v1"
}
}
]
示例请求,包含摘要信息:
GET /v1.24/images/json?digests=1 HTTP/1.1
示例响应,包含摘要信息:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"Created": 1420064636,
"Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125",
"ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2",
"RepoDigests": [
"localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"
],
"RepoTags": [
"localhost:5000/test/busybox:latest",
"playdate:latest"
],
"Size": 0,
"VirtualSize": 2429728,
"Labels": {}
}
]
响应显示单个镜像Id
关联两个存储库
(RepoTags
):localhost:5000/test/busybox
:和playdate
.调用方可以使用
以下任一RepoTags
值localhost:5000/test/busybox:latest
或playdate:latest
以引用镜像。
您还可以使用RepoDigests
值来引用镜像。在此响应中,
该数组只有一个引用,即对localhost:5000/test/busybox
存储 库;这playdate
repository 没有
消化。您可以使用以下值引用此摘要:localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...
请参阅docker run
和docker build
Digest 和 Tag 示例的命令
命令行上的引用。
查询参数:
- all – 1/True/true 或 0/False/false,默认为 false
- filters – 要在 images 列表中处理的筛选条件的 JSON 编码值 (map[string][]string)。可用筛选器:
dangling=true
label=key
或label="key=value"
镜像标签before
=(<image-name>[:<tag>]
,<image id>
或<image@digest>
)since
=(<image-name>[:<tag>]
,<image id>
或<image@digest>
)- filter - 仅返回具有指定名称的镜像
从 Dockerfile 构建镜像
POST /build
从 Dockerfile 构建镜像
请求示例:
POST /v1.24/build HTTP/1.1
Content-Type: application/x-tar
{% raw %}
{{ TAR STREAM }}
{% endraw %}
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{"stream": "Step 1/5..."}
{"stream": "..."}
{"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}}
输入流必须是tar
存档
以下算法:identity
(无压缩)、gzip
,bzip2
,xz
.
存档必须包含一个构建说明文件,通常称为Dockerfile
在存档的根目录下。这dockerfile
parameter 可以是
用于指定不同的构建说明文件。为此,其值必须为
要使用的备用生成说明文件的路径。
存档可能包含任意数量的其他文件, ,这些 API 可以在构建上下文中访问(请参阅 ADD 构建 命令)。
Docker 守护程序对Dockerfile
以前
启动构建,如果语法不正确,则返回错误。然后
每条指令逐个运行,直到输出新镜像的 ID。
如果客户端通过退出断开连接,则会取消构建 或被杀。
查询参数:
- dockerfile - 构建上下文中
Dockerfile
.这是 如果 ignoredremote
并指向外部Dockerfile
. - t – 要应用于
name:tag
格式。 如果省略tag
默认的latest
value 的值。 您可以提供一个或多个t
参数。 - remote – Git 存储库 URI 或 HTTP/HTTPS 上下文 URI。如果
URI 指向单个文本文件,则文件的内容将放入
一个名为
Dockerfile
并且镜像是从该文件构建的。如果 URI 指向一个 tarball,该文件由守护进程下载,并且 其中的内容用作构建的上下文。如果 URI 指向 tarball 和dockerfile
parameter 的 tarball 内必须有一个具有相应路径的文件。 - q – 禁止显示详细的生成输出。
- nocache – 构建镜像时不要使用缓存。
- pull - 即使本地存在较旧的镜像,也尝试提取镜像。
- rm - 在成功构建后删除中间容器(默认行为)。
- forcerm - 始终删除中间容器(包括
rm
). - memory - 设置构建的内存限制。
- memswap - 总内存(内存 + 交换),
-1
以启用无限交换。 - cpushares - CPU 份额(相对权重)。
- cpusetcpus - 允许执行的 CPU(例如
0-3
,0,1
). - cpuperiod - CPU 周期的长度(以微秒为单位)。
- cpuquota - 容器在一个 CPU 周期内可以获得的 CPU 时间微秒数。
- buildargs – 构建时变量的字符串对的 JSON 映射。用户通过
这些值。Docker 使用
buildargs
作为环境 context 的命令,通过 Dockerfile 的RUN
指令或 for 变量扩展。这不适用于 传递 secret 值。阅读有关 buildargs 指令的更多信息 - shmsize - 大小
/dev/shm
以字节为单位。大小必须大于 0。如果省略,系统将使用 64MB。 - labels – 要在镜像上设置的标签的字符串对的 JSON 映射。
请求标头:
Content-type – 设置为
"application/x-tar"
.X-Registry-Config – base64-url 安全编码的注册表身份验证配置 JSON 对象,其结构如下:
{ "docker.example.com": { "username": "janedoe", "password": "hunter2" }, "https://index.docker.io/v1/": { "username": "mobydock", "password": "conta1n3rize14" } }
此对象将 registry 的主机名映射到包含 该注册表的 “username” 和 “password” 来获取。多个注册管理机构可以 指定,因为构建可能基于需要 authentication 从任意注册表中提取。仅注册表 域名(如果不是默认的 “443”,则为 port)。然而 (出于遗留原因)“官方”Docker, Inc. 托管注册表必须 甚至使用 “https://” 前缀和 “/v1/” 后缀指定 尽管 Docker 更喜欢使用 v2 注册表 API。
状态代码:
- 200 – 无错误
- 500 – 服务器错误
创建镜像
POST /images/create
通过从注册表中提取镜像或导入镜像来创建镜像
请求示例:
POST /v1.24/images/create?fromImage=busybox&tag=latest HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{"status": "Pulling..."}
{"status": "Pulling", "progress": "1 B/ 100 B", "progressDetail": {"current": 1, "total": 100}}
{"error": "Invalid..."}
...
使用此终端节点从 registry 中提取镜像时,X-Registry-Auth
header 可用于包含
base64 编码的 AuthConfig 对象。
查询参数:
- fromImage – 要拉取的镜像的名称。名称可以包含标记或 消化。此参数只能在拉取镜像时使用。 如果 HTTP 连接已关闭,则拉取将被取消。
- fromSrc – 要导入的源。该值可以是镜像从中获取的 URL
或从请求正文中读取镜像。
此参数只能在导入镜像时使用。
-
- repo – 导入镜像时为镜像指定的存储库名称。 存储库可能包含标签。此参数只能在导入时使用 镜像。
- tag (标签) – 标签或摘要。如果在拉取镜像时为空,则会导致所有标签 以拉取给定的镜像。
请求标头:
X-Registry-Auth – base64 编码的 AuthConfig 对象,包含登录信息或令牌
基于凭据的登录:
{ “username”: “jdoe”, //用户名 “password”: “秘密”, “电子邮件”: “jdoe@acme.com” } ```
基于 Token 的登录:
{ “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 中使用。这将复制命令行的 flow。
如果 HTTP 连接已关闭,则推送将被取消。
请求示例:
POST /v1.24/images/registry.acme.com:5000/test/push HTTP/1.1
查询参数:
- tag (标签) – 要与注册表上的镜像关联的标签。这是可选的。
请求标头:
X-Registry-Auth – base64 编码的 AuthConfig 对象,包含登录信息或令牌
基于凭据的登录:
{ “username”: “jdoe”, //用户名 “password”: “秘密”, “email”: “jdoe@acme.com”, } ```
基于身份令牌的登录:
{ “identitytoken”: “9cbaf023786cd7...” } ```
状态代码:
- 200 – 无错误
- 404 – 没有这样的镜像
- 500 – 服务器错误
将镜像标记到存储库中
POST /images/(name)/tag
标记镜像name
导入到存储库中
请求示例:
POST /v1.24/images/test/tag?repo=myrepo&tag=v42 HTTP/1.1
响应示例:
HTTP/1.1 201 Created
查询参数:
- repo – 要在其中标记的存储库
- tag - 新标签名称
状态代码:
- 201 – 无错误
- 400 – 参数错误
- 404 – 没有这样的镜像
- 409 – 冲突
- 500 – 服务器错误
移除图片
DELETE /images/(name)
删除镜像name
从文件系统
请求示例:
DELETE /v1.24/images/test HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-type: application/json
[
{"Untagged": "3e2f21a89f"},
{"Deleted": "3e2f21a89f"},
{"Deleted": "53b4f83ac9"}
]
查询参数:
- force – 1/True/true 或 0/False/false,默认 false
- noprune – 1/True/true 或 0/False/false,默认为 false
状态代码:
- 200 – 无错误
- 404 – 没有这样的镜像
- 409 – 冲突
- 500 – 服务器错误
搜索图片
GET /images/search
在 Docker Hub 上搜索镜像。
注意: 响应键已从 API v1.6 更改,以反映 JSON 由 Registry 服务器发送到 Docker 守护程序的请求。
请求示例:
GET /v1.24/images/search?term=sshd HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"description": "",
"is_official": false,
"is_automated": false,
"name": "wma55/u1210sshd",
"star_count": 0
},
{
"description": "",
"is_official": false,
"is_automated": false,
"name": "jdswinbank/sshd",
"star_count": 0
},
{
"description": "",
"is_official": false,
"is_automated": false,
"name": "vgauthier/sshd",
"star_count": 0
}
...
]
查询参数:
- term – 要搜索的术语
- limit – 返回的最大搜索结果数
- filters – 要在 images 列表中处理的筛选条件的 JSON 编码值 (map[string][]string)。可用筛选器:
stars=<number>
is-automated=(true|false)
is-official=(true|false)
状态代码:
- 200 – 无错误
- 500 – 服务器错误
3.3 其他
检查身份验证配置
POST /auth
验证注册表的凭据并获取身份令牌, 如果可用,用于在没有密码的情况下访问注册表。
请求示例:
POST /v1.24/auth HTTP/1.1
Content-Type: application/json
Content-Length: 12345
{
"username": "hannibal",
"password": "xxxx",
"serveraddress": "https://index.docker.io/v1/"
}
响应示例:
HTTP/1.1 200 OK
{
"Status": "Login Succeeded",
"IdentityToken": "9cbaf023786cd7..."
}
状态代码:
- 200 – 无错误
- 204 – 无错误
- 500 – 服务器错误
显示系统范围的信息
GET /info
显示系统范围的信息
请求示例:
GET /v1.24/info HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"Architecture": "x86_64",
"ClusterStore": "etcd://localhost:2379",
"CgroupDriver": "cgroupfs",
"Containers": 11,
"ContainersRunning": 7,
"ContainersStopped": 3,
"ContainersPaused": 1,
"CpuCfsPeriod": true,
"CpuCfsQuota": true,
"Debug": false,
"DockerRootDir": "/var/lib/docker",
"Driver": "btrfs",
"DriverStatus": [[""]],
"ExperimentalBuild": false,
"HttpProxy": "http://test:test@localhost:8080",
"HttpsProxy": "https://test:test@localhost:8080",
"ID": "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS",
"IPv4Forwarding": true,
"Images": 16,
"IndexServerAddress": "https://index.docker.io/v1/",
"InitPath": "/usr/bin/docker",
"InitSha1": "",
"KernelMemory": true,
"KernelVersion": "3.12.0-1-amd64",
"Labels": [
"storage=ssd"
],
"MemTotal": 2099236864,
"MemoryLimit": true,
"NCPU": 1,
"NEventsListener": 0,
"NFd": 11,
"NGoroutines": 21,
"Name": "prod-server-42",
"NoProxy": "9.81.1.160",
"OomKillDisable": true,
"OSType": "linux",
"OperatingSystem": "Boot2Docker",
"Plugins": {
"Volume": [
"local"
],
"Network": [
"null",
"host",
"bridge"
]
},
"RegistryConfig": {
"IndexConfigs": {
"docker.io": {
"Mirrors": null,
"Name": "docker.io",
"Official": true,
"Secure": true
}
},
"InsecureRegistryCIDRs": [
"127.0.0.0/8"
]
},
"SecurityOptions": [
"apparmor",
"seccomp",
"selinux"
],
"ServerVersion": "1.9.0",
"SwapLimit": false,
"SystemStatus": [["State", "Healthy"]],
"SystemTime": "2015-03-10T11:11:23.730591467-07:00"
}
状态代码:
- 200 – 无错误
- 500 – 服务器错误
显示 docker 版本信息
GET /version
显示 docker 版本信息
请求示例:
GET /v1.24/version HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"Version": "1.12.0",
"Os": "linux",
"KernelVersion": "3.19.0-23-generic",
"GoVersion": "go1.6.3",
"GitCommit": "deadbee",
"Arch": "amd64",
"ApiVersion": "1.24",
"BuildTime": "2016-06-14T07:09:13.444803460+00:00",
"Experimental": true
}
状态代码:
- 200 – 无错误
- 500 – 服务器错误
Ping Docker 服务器
GET /_ping
Ping Docker 服务器
请求示例:
GET /v1.24/_ping HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: text/plain
OK
状态代码:
- 200 - 无错误
- 500 - 服务器错误
根据容器的更改创建新镜像
POST /commit
根据容器的更改创建新镜像
请求示例:
POST /v1.24/commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1
Content-Type: application/json
Content-Length: 12345
{
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": true,
"AttachStderr": true,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": null,
"Cmd": [
"date"
],
"Mounts": [
{
"Source": "/data",
"Destination": "/data",
"Mode": "ro,Z",
"RW": false
}
],
"Labels": {
"key1": "value1",
"key2": "value2"
},
"WorkingDir": "",
"NetworkDisabled": false,
"ExposedPorts": {
"22/tcp": {}
}
}
响应示例:
HTTP/1.1 201 Created
Content-Type: application/json
{"Id": "596069db4bf5"}
JSON 参数:
- config - 容器的配置
查询参数:
- container – 源容器
- repo – 存储库
- tag (标签) – 标签
- comment – 提交消息
- author – 作者(例如,“John Hannibal Smith < hannibal@a-team.com>")
- pause – 1/True/true 或 0/False/false,是否在提交前暂停容器
- changes – 提交时应用的 Dockerfile 说明
状态代码:
- 201 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
监控 Docker 的事件
GET /events
通过流式处理从 Docker 实时获取容器事件。
Docker 容器报告以下事件:
attach, commit, copy, create, destroy, detach, die, exec_create, exec_detach, exec_start, export, health_status, kill, oom, pause, rename, resize, restart, start, stop, top, unpause, update
Docker 镜像报告以下事件:
delete, import, load, pull, push, save, tag, untag
Docker 卷报告以下事件:
create, mount, unmount, destroy
Docker 网络报告以下事件:
create, connect, disconnect, destroy
Docker 守护程序报告以下事件:
reload
请求示例:
GET /v1.24/events?since=1374067924
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
Server: Docker/1.12.0 (linux)
Date: Fri, 29 Apr 2016 15:18:06 GMT
Transfer-Encoding: chunked
{
"status": "pull",
"id": "alpine:latest",
"Type": "image",
"Action": "pull",
"Actor": {
"ID": "alpine:latest",
"Attributes": {
"name": "alpine"
}
},
"time": 1461943101,
"timeNano": 1461943101301854122
}
{
"status": "create",
"id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"from": "alpine",
"Type": "container",
"Action": "create",
"Actor": {
"ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"Attributes": {
"com.example.some-label": "some-label-value",
"image": "alpine",
"name": "my-container"
}
},
"time": 1461943101,
"timeNano": 1461943101381709551
}
{
"status": "attach",
"id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"from": "alpine",
"Type": "container",
"Action": "attach",
"Actor": {
"ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"Attributes": {
"com.example.some-label": "some-label-value",
"image": "alpine",
"name": "my-container"
}
},
"time": 1461943101,
"timeNano": 1461943101383858412
}
{
"Type": "network",
"Action": "connect",
"Actor": {
"ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474",
"Attributes": {
"container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"name": "bridge",
"type": "bridge"
}
},
"time": 1461943101,
"timeNano": 1461943101394865557
}
{
"status": "start",
"id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"from": "alpine",
"Type": "container",
"Action": "start",
"Actor": {
"ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"Attributes": {
"com.example.some-label": "some-label-value",
"image": "alpine",
"name": "my-container"
}
},
"time": 1461943101,
"timeNano": 1461943101607533796
}
{
"status": "resize",
"id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"from": "alpine",
"Type": "container",
"Action": "resize",
"Actor": {
"ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"Attributes": {
"com.example.some-label": "some-label-value",
"height": "46",
"image": "alpine",
"name": "my-container",
"width": "204"
}
},
"time": 1461943101,
"timeNano": 1461943101610269268
}
{
"status": "die",
"id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"from": "alpine",
"Type": "container",
"Action": "die",
"Actor": {
"ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"Attributes": {
"com.example.some-label": "some-label-value",
"exitCode": "0",
"image": "alpine",
"name": "my-container"
}
},
"time": 1461943105,
"timeNano": 1461943105079144137
}
{
"Type": "network",
"Action": "disconnect",
"Actor": {
"ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474",
"Attributes": {
"container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"name": "bridge",
"type": "bridge"
}
},
"time": 1461943105,
"timeNano": 1461943105230860245
}
{
"status": "destroy",
"id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"from": "alpine",
"Type": "container",
"Action": "destroy",
"Actor": {
"ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
"Attributes": {
"com.example.some-label": "some-label-value",
"image": "alpine",
"name": "my-container"
}
},
"time": 1461943105,
"timeNano": 1461943105338056026
}
查询参数:
- since – 时间戳。显示自时间戳以来创建的所有事件,然后进行流
- until – 时间戳。显示在给定时间戳之前创建的事件并停止流式传输
- filters – 要在事件列表上处理的筛选条件的 json 编码值 (map[string][]string)。可用筛选器:
container=<string>
;-- 要过滤的容器event=<string>
;-- 要过滤的事件image=<string>
;-- 要筛选的镜像label=<string>
;-- 要筛选的镜像和容器标签type=<string>
;--也container
或image
或volume
或network
或daemon
volume=<string>
;-- 要筛选的音量network=<string>
;-- 要过滤的网络daemon=<string>
;-- 要过滤的守护进程名称或 ID
状态代码:
- 200 – 无错误
- 400 - 参数错误
- 500 – 服务器错误
获取包含存储库中所有镜像的 tarball
GET /images/(name)/get
获取包含指定存储库的所有镜像和元数据的 tarball
由name
.
如果name
是特定的名称和标签(例如 ubuntu:latest),则只有该镜像
(及其父级)返回。如果name
是镜像 ID,同样也只是
image(及其父级)返回 URL,但不包括
'repositories' 文件,因为没有引用镜像名称。
有关更多详细信息,请参阅 image tarball 格式。
示例请求
GET /v1.24/images/ubuntu/get
响应示例:
HTTP/1.1 200 OK
Content-Type: application/x-tar
Binary data stream
状态代码:
- 200 – 无错误
- 500 – 服务器错误
获取包含所有镜像的 tarball
GET /images/get
获取包含一个或多个存储库的所有镜像和元数据的 tarball。
对于names
parameter:如果是特定的名称和标签(例如ubuntu:latest
),则仅返回该镜像(及其父级);如果是
一个镜像 ID,同样,仅返回该镜像(及其父级),并在那里
将不在此镜像 ID 的“repositories”文件中引用任何名称。
有关更多详细信息,请参阅 image tarball 格式。
示例请求
GET /v1.24/images/get?names=myname%2Fmyapp%3Alatest&names=busybox
响应示例:
HTTP/1.1 200 OK
Content-Type: application/x-tar
Binary data stream
状态代码:
- 200 – 无错误
- 500 – 服务器错误
将带有一组镜像和标签的 tarball 加载到 docker 中
POST /images/load
将一组镜像和标签加载到 Docker 存储库中。 有关更多详细信息,请参阅 image tarball 格式。
示例请求
POST /v1.24/images/load
Content-Type: application/x-tar
Content-Length: 12345
Tarball in body
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
{"status":"Loading layer","progressDetail":{"current":32768,"total":1292800},"progress":"[= ] 32.77 kB/1.293 MB","id":"8ac8bfaff55a"}
{"status":"Loading layer","progressDetail":{"current":65536,"total":1292800},"progress":"[== ] 65.54 kB/1.293 MB","id":"8ac8bfaff55a"}
{"status":"Loading layer","progressDetail":{"current":98304,"total":1292800},"progress":"[=== ] 98.3 kB/1.293 MB","id":"8ac8bfaff55a"}
{"status":"Loading layer","progressDetail":{"current":131072,"total":1292800},"progress":"[===== ] 131.1 kB/1.293 MB","id":"8ac8bfaff55a"}
...
{"stream":"Loaded image: busybox:latest\n"}
响应示例:
如果 “quiet” 查询参数设置为true
/ 1
(?quiet=1
)、进度
details 将被禁止,并且仅在
作完成。
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
{"stream":"Loaded image: busybox:latest\n"}
查询参数:
- quiet – 布尔值,在加载期间隐藏进度详细信息。违约
自
0
/false
如果省略。
状态代码:
- 200 – 无错误
- 500 – 服务器错误
镜像 tarball 格式
镜像 tarball 的每个镜像层包含一个目录(使用其长 ID 命名), 每个都包含以下文件:
VERSION
:现在1.0
- 文件格式版本json
:详细的图层信息,类似于docker inspect layer_id
layer.tar
:包含此层中文件系统更改的 tarfile
这layer.tar
文件包含aufs
风格.wh..wh.aufs
文件和目录
用于存储属性更改和删除。
如果 tarball 定义了一个仓库,则 tarball 还应包含一个repositories
文件位于
包含映射到层 ID 的存储库和标记名称列表的根。
{"hello-world":
{"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"}
}
Exec Create
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 进程。
- User - 一个字符串值,指定要运行的用户和组(可选)
容器内的 exec 进程。Format 是以下之一:
"user"
,"user:group"
,"uid"
或"uid:gid"
.
状态代码:
- 201 – 无错误
- 404 – 没有这样的容器
- 409 - 容器已暂停
- 500 - 服务器错误
执行启动
POST /exec/(id)/start
启动先前的设置exec
实例id
.如果detach
为 true,则此 API
在启动exec
命令。否则,此 API 会设置
交互式会话与exec
命令。
请求示例:
POST /v1.24/exec/e90e34656806/start HTTP/1.1
Content-Type: application/json
Content-Length: 12345
{
"Detach": false,
"Tty": false
}
响应示例:
HTTP/1.1 200 OK
Content-Type: application/vnd.docker.raw-stream
{% raw %}
{{ STREAM }}
{% endraw %}
JSON 参数:
- Detach - 从
exec
命令。 - Tty - 分配伪 TTY 的布尔值。
状态代码:
- 200 – 无错误
- 404 – 没有这样的 exec 实例
- 409 - 容器已暂停
流详细信息:
类似于POST /containers/(id or name)/attach
应用程序接口
Exec 调整大小
POST /exec/(id)/resize
调整tty
会话由exec
命令id
.单位为字符数。
此 API 仅在以下情况下有效tty
作为创建和启动exec
命令。
请求示例:
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
查询参数:
- h – 高度
tty
会期 - 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": []
}
查询参数:
- filters - 过滤器的 JSON 编码值(一个
map[string][]string
) 进行处理。可用筛选器: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 参数:
- Name (名称) - 新卷的名称。如果未指定,Docker 将生成一个名称。
- Driver — 要使用的卷驱动程序的名称。默认为
local
对于名称。 - DriverOpts - 驱动程序选项和值的映射。这些选项包括 直接传递给驱动程序,并且特定于驱动程序。
- Labels — 要在卷上设置的标签,指定为映射:
{"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 响应中可以返回以下字段。空字段,或 卷驱动程序不支持的字段可以在 响应。
- Name — 卷的名称。
- Driver — 卷使用的卷驱动程序的名称。
- Mountpoint - 卷在主机上的挂载路径。
- Status (状态) - 有关卷的低级详细信息,由卷驱动程序提供。
详细信息以包含键/值对的 map 形式返回:
{"key":"value","key2":"value2"}
. 这Status
字段是可选的,如果卷驱动程序不是可选的,则省略该字段 支持此功能。 - Labels — 在卷上设置的标签,指定为映射:
{"key":"value","key2":"value2"}
. - 范围 - 范围 描述卷存在的级别,可以是以下级别之一
global
对于集群范围或local
用于机器级别。默认值为local
.
删除卷
DELETE /volumes/(name)
指示驱动程序删除卷 (name
).
请求示例:
DELETE /v1.24/volumes/tardis HTTP/1.1
响应示例:
HTTP/1.1 204 No Content
状态代码:
- 204 - 无错误
- 404 - 没有这样的卷或卷驱动程序
- 409 - 卷正在使用中,无法删除
- 500 - 服务器错误
3.5 网络
列出网络
GET /networks
请求示例:
GET /v1.24/networks?filters={"type":{"custom":true}} HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"Name": "bridge",
"Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"Internal": false,
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "172.17.0.0/16"
}
]
},
"Containers": {
"39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": {
"EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
}
},
{
"Name": "none",
"Id": "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794",
"Scope": "local",
"Driver": "null",
"EnableIPv6": false,
"Internal": false,
"IPAM": {
"Driver": "default",
"Config": []
},
"Containers": {},
"Options": {}
},
{
"Name": "host",
"Id": "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e",
"Scope": "local",
"Driver": "host",
"EnableIPv6": false,
"Internal": false,
"IPAM": {
"Driver": "default",
"Config": []
},
"Containers": {},
"Options": {}
}
]
查询参数:
- filters - JSON 编码的网络列表过滤器。filter 值是以下值之一:
driver=<driver-name>
匹配网络的驱动程序。id=<network-id>
匹配网络 ID 的全部或部分。label=<key>
或label=<key>=<value>
网络标签中。name=<network-name>
匹配网络名称的全部或部分。type=["custom"|"builtin"]
按类型筛选网络。这custom
keyword 返回所有用户定义的网络。
状态代码:
- 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 参数:
- Name (名称) - 新网络的名称。这是必填字段
- CheckDuplicate - 请求守护程序检查具有相同名称的网络。默认为
false
. 由于 Network 主要基于随机 ID 而不是名称进行键控,因此 Network Name 严格来说是 network 的用户友好别名 ,则无法保证检查重复项。 此参数 CheckDuplicate 用于尽最大努力检查任何网络 具有相同的名称,但不能保证捕获所有名称冲突。 - Driver (驱动程序) - 要使用的网络驱动程序插件的名称。默认为
bridge
司机 - Internal - 限制外部对网络的访问
- IPAM - 网络的可选自定义 IP 方案
- Driver — 要使用的 IPAM 驱动程序的名称。默认为
default
司机 - 配置 - 指定为映射的 IPAM 配置选项列表:
{"Subnet": <CIDR>, "IPRange": <CIDR>, "Gateway": <IP address>, "AuxAddress": <device_name:IP address>}
- 选项 - 特定于驱动程序的选项,指定为映射:
{"option":"value" [,"option2":"value2"]}
- Driver — 要使用的 IPAM 驱动程序的名称。默认为
- EnableIPv6 - 在网络上启用 IPv6
- 选项 - 驱动程序使用的网络特定选项
- Labels (标签) - 要在网络上设置的标签,指定为映射:
{"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 - Swarm 范围网络不支持作
- 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 - Swarm 范围网络不支持作
- 404 - 找不到网络或容器
- 500 - 内部服务器错误
JSON 参数:
- 容器 - 要断开与网络连接的容器 ID/名称
- Force - 强制容器断开与网络的连接
删除网络
DELETE /networks/(id or name)
指示驱动程序删除网络 (id
).
请求示例:
DELETE /v1.24/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30 HTTP/1.1
响应示例:
HTTP/1.1 204 No Content
状态代码:
- 204 - 无错误
- 403 - 预定义网络不支持作
- 404 - 没有这样的网络
- 500 - 服务器错误
3.6 插件(实验性)
列出插件
GET /plugins
返回有关已安装插件的信息。
请求示例:
GET /v1.24/plugins HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"Id": "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078",
"Name": "tiborvass/no-remove",
"Tag": "latest",
"Active": true,
"Config": {
"Mounts": [
{
"Name": "",
"Description": "",
"Settable": null,
"Source": "/data",
"Destination": "/data",
"Type": "bind",
"Options": [
"shared",
"rbind"
]
},
{
"Name": "",
"Description": "",
"Settable": null,
"Source": null,
"Destination": "/foobar",
"Type": "tmpfs",
"Options": null
}
],
"Env": [
"DEBUG=1"
],
"Args": null,
"Devices": null
},
"Manifest": {
"ManifestVersion": "v0",
"Description": "A test plugin for Docker",
"Documentation": "https://docs.docker.com/engine/extend/plugins/",
"Interface": {
"Types": [
"docker.volumedriver/1.0"
],
"Socket": "plugins.sock"
},
"Entrypoint": [
"plugin-no-remove",
"/data"
],
"Workdir": "",
"User": {
},
"Network": {
"Type": "host"
},
"Capabilities": null,
"Mounts": [
{
"Name": "",
"Description": "",
"Settable": null,
"Source": "/data",
"Destination": "/data",
"Type": "bind",
"Options": [
"shared",
"rbind"
]
},
{
"Name": "",
"Description": "",
"Settable": null,
"Source": null,
"Destination": "/foobar",
"Type": "tmpfs",
"Options": null
}
],
"Devices": [
{
"Name": "device",
"Description": "a host device to mount",
"Settable": null,
"Path": "/dev/cpu_dma_latency"
}
],
"Env": [
{
"Name": "DEBUG",
"Description": "If set, prints debug messages",
"Settable": null,
"Value": "1"
}
],
"Args": {
"Name": "args",
"Description": "command line arguments",
"Settable": null,
"Value": [
]
}
}
}
]
状态代码:
- 200 - 无错误
- 500 - 服务器错误
安装插件
POST /plugins/pull?name=<plugin name>
拉取并安装插件。插件安装完成后,即可启用
使用POST /plugins/(plugin name)/enable
端点.
请求示例:
POST /v1.24/plugins/pull?name=tiborvass/no-remove:latest HTTP/1.1
这:latest
tag 是可选的,如果省略,则用作 default。使用
此端点从注册表中提取插件,则X-Registry-Auth
页眉
可用于包含 base64 编码的 AuthConfig 对象。请参阅创建
有关更多详细信息,请参阅镜像部分。
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 175
[
{
"Name": "network",
"Description": "",
"Value": [
"host"
]
},
{
"Name": "mount",
"Description": "",
"Value": [
"/data"
]
},
{
"Name": "device",
"Description": "",
"Value": [
"/dev/cpu_dma_latency"
]
}
]
查询参数:
- name - 要拉取的插件的名称。该名称可以包含标签或摘要。 此参数为必填项。
状态代码:
- 200 - 无错误
- 500 - 解析引用时出错/存储库/标记无效:存储库 name 必须至少有一个组件
- 500 - 插件已存在
检查插件
GET /plugins/(plugin name)
返回有关已安装插件的详细信息。
请求示例:
GET /v1.24/plugins/tiborvass/no-remove:latest HTTP/1.1
这:latest
tag 是可选的,如果省略,则用作 default。
响应示例:
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
tag 是可选的,如果省略,则用作 default。
响应示例:
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
tag 是可选的,如果省略,则用作 default。
响应示例:
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
tag 是可选的,如果省略,则用作 default。
响应示例:
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8
状态代码:
- 200 - 无错误
- 404 - 未安装插件
- 500 - 插件处于活动状态
3.7 节点
注意:节点作要求引擎成为 swarm 的一部分。
列出节点
GET /nodes
列出节点
请求示例:
GET /v1.24/nodes HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"ID": "24ifsmvkjbyhk",
"Version": {
"Index": 8
},
"CreatedAt": "2016-06-07T20:31:11.853781916Z",
"UpdatedAt": "2016-06-07T20:31:11.999868824Z",
"Spec": {
"Name": "my-node",
"Role": "manager",
"Availability": "active"
"Labels": {
"foo": "bar"
}
},
"Description": {
"Hostname": "bf3067039e47",
"Platform": {
"Architecture": "x86_64",
"OS": "linux"
},
"Resources": {
"NanoCPUs": 4000000000,
"MemoryBytes": 8272408576
},
"Engine": {
"EngineVersion": "1.12.0",
"Labels": {
"foo": "bar",
}
"Plugins": [
{
"Type": "Volume",
"Name": "local"
},
{
"Type": "Network",
"Name": "bridge"
}
{
"Type": "Network",
"Name": "null"
}
{
"Type": "Network",
"Name": "overlay"
}
]
}
},
"Status": {
"State": "ready"
},
"ManagerStatus": {
"Leader": true,
"Reachability": "reachable",
"Addr": "172.17.0.2:2377""
}
}
]
查询参数:
- filters – 筛选条件的 JSON 编码值 (一个
map[string][]string
) 在 nodes 列表。可用筛选器: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)
从 swarm 中删除节点。
请求示例:
DELETE /v1.24/nodes/24ifsmvkjbyhk HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8
查询参数:
- force - 1/True/true 或 0/False/false,强制从集群中删除节点。
违约
false
.
状态代码:
- 200 – 无错误
- 404 – 没有这样的节点
- 406 — 节点不是群的一部分
- 500 – 服务器错误
更新节点
POST /nodes/(id)/update
更新节点。
的POST
request 是新的NodeSpec
和
覆盖当前NodeSpec
对于指定的节点。
如果Availability
或Role
被省略,这将返回一个
错误。省略的任何其他字段都会将当前值重置为
空值或默认的集群范围值。
示例请求
POST /v1.24/nodes/24ifsmvkjbyhk/update?version=8 HTTP/1.1
Content-Type: application/json
Content-Length: 12345
{
"Availability": "active",
"Name": "node-name",
"Role": "manager",
"Labels": {
"foo": "bar"
}
}
响应示例:
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8
查询参数:
- version – 正在更新的节点对象的版本号。这是 以避免写入冲突。
JSON 参数:
- Annotations (注释) – 与节点关联的可选 medata。
- Name (名称) – 用户定义的节点名称。
- Labels (标签) – 要与节点关联的标签映射(例如
{"key":"value", "key2":"value2"}
).
- Role - 节点的角色 (worker|manager)。
- Availability - 节点的可用性 (active|pause|drain)。
状态代码:
- 200 – 无错误
- 404 – 没有这样的节点
- 406 — 节点不是群的一部分
- 500 – 服务器错误
3.8 虫群
检查 swarm
GET /swarm
检查 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 - 严重错误
初始化新的 swarm
POST /swarm/init
初始化新的 swarm。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 – 节点已是 Swarm 的一部分
- 500 - 服务器错误
JSON 参数:
- ListenAddr – 用于管理器间通信以及确定
用于 VXLAN 隧道端点 (VTEP) 的网络接口。这可以是
表单中的地址/端口组合
192.168.1.1:4567
或后跟端口的接口 number 的eth0:4567
.如果省略端口号,则默认 swarm 侦听端口为 使用。 - AdvertiseAddr – 向其他节点公布的外部可访问地址。这可以是
格式中的地址/端口组合
192.168.1.1:4567
或后跟端口的接口 number 的eth0:4567
.如果省略端口号,则监听 address 的 URL 中。如果AdvertiseAddr
未指定,则当 可能。 - ForceNewCluster – 强制创建新群。
- Spec (规格) – 新群的配置设置。
- Orchestration (编排) – 群的编排方面的配置设置。
- TaskHistoryRetentionLimit – 存储的任务历史记录的最大数量。
- Raft – Raft 相关配置。
- SnapshotInterval – 快照之间的日志条目数。
- KeepOldSnapshots – 当前快照之后要保留的快照数。
- LogEntriesForSlowFollowers – 要保留以减慢同步速度的日志条目数 创建快照后的 followers。
- HeartbeatTick – 每个检测信号之间的时钟周期数 (以秒为单位)。
- ElectionTick – 在没有领导者的情况下触发新 选举。
- Dispatcher (调度程序) – 任务调度程序的配置设置。
- HeartbeatPeriod (心跳Period) – 代理向调度程序发送检测信号的延迟。
- CAConfig – 证书颁发机构配置。
- NodeCertExpiry – 节点证书的自动过期。
- ExternalCA - 用于将签名请求转发到外部的配置
证书颁发机构。
- Protocol — 用于与外部 CA 通信的协议 (目前仅支持 “cfssl”)。
- URL - 应将证书签名请求发送到的 URL。
- 选项 - 具有已解释的键/值对的对象 作为外部 CA 驱动程序的协议特定选项。
- Orchestration (编排) – 群的编排方面的配置设置。
加入现有 swarm
POST /swarm/join
加入现有 swarm
请求示例:
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 – 节点已是 Swarm 的一部分
- 500 - 服务器错误
JSON 参数:
- ListenAddr – 如果节点被提升为 管理器,以及确定用于 VXLAN 隧道端点 (VTEP) 的网络接口。
- AdvertiseAddr – 向其他节点公布的外部可访问地址。这可以是
格式中的地址/端口组合
192.168.1.1:4567
或后跟端口的接口 number 的eth0:4567
.如果省略端口号,则监听 address 的 URL 中。如果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
查询参数:
- force - 布尔值 (0/1, false/true)。强制离开 swarm,即使这是最后一个 manager 或它会破坏集群。
状态代码:
- 200 – 无错误
- 406 — 节点不是群的一部分
- 500 - 服务器错误
更新 swarm
POST /swarm/update
更新 swarm
请求示例:
POST /v1.24/swarm/update HTTP/1.1
Content-Length: 12345
{
"Name": "default",
"Orchestration": {
"TaskHistoryRetentionLimit": 10
},
"Raft": {
"SnapshotInterval": 10000,
"LogEntriesForSlowFollowers": 500,
"HeartbeatTick": 1,
"ElectionTick": 3
},
"Dispatcher": {
"HeartbeatPeriod": 5000000000
},
"CAConfig": {
"NodeCertExpiry": 7776000000000000
},
"JoinTokens": {
"Worker": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx",
"Manager": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2"
}
}
响应示例:
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8
查询参数:
- version – 正在更新的 swarm 对象的版本号。这是 以避免写入冲突。
- rotateWorkerToken - 设置为
true
(或1
) 以轮换 worker join 令牌。 - rotateManagerToken - 设置为
true
(或1
) 以轮换 Manager Join 令牌。
状态代码:
- 200 – 无错误
- 400 – 参数错误
- 406 — 节点不是群的一部分
- 500 - 服务器错误
JSON 参数:
- Orchestration (编排) – 群的编排方面的配置设置。
- TaskHistoryRetentionLimit – 存储的任务历史记录的最大数量。
- Raft – Raft 相关配置。
- SnapshotInterval – 快照之间的日志条目数。
- KeepOldSnapshots – 当前快照之后要保留的快照数。
- LogEntriesForSlowFollowers – 要保留以减慢同步速度的日志条目数 创建快照后的 followers。
- HeartbeatTick – 每个检测信号之间的时钟周期数 (以秒为单位)。
- ElectionTick – 在没有领导者的情况下触发新 选举。
- Dispatcher (调度程序) – 任务调度程序的配置设置。
- HeartbeatPeriod (心跳Period) – 代理向调度程序发送检测信号的延迟。
- CAConfig – CA 配置。
- NodeCertExpiry – 节点证书的自动过期。
- ExternalCA - 用于将签名请求转发到外部的配置
证书颁发机构。
- Protocol — 用于与外部 CA 通信的协议 (目前仅支持 “cfssl”)。
- URL - 应将证书签名请求发送到的 URL。
- 选项 - 具有已解释的键/值对的对象 作为外部 CA 驱动程序的协议特定选项。
- JoinTokens - 其他节点可用于加入群的令牌。
- Worker - 用于作为 worker 加入的令牌。
- Manager (经理) - 用于以 Manager 身份加入的令牌。
3.9 服务
注意:服务作需要首先成为 swarm 的一部分。
列出服务
GET /services
列出服务
请求示例:
GET /v1.24/services HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"ID": "9mnpnzenvg8p8tdbtq4wvbkcz",
"Version": {
"Index": 19
},
"CreatedAt": "2016-06-07T21:05:51.880065305Z",
"UpdatedAt": "2016-06-07T21:07:29.962229872Z",
"Spec": {
"Name": "hopeful_cori",
"TaskTemplate": {
"ContainerSpec": {
"Image": "redis"
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"MaxAttempts": 0
},
"Placement": {
"Constraints": [
"node.role == worker"
]
}
},
"Mode": {
"Replicated": {
"Replicas": 1
}
},
"UpdateConfig": {
"Parallelism": 1,
"FailureAction": "pause"
},
"EndpointSpec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 6379,
"PublishedPort": 30001
}
]
}
},
"Endpoint": {
"Spec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 6379,
"PublishedPort": 30001
}
]
},
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 6379,
"PublishedPort": 30001
}
],
"VirtualIPs": [
{
"NetworkID": "4qvuz4ko70xaltuqbt8956gd1",
"Addr": "10.255.0.2/16"
},
{
"NetworkID": "4qvuz4ko70xaltuqbt8956gd1",
"Addr": "10.255.0.3/16"
}
]
}
}
]
查询参数:
- filters – 筛选条件的 JSON 编码值 (一个
map[string][]string
) 在 services 列表。可用筛选器:id=<service id>
label=<service label>
name=<service name>
状态代码:
- 200 – 无错误
- 406 — 节点不是群的一部分
- 500 – 服务器错误
创建服务
POST /services/create
创建服务。使用此终端节点创建使用私有
存储库中,使用X-Registry-Auth
header 必须用于
包括 base64 编码的 AuthConfig 对象。请参阅创建
image 部分了解更多详情。
请求示例:
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 参数:
- Name (名称) – 用户定义的服务名称。
- Labels – 要与服务关联的标签映射(例如
{"key":"value", "key2":"value2"}
). - TaskTemplate – 作为新服务的一部分启动的任务的规范。
- ContainerSpec - 作为此任务的一部分启动的容器的容器设置。
- Image – 一个字符串,指定要用于容器的镜像名称。
- Command (命令) – 要在镜像中运行的命令。
- Args – 命令的参数。
- Env – 环境变量列表,格式为
["VAR=value"[,"VAR2=value2"]]
. - Dir – 一个字符串,用于指定要运行命令的工作目录。
- User (用户) – 一个字符串值,用于指定容器内的用户。
- Labels – 要与服务关联的标签映射(例如
{"key":"value", "key2":"value2"}
). - Mounts – 要添加到容器的挂载的规范
作为服务的一部分创建。
- Target (目标) – Container path(容器路径)。
- Source (源) – 挂载源(例如卷名称、主机路径)。
- Type (类型) – 挂载类型 (
bind
或volume
). - ReadOnly – 一个布尔值,指示挂载是否应为只读。
- BindOptions - 的可选配置
bind
类型。- Propagation – 一种传播模式,其值为
[r]private
,[r]shared
或[r]slave
.
- Propagation – 一种传播模式,其值为
- VolumeOptions – 的可选配置
volume
类型。- NoCopy – 一个布尔值,指示交易量是否应为 填充了来自目标的数据。(默认为 false)
- Labels (标签) – 用户定义的卷名称和标签。
- DriverConfig – 特定于驱动程序的选项的映射。
- Name — 用于创建卷的驱动程序的名称。
- 选项 - 驱动程序特定选项的键/值映射。
- StopGracePeriod – 等待容器终止之前的时间量 强行杀死它。
- LogDriver - 作为
服务。
- Name — 要使用的日志记录驱动程序的名称 (
json-file
,syslog
,journald
,gelf
,fluentd
,awslogs
,splunk
,etwlogs
,none
). - 选项 - 特定于驱动程序的选项。
- Name — 要使用的日志记录驱动程序的名称 (
- Resources (资源) – 适用于作为部分创建的每个单独容器的资源要求
的服务。
- Limits (限制) – 定义资源限制。
- NanoCPUs – CPU 限制(以 10 为单位)-9CPU 份额。
- MemoryBytes – 内存限制(以字节为单位)。
- Reservation (预留) – 定义资源预留。
- NanoCPUs – 以 10 为单位的 CPU 预留-9CPU 份额。
- MemoryBytes – 内存预留(以字节为单位)。
- Limits (限制) – 定义资源限制。
- RestartPolicy – 适用于创建的容器的重启策略的规范
作为此服务的一部分。
- Condition (条件) – 重启条件 (
none
,on-failure
或any
). - Delay (延迟) – 重启尝试之间的延迟。
- MaxAttempts – 在放弃之前重新启动给定容器的最大尝试次数(默认值 为 0,将被忽略)。
- Window (窗口) – Windows 是用于评估重启策略的时间窗口(默认值为 0,这是无界的)。
- Condition (条件) – 重启条件 (
- Placement (放置) – 对服务可以运行位置的限制。
- Constraints – 一组约束,例如
[ "node.role == manager" ]
.
- Constraints – 一组约束,例如
- ContainerSpec - 作为此任务的一部分启动的容器的容器设置。
- Mode (模式) – 服务的调度模式 (
replicated
或global
,默认为replicated
). - UpdateConfig – 服务的更新策略的规范。
- Parallelism – 一次迭代中要更新的最大任务数(0 表示无限制 parallelism) 的 Parallel Driven 的
- Delay (延迟) – 更新之间的时间量。
- FailureAction - 如果更新的任务无法运行或在
更新。值为
continue
和pause
.
- Networks (网络) – 要将服务附加到的网络名称或 ID 的数组。
- EndpointSpec – 可配置为访问服务并对服务进行负载均衡的属性。
- Mode (模式) – 用于内部负载均衡的解析模式
任务之间 (
vip
或dnsrr
).默认为vip
如果未提供。 - Ports (端口 ) – 可从中访问此服务的公开端口的列表
外部,以以下形式出现:
{"Protocol": <"tcp"|"udp">, "PublishedPort": <port>, "TargetPort": <port>}
. 只有在以下情况下才能提供端口vip
使用 Resolution Mode 进行解析。
- Mode (模式) – 用于内部负载均衡的解析模式
任务之间 (
请求标头:
- Content-type – 设置为
"application/json"
. - X-Registry-Auth – base64 编码的 AuthConfig 对象,包含 登录信息或令牌。请参阅 创建镜像 中以了解更多详细信息。
删除服务
DELETE /services/(id or name)
停止并删除服务id
请求示例:
DELETE /v1.24/services/16253994b7c4 HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8
状态代码:
- 200 – 无错误
- 404 – 无此服务
- 406 - 节点不是群的一部分
- 500 – 服务器错误
检查一个或多个服务
GET /services/(id or name)
返回有关服务的信息id
.
请求示例:
GET /v1.24/services/1cb4dnqcyx6m66g2t538x3rxha HTTP/1.1
响应示例:
{
"ID": "ak7w3gjqoa3kuz8xcpnyy0pvl",
"Version": {
"Index": 95
},
"CreatedAt": "2016-06-07T21:10:20.269723157Z",
"UpdatedAt": "2016-06-07T21:10:20.276301259Z",
"Spec": {
"Name": "redis",
"TaskTemplate": {
"ContainerSpec": {
"Image": "redis"
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"MaxAttempts": 0
},
"Placement": {}
},
"Mode": {
"Replicated": {
"Replicas": 1
}
},
"UpdateConfig": {
"Parallelism": 1,
"FailureAction": "pause"
},
"EndpointSpec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 6379,
"PublishedPort": 30001
}
]
}
},
"Endpoint": {
"Spec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 6379,
"PublishedPort": 30001
}
]
},
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 6379,
"PublishedPort": 30001
}
],
"VirtualIPs": [
{
"NetworkID": "4qvuz4ko70xaltuqbt8956gd1",
"Addr": "10.255.0.4/16"
}
]
}
}
状态代码:
- 200 – 无错误
- 404 – 无此服务
- 406 - 节点不是群的一部分
- 500 – 服务器错误
更新服务
POST /services/(id)/update
更新服务。使用此终端节点创建使用
private 仓库中,使用X-Registry-Auth
可以使用 header
更新为服务存储的身份验证信息。
标头包含一个 base64 编码的 AuthConfig 对象。请参阅创建
image 部分了解更多详情。
请求示例:
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 参数:
- Name (名称) – 用户定义的服务名称。请注意,不支持重命名服务。
- Labels – 要与服务关联的标签映射(例如
{"key":"value", "key2":"value2"}
). - TaskTemplate – 作为新服务的一部分启动的任务的规范。
- ContainerSpec - 作为此任务的一部分启动的容器的容器设置。
- Image – 一个字符串,指定要用于容器的镜像名称。
- Command (命令) – 要在镜像中运行的命令。
- Args – 命令的参数。
- Env – 环境变量列表,格式为
["VAR=value"[,"VAR2=value2"]]
. - Dir – 一个字符串,用于指定要运行命令的工作目录。
- User (用户) – 一个字符串值,用于指定容器内的用户。
- Labels – 要与服务关联的标签映射(例如
{"key":"value", "key2":"value2"}
). - Mounts – 要添加到容器中的挂载的规范,这些容器是作为新
服务。
- Target (目标) – Container path(容器路径)。
- Source (源) – 挂载源(例如卷名称、主机路径)。
- Type (类型) – 挂载类型 (
bind
或volume
). - ReadOnly – 一个布尔值,指示挂载是否应为只读。
- BindOptions - 的可选配置
bind
类型- Propagation – 一种传播模式,其值为
[r]private
,[r]shared
或[r]slave
.
- Propagation – 一种传播模式,其值为
- VolumeOptions – 的可选配置
volume
类型。- NoCopy – 一个布尔值,指示交易量是否应为 填充了来自目标的数据。(默认为 false)
- Labels (标签) – 用户定义的卷名称和标签。
- DriverConfig – 特定于驱动程序的选项的映射。
- Name — 用于创建卷的驱动程序的名称
- 选项 - 驱动程序特定选项的键/值映射
- StopGracePeriod – 等待容器终止之前的时间量 强行杀死它。
- Resources (资源) – 适用于作为部分创建的每个单独容器的资源要求
的服务。
- Limits (限制) – 定义资源限制。
- CPU – CPU 限制
- Memory (内存) – 内存限制
- Reservation (预留) – 定义资源预留。
- CPU – CPU 预留
- Memory (内存) – 内存预留
- Limits (限制) – 定义资源限制。
- RestartPolicy – 适用于创建的容器的重启策略的规范
作为此服务的一部分。
- Condition (条件) – 重启条件 (
none
,on-failure
或any
). - Delay (延迟) – 重启尝试之间的延迟。
- MaxAttempts – 在放弃之前重新启动给定容器的最大尝试次数(默认值 为 0,将被忽略)。
- Window (窗口) – Windows 是用于评估重启策略的时间窗口(默认值为 0,这是无界的)。
- Condition (条件) – 重启条件 (
- Placement (放置) – 对服务可以运行位置的限制。
- Constraints – 一组约束,例如
[ "node.role == manager" ]
.
- Constraints – 一组约束,例如
- ContainerSpec - 作为此任务的一部分启动的容器的容器设置。
- Mode (模式) – 服务的调度模式 (
replicated
或global
,默认为replicated
). - UpdateConfig – 服务的更新策略的规范。
- Parallelism – 一次迭代中要更新的最大任务数(0 表示无限制 parallelism) 的 Parallel Driven 的
- Delay (延迟) – 更新之间的时间量。
- Networks (网络) – 要将服务附加到的网络名称或 ID 的数组。
- EndpointSpec – 可配置为访问服务并对服务进行负载均衡的属性。
- Mode (模式) – 用于内部负载均衡的解析模式
任务之间 (
vip
或dnsrr
).默认为vip
如果未提供。 - Ports (端口 ) – 可从中访问此服务的公开端口的列表
外部,以以下形式出现:
{"Protocol": <"tcp"|"udp">, "PublishedPort": <port>, "TargetPort": <port>}
. 只有在以下情况下才能提供端口vip
使用 Resolution Mode 进行解析。
- Mode (模式) – 用于内部负载均衡的解析模式
任务之间 (
查询参数:
- version (版本) – 正在更新的服务对象的版本号。这是 以避免写入冲突。
请求标头:
- Content-type – 设置为
"application/json"
. - X-Registry-Auth – base64 编码的 AuthConfig 对象,包含 登录信息或令牌。请参阅 创建镜像 中以了解更多详细信息。
状态代码:
- 200 – 无错误
- 404 – 无此服务
- 406 - 节点不是群的一部分
- 500 – 服务器错误
3.10 任务
注意:任务作要求引擎是召集的一部分。
列出任务
GET /tasks
列出任务
请求示例:
GET /v1.24/tasks HTTP/1.1
响应示例:
[
{
"ID": "0kzzo1i0y4jz6027t0k7aezc7",
"Version": {
"Index": 71
},
"CreatedAt": "2016-06-07T21:07:31.171892745Z",
"UpdatedAt": "2016-06-07T21:07:31.376370513Z",
"Spec": {
"ContainerSpec": {
"Image": "redis"
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"MaxAttempts": 0
},
"Placement": {}
},
"ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz",
"Slot": 1,
"NodeID": "60gvrl6tm78dmak4yl7srz94v",
"Status": {
"Timestamp": "2016-06-07T21:07:31.290032978Z",
"State": "running",
"Message": "started",
"ContainerStatus": {
"ContainerID": "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035",
"PID": 677
}
},
"DesiredState": "running",
"NetworksAttachments": [
{
"Network": {
"ID": "4qvuz4ko70xaltuqbt8956gd1",
"Version": {
"Index": 18
},
"CreatedAt": "2016-06-07T20:31:11.912919752Z",
"UpdatedAt": "2016-06-07T21:07:29.955277358Z",
"Spec": {
"Name": "ingress",
"Labels": {
"com.docker.swarm.internal": "true"
},
"DriverConfiguration": {},
"IPAMOptions": {
"Driver": {},
"Configs": [
{
"Subnet": "10.255.0.0/16",
"Gateway": "10.255.0.1"
}
]
}
},
"DriverState": {
"Name": "overlay",
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "256"
}
},
"IPAMOptions": {
"Driver": {
"Name": "default"
},
"Configs": [
{
"Subnet": "10.255.0.0/16",
"Gateway": "10.255.0.1"
}
]
}
},
"Addresses": [
"10.255.0.10/16"
]
}
],
},
{
"ID": "1yljwbmlr8er2waf8orvqpwms",
"Version": {
"Index": 30
},
"CreatedAt": "2016-06-07T21:07:30.019104782Z",
"UpdatedAt": "2016-06-07T21:07:30.231958098Z",
"Name": "hopeful_cori",
"Spec": {
"ContainerSpec": {
"Image": "redis"
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"MaxAttempts": 0
},
"Placement": {}
},
"ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz",
"Slot": 1,
"NodeID": "60gvrl6tm78dmak4yl7srz94v",
"Status": {
"Timestamp": "2016-06-07T21:07:30.202183143Z",
"State": "shutdown",
"Message": "shutdown",
"ContainerStatus": {
"ContainerID": "1cf8d63d18e79668b0004a4be4c6ee58cddfad2dae29506d8781581d0688a213"
}
},
"DesiredState": "shutdown",
"NetworksAttachments": [
{
"Network": {
"ID": "4qvuz4ko70xaltuqbt8956gd1",
"Version": {
"Index": 18
},
"CreatedAt": "2016-06-07T20:31:11.912919752Z",
"UpdatedAt": "2016-06-07T21:07:29.955277358Z",
"Spec": {
"Name": "ingress",
"Labels": {
"com.docker.swarm.internal": "true"
},
"DriverConfiguration": {},
"IPAMOptions": {
"Driver": {},
"Configs": [
{
"Subnet": "10.255.0.0/16",
"Gateway": "10.255.0.1"
}
]
}
},
"DriverState": {
"Name": "overlay",
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "256"
}
},
"IPAMOptions": {
"Driver": {
"Name": "default"
},
"Configs": [
{
"Subnet": "10.255.0.0/16",
"Gateway": "10.255.0.1"
}
]
}
},
"Addresses": [
"10.255.0.5/16"
]
}
]
}
]
查询参数:
- filters – 筛选条件的 JSON 编码值 (一个
map[string][]string
) 在 services 列表。可用筛选器: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,则表示镜像不存在:
- 试着拉它。
- 然后,重试创建容器。
启动容器。
如果您未处于分离模式:
使用 Attach to the container
logs=1
(要有stdout
和stderr
从容器的开头开始)和stream=1
如果处于分离模式或仅
stdin
时,显示容器的 ID。
4.2 劫持
在此版本的 API 中,/attach
,使用劫持来运输stdin
,stdout
和stderr
在同一个插槽上。
为了提示有关连接劫持的潜在代理,Docker 客户端会发送 连接升级标头类似于 WebSocket。
Upgrade: tcp
Connection: Upgrade
当 Docker 守护程序检测到Upgrade
标头,它会切换其状态代码
从 200 OK 到 101 UPGRADED,并重新发送相同的标头。
4.3 CORS 请求
要设置对引擎 API 的跨域请求,请将值设为--api-cors-header
在守护程序模式下运行 Docker 时。Set *(星号)允许所有,
default 或空白表示 CORS 已禁用
$ dockerd -H="192.168.1.9:2375" --api-cors-header="http://foo.bar"