引擎 API v1.24
1. 简介
- 守护进程侦听,但您可以将 Docker 绑定到另一个主机/端口或 Unix 套接字。
unix:///var/run/docker.sock
- API 往往是 REST。但是,对于某些复杂命令(如 或 ),HTTP 连接被劫持以传输 、 和 。
attach
pull
stdout
stdin
stderr
- 对终端节点的请求中应存在标头
期待一个身体。
Content-Length
POST
- 要锁定到特定版本的 API,请在 URL 前面加上版本
要使用的 API。例如。如果未包含
URL 时,使用支持的最高 API 版本。
/v1.18/info
- 如果守护程序不支持 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 - 要在容器列表中处理的过滤器 (a ) 的 JSON 编码值。可用筛选器:
map[string][]string
exited=<int>
;-- 退出代码为<int>
;status=
(created
|||||restarting
running
paused
exited
dead
)label=key
或容器标签label="key=value"
isolation=
(default
||)(仅限 Windows 守护程序)process
hyperv
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 - 布尔值 opens ,
stdin
- StdinOnce - 布尔值,在 1 个连接的客户端断开连接后关闭。
stdin
- 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
要将主机路径绑定到 容器。Both 和 都必须是绝对路径。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 挂载的容器目录映射,以及它们对应的 挂载选项。格式为 .
{ "/run": "rw,noexec,nosuid,size=65536k" }
链接 - 容器的链接列表。每个链接条目都应该是 以 的形式。
container_name:alias
内存 - 内存限制(以字节为单位)。
MemorySwap - 总内存限制 (内存 + 交换);设置为 Enable unlimited swap。 您必须将此 与 一起使用,并使 swap 值大于 。
-1
memory
memory
MemoryReservation - 内存软限制(以字节为单位)。
KernelMemory - 内核内存限制(以字节为单位)。
CpuPercent - 一个整数值,其中包含可用 CPU 的可用百分比。(仅限 Windows 守护程序)
CpuShares - 包含容器的 CPU 份额的整数值 (即与其他容器的相对重量)。
CpuPeriod - CPU 周期的长度(以微秒为单位)。
CpuQuota - 容器在一个 CPU 周期内可以获得的 CPU 时间微秒。
CpusetCpus - 包含要使用的字符串值。
cgroups CpusetCpus
CpusetMems - 允许执行的内存节点 (MEM) (0-3, 0,1)。仅在 NUMA 系统上有效。
IOMaximumBandwidth - 以 IOps 为单位的最大 IO 绝对速率。
IOMaximumIOps - 最大 IO 绝对速率(以每秒字节数为单位)。
BlkioWeight - 块 IO 权重(相对权重)接受介于 10 和 1000 之间的权重值。
BlkioWeightDevice - 块 IO 权重(相对设备权重),其形式为:
"BlkioWeightDevice": [{"Path": "device_path", "Weight": weight}]
BlkioDeviceReadBps - 以以下形式限制从设备读取速率(每秒字节数):,例如:
"BlkioDeviceReadBps": [{"Path": "device_path", "Rate": rate}]
"BlkioDeviceReadBps": [{"Path": "/dev/sda", "Rate": "1024"}]"
BlkioDeviceWriteBps - 以以下形式限制对设备的写入速率(每秒字节数):,例如:
"BlkioDeviceWriteBps": [{"Path": "device_path", "Rate": rate}]
"BlkioDeviceWriteBps": [{"Path": "/dev/sda", "Rate": "1024"}]"
BlkioDeviceReadIOps - 以以下形式限制设备的读取速率(每秒 IO):,例如:
"BlkioDeviceReadIOps": [{"Path": "device_path", "Rate": rate}]
"BlkioDeviceReadIOps": [{"Path": "/dev/sda", "Rate": "1000"}]
BlkioDeviceWriteIOps - 以以下形式限制对设备的写入速率(每秒 IO):,例如:
"BlkioDeviceWriteIOps": [{"Path": "device_path", "Rate": rate}]
"BlkioDeviceWriteIOps": [{"Path": "/dev/sda", "Rate": "1000"}]
MemorySwappiness - 调整容器的内存交换行为。接受介于 0 和 100 之间的整数。
OomKillDisable - 布尔值,是否为容器禁用 OOM Killer。
OomScoreAdj - 一个整数值,其中包含为优化 OOM 终止程序首选项而为容器提供的分数。
PidMode - 设置容器的 PID (进程) 命名空间模式;: 加入另一个容器的 PID 命名空间 : 在容器内使用主机的 PID 命名空间
"container:<name|id>"
"host"
PidsLimit - 调整容器的 PIDS 限制。设置为 -1 表示无限制。
PortBindings - 公开的容器端口及其主机端口的映射 应映射到。格式为 Take note 的 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 - 要添加到 container 的文件。在表单中指定。
/etc/hosts
["hostname:IP"]
VolumesFrom - 要从另一个容器继承的卷列表。 在表单中指定
<container name>[:<ro|rw>]
CapAdd - 要添加到容器的内核功能列表。
Capdrop - 要从容器中删除的内核功能列表。
GroupAdd - 容器进程将作为其他组的列表
RestartPolicy – 容器退出时要应用的行为。这 value 是具有 always restart, 始终重启,除非 用户已手动停止容器或仅在容器 退出代码为非零。如果使用,则控制在放弃之前重试的次数。 默认值为不重新启动。(可选) 不断增加的延迟(之前延迟的两倍,从 100 毫秒开始) 在每次重启之前添加,以防止服务器泛洪。
Name
"always"
"unless-stopped"
"on-failure"
on-failure
MaximumRetryCount
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 对象。 可用类型: 、 、 、 。 logging 驱动程序。
{ "Type": "<driver_name>", "Config": {"key1": "val1"}}
json-file
syslog
journald
gelf
fluentd
awslogs
splunk
etwlogs
none
json-file
CgroupParent - 创建容器的路径。如果 path 不是 absolute,则认为该 path 是相对于 init 进程的 path 的。如果 Cgroups 尚不存在,则创建 Cgroup。
cgroups
cgroup
cgroups
VolumeDriver - 此容器用于挂载卷的驱动程序。
ShmSize - 的大小(以字节为单位)。大小必须大于 0。如果省略,系统将使用 64MB。
/dev/shm
查询参数:
- 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
列出在容器内运行的进程 。在 Unix 系统上,此
通过运行命令来完成。此终端节点不是
在 Windows 上受支持。id
ps
请求示例:
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
注意: 此终端节点仅适用于具有 或 logging 驱动程序的容器。
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}
}
}
这是上一次读取的 cpu 统计信息,用于计算 cpu 使用率百分比。它不是字段的精确副本。precpu_stats
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,如果 , attach
自。违约。
stream=true
stdin
false
- stdout – 1/True/true 或 0/False/false,如果 ,则返回日志,如果 ,附加到 。违约。
logs=true
stdout
stream=true
stdout
false
- stderr – 1/True/true 或 0/False/false,如果 ,则返回日志,如果 ,附加到 。违约。
logs=true
stderr
stream=true
stderr
false
状态代码:
- 101 – 没有错误,提示代理关于劫持
- 200 – 无错误,未找到升级标头
- 400 – 参数错误
- 404 – 没有这样的容器
- 409 - 容器已暂停
- 500 – 服务器错误
流详细信息:
在 POST /containers/create
中启用 TTY 设置后,使用 TTY 时
流是来自进程 PTY 和 client 的原始数据。
禁用 TTY 后,将对流进行多路复用以分隔 和 。stdin
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
是
编码为 big endian 的大小。uint32
有效载荷
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
通过 websocket 附加到容器id
根据 RFC 6455 实现 websocket 协议握手
示例请求
GET /v1.24/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
响应示例
{% raw %}
{{ STREAM }}
{% endraw %}
查询参数:
- detachKeys – 覆盖用于分离
容器。格式是单个字符,或者其中 是以下之一: 、 、 、 或 .
[a-Z]
ctrl-<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
阻塞直到容器停止,然后返回退出代码id
请求示例:
POST /v1.24/containers/16253994b7c4/wait HTTP/1.1
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{"StatusCode": 0}
状态代码:
- 200 – 无错误
- 404 – 没有这样的容器
- 500 – 服务器错误
删除容器
DELETE /containers/(id or name)
从文件系统中删除容器id
请求示例:
DELETE /v1.24/containers/16253994b7c4?v=1 HTTP/1.1
响应示例:
HTTP/1.1 204 No Content
查询参数:
- v – 1/True/true 或 0/False/false,删除卷
关联到容器。违约。
false
- force - 1/True/true 或 0/False/false,则 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
获取 container 的文件系统中资源的 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 %}
成功后,响应标头将设置为
base64 编码的 JSON 对象,其中包含一些文件系统头信息
存档的资源。上面的示例值将解码为以下内容
JSON 对象(为提高可读性而添加了空格):X-Docker-Container-Path-Stat
{
"name": "root",
"size": 4096,
"mode": 2147484096,
"mtime": "2014-02-27T20:51:23Z",
"linkTarget": ""
}
如果只有此信息为
期望。HEAD
状态代码:
- 200 - 成功,返回复制资源的存档
- 400 - 客户端错误、参数错误、JSON 响应正文中的详细信息,以下之一:
- 必须指定 path 参数(path 不能为空)
- 不是目录(path 被断言为目录,但作为 文件)
- 404 - 客户端错误,找不到资源,以下之一:
– 没有这样的容器 (container does not exist)
id
- 没有这样的文件或目录(路径不存在)
- 500 - 服务器错误
将文件或文件夹的存档提取到容器中的目录
PUT /containers/(id or name)/archive
将要提取的 tar 存档上传到 container 的文件系统中的路径。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 does not exist)
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
localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...
请参阅 和 命令以获取摘要和标签的示例
命令行上的引用。docker run
docker build
查询参数:
- 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
存档可能包含任意数量的其他文件, ,这些 API 可以在构建上下文中访问(请参阅 ADD 构建 命令)。
Docker 守护程序对
启动构建,如果语法不正确,则返回错误。然后
每条指令逐个运行,直到输出新镜像的 ID。Dockerfile
如果客户端通过退出断开连接,则会取消构建 或被杀。
查询参数:
- dockerfile - 构建上下文中 .这是
如果指定了 MissAV.com 并指向外部 .
Dockerfile
remote
Dockerfile
- t – 要应用于格式中的镜像的名称和可选标签。
如果省略 ,则假定为默认值。
您可以提供一个或多个参数。
name:tag
tag
latest
t
- remote – Git 存储库 URI 或 HTTP/HTTPS 上下文 URI。如果
URI 指向单个文本文件,则文件的内容将放入
一个名为 的文件,该镜像就是从该文件构建的。如果
URI 指向一个 tarball,该文件由守护进程下载,并且
其中的内容用作构建的上下文。如果 URI
指向一个 tarball,并且还指定了参数,
tarball 内必须有一个具有相应路径的文件。
Dockerfile
dockerfile
- q – 禁止显示详细的生成输出。
- nocache – 构建镜像时不要使用缓存。
- pull - 即使本地存在较旧的镜像,也尝试提取镜像。
- rm - 在成功构建后删除中间容器(默认行为)。
- forcerm - 始终删除中间容器 (includes )。
rm
- memory - 设置构建的内存限制。
- memswap - 总内存(内存 + 交换),用于启用无限交换。
-1
- cpushares - CPU 份额(相对权重)。
- cpusetcpus - 允许在其中执行的 CPU(例如,, )。
0-3
0,1
- cpuperiod - CPU 周期的长度(以微秒为单位)。
- cpuquota - 容器在一个 CPU 周期内可以获得的 CPU 时间微秒数。
- buildargs – 构建时变量的字符串对的 JSON 映射。用户通过
这些值。Docker 使用 作为环境
context (用于通过 Dockerfile 的指令运行的命令)或
变量扩展。这不适用于
传递 secret 值。阅读有关 buildargs 指令的更多信息
buildargs
RUN
- shmsize - 大小(以字节为单位)。大小必须大于 0。如果省略,系统将使用 64MB。
/dev/shm
- 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..."}
...
使用此终端节点从注册表中提取镜像时,标头可用于包含
base64 编码的 AuthConfig 对象。X-Registry-Auth
查询参数:
- 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..."}
...
如果您希望将镜像推送到私有注册表,则该镜像必须已经有一个标签
导入到引用该注册表的存储库中,并且 .此存储库名称应
然后在 URL 中使用。这将复制命令行的 flow。hostname
port
如果 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
如果 是特定的名称和标签(例如 ubuntu:latest),则仅该镜像
(及其父级)返回。如果 是镜像 ID,则同样只有
image(及其父级)返回 URL,但不包括
'repositories' 文件,因为没有引用镜像名称。name
name
有关更多详细信息,请参阅 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。
对于参数的每个值: 如果它是特定的名称和标签(例如 ),则仅返回该镜像(及其父级);如果是
一个镜像 ID,同样,仅返回该镜像(及其父级),并在那里
将不在此镜像 ID 的“repositories”文件中引用任何名称。names
ubuntu:latest
有关更多详细信息,请参阅 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” 查询参数设置为 / (),则进度
details 将被禁止,并且仅在
操作完成。true
1
?quiet=1
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
{"stream":"Loaded image: busybox:latest\n"}
查询参数:
- quiet – 布尔值,在加载期间隐藏进度详细信息。违约
如果省略,则为 TO /。
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 还应包含一个位于
包含映射到层 ID 的存储库和标记名称列表的根。repositories
{"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 进程。格式为以下之一: 、 、 或 。
"user"
"user:group"
"uid"
"uid:gid"
状态代码:
- 201 – 无错误
- 404 – 没有这样的容器
- 409 - 容器已暂停
- 500 - 服务器错误
执行启动
POST /exec/(id)/start
启动以前设置的实例 。如果为 true,则此 API
在启动命令后返回。否则,此 API 会设置
交互式会话。exec
id
detach
exec
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 - 容器已暂停
流详细信息:
类似于 API 的流行为POST /containers/(id or name)/attach
Exec 调整大小
POST /exec/(id)/resize
调整命令 .单位为字符数。
仅当在创建和启动命令时指定此 API 时,此 API 才有效。tty
exec
id
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
返回有关 command 的低级信息。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 - 要在卷列表中处理的过滤器 (a ) 的 JSON 编码值。可用筛选器:
map[string][]string
name=<volume-name>
匹配卷名称的全部或部分。dangling=<boolean>
当设置为 (或 ) 时,返回所有 “悬空” 的卷(未被容器使用)。当设置为 (or ) 时,仅返回一个或多个容器正在使用的卷。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 — 要使用的卷驱动程序的名称。默认为 name 。
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 (状态) - 有关卷的低级详细信息,由卷驱动程序提供。
详细信息以包含键/值对的映射形式返回: 。
该字段是可选的,如果卷驱动程序不是可选的,则省略该字段
支持此功能。
{"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
状态代码:
- 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 - 请求守护程序检查具有相同名称的网络。默认为 。
由于 Network 主要基于随机 ID 而不是名称进行键控,因此
Network Name 严格来说是 network 的用户友好别名
,则无法保证检查重复项。
此参数 CheckDuplicate 用于尽最大努力检查任何网络
具有相同的名称,但不能保证捕获所有名称冲突。
false
- Driver (驱动程序) - 要使用的网络驱动程序插件的名称。默认为 driver
bridge
- Internal - 限制外部对网络的访问
- IPAM - 网络的可选自定义 IP 方案
- Driver — 要使用的 IPAM 驱动程序的名称。默认为 driver
default
- 配置 - 指定为映射的 IPAM 配置选项列表:
{"Subnet": <CIDR>, "IPRange": <CIDR>, "Gateway": <IP address>, "AuxAddress": <device_name:IP address>}
- 选项 - 特定于驱动程序的选项,指定为映射:
{"option":"value" [,"option2":"value2"]}
- Driver — 要使用的 IPAM 驱动程序的名称。默认为 driver
- 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
该标签是可选的,如果省略,则用作 default。使用
this 端点从注册表中提取插件,标头
可用于包含 base64 编码的 AuthConfig 对象。请参阅创建
有关更多详细信息,请参阅镜像部分。:latest
X-Registry-Auth
响应示例:
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
该标签是可选的,如果省略,则用作 default。: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
该标签是可选的,如果省略,则用作 default。: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
该标签是可选的,如果省略,则用作 default。: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
该标签是可选的,如果省略,则用作 default。:latest
响应示例:
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 – 要在
nodes 列表。可用筛选器:
map[string][]string
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
更新节点。
请求的有效负载是新的
覆盖指定节点的 current。POST
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) 的网络接口。这可以是
address/port 组合形式为 ,或者一个接口后跟一个端口
number 等 .如果省略端口号,则默认 swarm 侦听端口为
使用。
192.168.1.1:4567
eth0:4567
- AdvertiseAddr – 向其他节点公布的外部可访问地址。这可以是
格式为 的地址/端口组合,或后跟端口的接口
number 等 .如果省略端口号,则监听
address 的 URL 中。如果未指定,则在以下情况下会自动检测
可能。
192.168.1.1:4567
eth0:4567
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 – 向其他节点公布的外部可访问地址。这可以是
格式为 的地址/端口组合,或后跟端口的接口
number 等 .如果省略端口号,则监听
address 的 URL 中。如果未指定,则在以下情况下会自动检测
可能。
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
查询参数:
- 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
- rotateManagerToken - 设置为 (或 ) 可轮换管理器加入令牌。
true
1
状态代码:
- 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 – 要在
services 列表。可用筛选器:
map[string][]string
id=<service id>
label=<service label>
name=<service name>
状态代码:
- 200 – 无错误
- 406 — 节点不是群的一部分
- 500 – 服务器错误
创建服务
POST /services/create
创建服务。使用此终端节点创建使用私有
repository 中,该标头必须用于
包括 base64 编码的 AuthConfig 对象。请参阅创建
image 部分了解更多详情。X-Registry-Auth
请求示例:
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
- 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 仓库,可以使用
更新为服务存储的身份验证信息。
标头包含一个 base64 编码的 AuthConfig 对象。请参阅创建
image 部分了解更多详情。X-Registry-Auth
请求示例:
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
- 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 – 要在
services 列表。可用筛选器:
map[string][]string
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
中
例如,命令行进行以下 API 调用:docker run
创建容器
如果状态代码为 404,则表示镜像不存在:
- 试着拉它。
- 然后,重试创建容器。
启动容器。
如果您未处于分离模式:
附加到容器,使用 (to have and from the container's start) 和
logs=1
stdout
stderr
stream=1
如果处于分离模式或仅附加,则显示容器的 ID。
stdin
4.2 劫持
在此版本的 API 中,使用劫持来传输 、 和 在同一个套接字上。/attach
stdin
stdout
stderr
为了提示有关连接劫持的潜在代理,Docker 客户端会发送 连接升级标头类似于 WebSocket。
Upgrade: tcp
Connection: Upgrade
当 Docker 守护进程检测到标头时,它会切换其状态代码
从 200 OK 到 101 UPGRADED,并重新发送相同的标头。Upgrade
4.3 CORS 请求
要设置对引擎 API 的跨域请求,请在守护进程模式下运行 Docker 时为 指定值。Set *(星号)允许所有,
default 或空白表示 CORS 已禁用--api-cors-header
$ dockerd -H="192.168.1.9:2375" --api-cors-header="http://foo.bar"