Docker Remote API 使用详解

文章目录

  • 1.容器相关
    • [1.1 列出所有容器](#1.1 列出所有容器)
    • [1.2 创建新容器](#1.2 创建新容器)
    • [1.3 检查容器](#1.3 检查容器)
    • [1.4 启动容器](#1.4 启动容器)
    • [1.5 停止容器](#1.5 停止容器)
    • [1.6 重启容器](#1.6 重启容器)
    • [1.8 删除容器](#1.8 删除容器)
    • [1.14 根据资源使用情况获取容器统计信息](#1.14 根据资源使用情况获取容器统计信息)
    • [1.16 获取容器日志](#1.16 获取容器日志)
  • 2.镜像相关
    • [2.1 获取镜像清单](#2.1 获取镜像清单)
    • [2.2 构建镜像](#2.2 构建镜像)
    • [2.4 检查镜像](#2.4 检查镜像)
    • [2.5 获取镜像的历史记录](#2.5 获取镜像的历史记录)
    • [2.6 标记一个镜像](#2.6 标记一个镜像)
    • [2.8 删除镜像](#2.8 删除镜像)
    • [2.9 删除全部镜像](#2.9 删除全部镜像)

Docker Remote API是一个取代远程命令行界面(rcli)的REST API。本文中,我们将使用命令行工具cURL来处理url相关操作。cURL可以发送请求、获取以及发送数据、检索信息。

本文档能够完成,主要借助于以下文档

1.容器相关

1.1 列出所有容器

GET /containers/json

URL:

  • /containers/json

查询参数:

  • all: 获取所有容器信息,默认为false,仅显示正在运行的容器
  • limit:返回最近创建的容器的数量,包括未运行的容器。例如:limit=5 ,则返回5个最近创建的5个容器信息
  • size:将容器的大小作为字段SizeRw和SizeRootFs返回,默认为false
  • filters:过滤器处理容器列表,编码为JSON (map[string][]string)。例如,{"status": [" stopped "]}将只返回暂停的容器

请求示例:

  • 获取正在运行中的容器列表

curl http://127.0.0.1:5678/containers/json

  • 查询全部的容器(包含不是正在运行的容器)

curl http://127.0.0.1:5678/containers/json?all=1

响应结果:

[root@localhost ~]# curl http://10.20.29.21:6666/containers/json?all=true
[{"Id":"15ffc3340941281cd6f515c1d34d15ee0cea3ee70cd1a0e34e39f94fcf06c98b","Names":["/shipyard-swarm-agent"],"Image":"docker.io/swarm:latest","ImageID":"sha256:ff454b4a0e84e50c50e3df457ad44b80f1a67ec6ec75cff5117dd5dc46bf4965","Command":"/swarm join --addr 10.20.29.21:6666 token://a997b11fdba7ede2551f9f8a17483bee","Created":1554858486,"Ports":[{"PrivatePort":2375,"Type":"tcp"}],"Labels":{},"State":"running","Status":"Up About an hour","HostConfig":{"NetworkMode":"default"},"NetworkSettings":{"Networks":{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"74227783d8af05a30ae0d8817d984e815144387c1b1e4b7c6b9b10915579b61e","EndpointID":"9f85ced521dd4d081954de20af5350672fa08de18882614005d10ad2b94ff8b9","Gateway":"172.17.0.1","IPAddress":"172.17.0.4","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:04","DriverOpts":null}}},"Mounts":[{"Type":"volume","Name":"534f08f77e48bbc588756c5c1113807a3a0cbe8c6e073fb781fe6fd04a1d0d1c","Source":"","Destination":"/.swarm","Driver":"local","Mode":"","RW":true,"Propagation":""}]}
......

注:可通过python -mjson.tool可以将JSON数据格式化显示

成功后返回的参数:

  • ID:这个容器的ID
  • Names:这个容器的名称
  • Image:创建此容器时使用的镜像的名称
  • ImageID::创建此容器时使用的镜像的ID
  • Command:启动容器时运行的命令
  • Created:容器创建时间
  • Ports:这个容器暴露的端口
  • State:这个容器的状态(例如:已关闭)
  • Status:容器运行时长或关闭时长
  • NetworkSettings :容器网络设置的摘要信息
  • Mounts:容器的文件或目录挂载信息

响应状态码解释

  • 204 没有错误
  • 400 参数不对
  • 500 服务器错误

1.2 创建新容器

POST /containers/create

URL:

  • /containers/create

查询参数:

  • name:即将被创建容器的名称

创建容器参数:

  • Hostname:用于容器的主机名
  • Domainname:用于容器的域名
  • User:在容器内运行命令的用户
  • AttachStdin:是否连接到Stdin,默认为false
  • AttachStdout:是否连接到Stdout,默认为false
  • AttachStderr:是否连接到Stderr,默认为false
  • ExposedPorts:端口映射(容器需要暴露的端口)
  • PortBindings:公开的容器端口和它们应该映射到的主机端口的映射
  • Tty:将标准流附加到TTY,包括stdin它是否未关闭
  • OpenStdin:打开标准输入
  • StdinOnce:连接的客户端断开后关闭标准输入
  • Env:设置容器内部环境变量
  • Cmd:需要在容器内部执行的命令,命令以字符串的形式运行
  • Healthcheck:检查容器是否健康的运行
  • Image:创建容器时使用的镜像(名称)
  • Volumes:宿主机与容器之间文件或目录的映射
  • WorkingDir:运行命令的工作目录,即容器工作目录
  • Entrypoint:指定字符串命令所在目录
  • NetworkDisabled:是否禁用容器网络
  • MacAddress:容器的MAC地址
  • Labels:添加一个标签到容器
  • StopSignal:发出停止容器的信号
  • StopTimeout:以秒为单位停止容器的超时
  • HostConfig:依赖于我们所运行的主机的容器配置
  • NetworkingConfig :这个容器的网络配置

1、请求示例:

仅映射端口:

  • curl -X POST -H "Content-Type: application/json" -d '{"AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Image": "nginx:1.14","Volumes": {"/mnt/data":{}},"PortBindings":{ "80/tcp":[{"HostPort": "8888"}]} }' http://127.0.0.1:6666/containers/create?name=nginx

响应结果:

[root@localhost wasm]# curl -X POST -H "Content-Type: application/json" -d '{"AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Image": "nginx:1.14","Volumes": {"/mnt/data":{}},"PortBindings":{ "80/tcp":[{"HostPort": "8888"}]} }' http://127.0.0.1:6666/containers/create?name=nginx-test
{"Id":"5cee7175339b9cafbfa7b66e4b719aa4261a1f018f8f33dff4a50cf0ee73fc0f","Warnings":null}

2、请求示例:

映射端口及目录

  • curl -X POST -H "Content-Type: application/json" -d '{"AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Image": "zht-baseclient:v1.0","Binds":["/mnt/app/zht/baseclient/project:/data","/etc/localtime:/etc/localtime","/etc/timezone:/etc/timezone"],"ExposedPorts": {"8081/tcp": {}},"PortBindings":{"8081/tcp":[{"HostIp":"","HostPort":"18081"}]}}' http://127.0.0.1:2375/containers/create?name=baseclient

响应结果:

[root@localhost baseclient]# curl -X POST -H "Content-Type: application/json" -d '{"AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Image": "zht-baseclient:v1.0","Binds":["/mnt/app/zht/baseclient/project:/data","/etc/localtime:/etc/localtime","/etc/timezone:/etc/timezone"],"ExposedPorts": {"8081/tcp": {}},"PortBindings":{"8081/tcp":[{"HostIp":"","HostPort":"18081"}]}}' http://127.0.0.1:2375/containers/create?name=baseclient
{"Id":"8c0ddcb1921760ccf3cad0279cc8281a3d81a87f58c37d300d558685a47e8c8f","Warnings":null}

3、请求示例:

映射端口及使用host模式映射端口

  • curl -X POST -H "Content-Type: application/json" -d '{"AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Image": "zht-baseclient:v1.0","Binds":["/mnt/app/zht/baseclient/project:/data","/etc/localtime:/etc/localtime","/etc/timezone:/etc/timezone"],"NetworkMode":"host","PortBindings":{},"RestartPolicy":{"Name":"unless-stopped","MaximumRetryCount":0}}' http://127.0.0.1:2375/containers/create?name=baseclient

响应结果:

[root@localhost ~]# curl -X POST -H "Content-Type: application/json" -d '{"AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Image": "zht-baseclient:v1.0","Binds":["/mnt/app/zht/baseclient/project:/data","/etc/localtime:/etc/localtime","/etc/timezone:/etc/timezone"],"NetworkMode":"host","PortBindings":{},"RestartPolicy":{"Name":"unless-stopped","MaximumRetryCount":0}}' http://127.0.0.1:2375/containers/create?name=baseclient
{"Id":"fda7518cd757e604d963c91f3684317c5f29e27db6a186bed74b7f94acff6a16","Warnings":null}

以上api各种使用方法灵感来源于:

hostconfig.json文件

文件路径:/var/lib/docker/containers/容器ID/hostconfig.json

[root@localhost 35a2f9491f6ad3d43a8e7c8b62acec1ccc82e90db844988b5a3c5f2ac630da5c]# cat hostconfig.json
{"Binds":["/etc/localtime:/etc/localtime","/etc/timezone:/etc/timezone","/mnt/public/mysql/data:/var/lib/mysql","/mnt/public/mysql/my.cnf:/etc/mysql/my.cnf"],"ContainerIDFile":"","LogConfig":{"Type":"json-file","Config":{}},"NetworkMode":"default","PortBindings":{"3306/tcp":[{"HostIp":"","HostPort":"13306"}]},"RestartPolicy":{"Name":"unless-stopped","MaximumRetryCount":0},"AutoRemove":false,"VolumeDriver":"","VolumesFrom":null,"CapAdd":null,"CapDrop":null,"Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IpcMode":"shareable","Cgroup":"","Links":null,"OomScoreAdj":0,"PidMode":"","Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"SecurityOpt":null,"UTSMode":"","UsernsMode":"","ShmSize":67108864,"Runtime":"runc","ConsoleSize":[0,0],"Isolation":"","CpuShares":0,"Memory":0,"NanoCpus":0,"CgroupParent":"","BlkioWeight":0,"BlkioWeightDevice":[],"BlkioDeviceReadBps":null,"BlkioDeviceWriteBps":null,"BlkioDeviceReadIOps":null,"BlkioDeviceWriteIOps":null,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpusetCpus":"","CpusetMems":"","Devices":[],"DeviceCgroupRules":null,"DiskQuota":0,"KernelMemory":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":null,"OomKillDisable":false,"PidsLimit":0,"Ulimits":null,"CpuCount":0,"CpuPercent":0,"IOMaximumIOps":0,"IOMaximumBandwidth":0,"MaskedPaths":["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths":["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]}

注意:此时容器为Created(创建)状态,还需要启动容器

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                         PORTS                    NAMES
5cee7175339b        nginx:1.14            "nginx -g 'daemon of..."   6 seconds ago       Created                                                 nginx

[root@localhost ~# docker start  nginx

响应状态码解释

  • 201 容器已成功创建
    成功后返回的参数:

  • ID:被创建的容器ID

  • Warnings:创建容器时遇到的警告(错误)

  • 400 参数不对

  • 404 没有这个容器

  • 409 冲突

  • 500 服务器错误

1.3 检查容器

获取关于容器的底层信息。

GET /containers/(id)/json

URL:

  • /containers/(id)/json

路径参数:

  • ID:容器的ID或名称

查询参数:

  • size:将容器的大小作为字段SizeRw和SizeRootFs返回,默认为false

请求示例:

响应结果:

[root@localhost ~]# curl http://10.20.29.21:5678/containers/4eccce38c57f/json
{"Id":"4eccce38c57f183feef8ec76dfa64bbc0caa21e26b3968efa98121fe037bdad1","Created":"2018-12-07T12:56:38.189610103Z","Path":"nginx","Args":["-g","daemon off;"],"State":{"Status":"exited","Running":false,"Paused":false,"Restarting":false,"OOMKilled":false,"Dead":false,"Pid":0,"ExitCode":0,"Error":"","StartedAt":"2019-01-12T01:32:54.412546647Z","FinishedAt":"2019-01-12T01:47:57.571820667Z"},"Image":"sha256:4037a5562b030fd80ec889bb885405587a52cfef898ffb7402649005dfda75ff"
......

注:可通过python -mjson.tool可以将JSON数据格式化显示

响应状态码解释

  • 204 没有错误
  • 404 没有这个容器
  • 500 服务器错误

1.4 启动容器

POST /containers/(id)/start

URL:

  • /containers/{id}/start

路径参数:

  • ID:容器的ID或名称

查询参数:

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

请求示例:

curl -v --raw -X POST http://10.20.29.15:5678/containers/4eccce38c57f/start

响应结果:

[root@localhost ~]# curl -v --raw -X POST http://10.20.29.15:5678/containers/4eccce38c57f/start
* About to connect() to 10.20.29.21 port 2375 (#0)
*   Trying 10.20.29.21...
* Connected to 10.20.29.21 (10.20.29.21) port 2375 (#0)
> POST /containers/4eccce38c57f/start HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.20.29.21:2375
> Accept: */*
> 
< HTTP/1.1 204 No Content
< Api-Version: 1.39
< Docker-Experimental: false
< Ostype: linux
< Server: Docker/18.09.0 (linux)
< Date: Tue, 09 Apr 2019 09:14:06 GMT
< 
* Connection #0 to host 10.20.29.21 left intact

响应状态码解释

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

1.5 停止容器

POST /containers/(id)/stop

URL:

  • /containers/{id}/stop

路径参数:

  • ID:容器的ID或名称

查询参数:

  • t:在关闭容器之前等待的秒数

请求示例:

响应结果:

[root@localhost ~]# curl -v --raw -X POST http://10.20.29.15:5678/containers/f59103b6bfd1/stop
* About to connect() to 10.20.29.15 port 5678 (#0)
*   Trying 10.20.29.15...
* Connected to 10.20.29.15 (10.20.29.15) port 5678 (#0)
> POST /containers/f59103b6bfd1/stop HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.20.29.15:5678
> Accept: */*
> 
< HTTP/1.1 204 No Content
< Api-Version: 1.39
< Docker-Experimental: false
< Ostype: linux
< Server: Docker/18.09.3 (linux)
< Date: Tue, 09 Apr 2019 09:23:15 GMT
< 
* Connection #0 to host 10.20.29.15 left intact

响应状态码解释

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

1.6 重启容器

POST /containers/{id}/restart

URL:

  • /containers/{id}/restart

路径参数:

  • ID:容器的ID或名称

查询参数:

  • t:在关闭容器之前等待的秒数

请求示例:

响应结果:

[root@localhost ~]# curl -v --raw -X POST http://10.20.29.15:5678/containers/f59103b6bfd1/restart
* About to connect() to 10.20.29.15 port 5678 (#0)
*   Trying 10.20.29.15...
* Connected to 10.20.29.15 (10.20.29.15) port 5678 (#0)
> POST /containers/f59103b6bfd1/restart HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.20.29.15:5678
> Accept: */*
> 
< HTTP/1.1 204 No Content
< Api-Version: 1.39
< Docker-Experimental: false
< Ostype: linux
< Server: Docker/18.09.3 (linux)
< Date: Tue, 09 Apr 2019 09:36:29 GMT
< 
* Connection #0 to host 10.20.29.15 left intact

响应状态码解释:

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

1.8 删除容器

DELETE /containers/{id}

URL:

  • /containers/{id}

路径参数:

  • ID:容器的ID或名称

查询参数:

  • v :删除与容器关联的卷,默认为false
  • force: 如果容器正在运行,请在删除之前杀死它,默认为false
  • link:删除与容器关联的指定链接,默认为false

请求示例:

curl -v -X DELETE http://127.0.0.1:5678/containers/6c66e2135f24

响应结果:

[root@localhost ~]# curl -v -X DELETE http://127.0.0.1:5678/containers/6c66e2135f24
* About to connect() to 127.0.0.1 port 5678 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 5678 (#0)
> DELETE /containers/6c66e2135f24 HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1:5678
> Accept: */*
> 
< HTTP/1.1 204 No Content
< Api-Version: 1.39
< Docker-Experimental: false
< Ostype: linux
< Server: Docker/18.09.3 (linux)
< Date: Tue, 09 Apr 2019 07:42:04 GMT
< 
* Connection #0 to host 127.0.0.1 left intact

注:删除正在运行的容器,如果使用以上请求命令,则会报错:

< HTTP/1.1 409 Conflict
< Api-Version: 1.39
< Content-Type: application/json
< Docker-Experimental: false
< Ostype: linux
< Server: Docker/18.09.3 (linux)
< Date: Tue, 09 Apr 2019 07:41:33 GMT
< Content-Length: 179
< 
{"message":"You cannot remove a running container f59103b6bfd1cbf753c97cfd63b83f484bdae1b3f14ff0f5b192d4e191e22f5b. Stop the container before attempting removal or force remove"}
* Connection #0 to host 127.0.0.1 left intact

若需要删除正在运行的容器,请使用如下请求命令:

响应结果:

[root@localhost ~]# curl -v -X DELETE http://127.0.0.1:5678/containers/a3e7b90dd836?force=true
* About to connect() to 127.0.0.1 port 5678 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 5678 (#0)
> DELETE /containers/a3e7b90dd836?force=true HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1:5678
> Accept: */*
> 
< HTTP/1.1 204 No Content
< Api-Version: 1.39
< Docker-Experimental: false
< Ostype: linux
< Server: Docker/18.09.3 (linux)
< Date: Tue, 09 Apr 2019 05:22:23 GMT
< 
* Connection #0 to host 127.0.0.1 left intact

响应状态码解释:

  • 204 没有错误
  • 400 坏的参数
  • 404 没有这个容器
  • 409 冲突(如:容器正在运行)
  • 500 服务器错误

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

此api用来显示容器使用的系统资源,下面是输出的主要内容:

  • [CONTAINER]:以短格式显示容器的 ID。
  • [CPU %]:CPU 的使用情况。
  • [MEM USAGE / LIMIT]:当前使用的内存和最大可以使用的内存。
  • [MEM %]:以百分比的形式显示内存使用情况。
  • [NET I/O]:网络 I/O 数据。
  • [BLOCK I/O]:磁盘 I/O 数据。
  • [PIDS]:PID 号。

GET /containers/{id}/stats

URL:

  • /containers/{id}/stats

路径参数:

  • ID:容器的ID或名称

查询参数:

  • stream:流输出,如果为false,则统计信息将输出一次,然后将断开连接。默认为true

默认情况下,只返回当前的状态,但可以每隔 1 秒钟刷新一次输出的内容,如果不想持续的监控容器使用资源的情况可以通过stream=false 参数只输出当前的状态。

请求示例:

响应结果:

[root@localhost ~]# curl http://10.20.29.21:2375/containers/545a4863e32f/stats?stream=false
{"read":"2019-04-09T12:49:39.82789284Z","preread":"2019-04-09T12:49:38.825314468Z","pids_stats":{"current":25},"blkio_stats":{"io_service_bytes_recursive":[],"io_serviced_recursive":[],"io_queue_recursive":[],"io_service_time_recursive":[],"io_wait_time_recursive":[],"io_merged_recursive":[],"io_time_recursive":[],"sectors_recursive":[]},"num_procs":0,"storage_stats":{},"cpu_stats":{"cpu_usage":{"total_usage":27356238626,"percpu_usage":[3568026315,3567907546,2604128115,4723295390,5379339014,5697405323,818240931,997895992],"usage_in_kernelmode":1120000000,"usage_in_usermode":1890000000},"system_cpu_usage":835459830000000,"online_cpus":8,"throttling_data":{"periods":0,"throttled_periods":0,"throttled_time":0}},"precpu_stats":{"cpu_usage":{"total_usage":27354558405,"percpu_usage":[3568026315,3567840282,2604054202,4723295390,5377875899,5697405323,818165002,997895992],"usage_in_kernelmode":1120000000,"usage_in_usermode":1890000000},"system_cpu_usage":835451830000000,"online_cpus":8,"throttling_data":{"periods":0,"throttled_periods":0,"throttled_time":0}},"memory_stats":{"usage":99807232,"max_usage":101842944,"stats":{"active_anon":99774464,"active_file":0,"cache":32768,"dirty":0,"hierarchical_memory_limit":9223372036854771712,"hierarchical_memsw_limit":9223372036854771712,"inactive_anon":0,"inactive_file":32768,"mapped_file":32768,"pgfault":19237,"pgmajfault":0,"pgpgin":11226,"pgpgout":10876,"rss":99774464,"rss_huge":90177536,"total_active_anon":99774464,"total_active_file":0,"total_cache":32768,"total_dirty":0,"total_inactive_anon":0,"total_inactive_file":32768,"total_mapped_file":32768,"total_pgfault":19237,"total_pgmajfault":0,"total_pgpgin":11226,"total_pgpgout":10876,"total_rss":99774464,"total_rss_huge":90177536,"total_unevictable":0,"total_writeback":0,"unevictable":0,"writeback":0},"limit":8182054912},"name":"/zookeeper","id":"545a4863e32f4b2280bb8e5a469159a711fdb146266ecf0bf1133920024a8b2c","networks":{"eth0":{"rx_bytes":656,"rx_packets":8,"rx_errors":0,"rx_dropped":0,"tx_bytes":0,"tx_packets":0,"tx_errors":0,"tx_dropped":0}}}

注:可通过python -mjson.tool可以将JSON数据格式化显示

响应状态码解释:

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

1.16 获取容器日志

GET /containers/{id}/logs

URL:

  • /containers/{id}/logs

路径参数:

  • id:容器的名称或者ID

查询参数:

  • follow:以数据流的形式返回日志,将返回一个带有Connection: upgrade头的101 HTTP响应,默认为false
  • stdout:标准输出日志,默认为false
  • stderr:日志输出为标准错误,默认为false
  • since:只返回这次以后的日志,作为UNIX时间戳
  • until:只返回在此之前的日志,作为UNIX时间戳
  • timestamps:将时间戳添加到每个日志行,默认为false
  • tail:只返回日志末尾的日志行数。指定为整数或all以输出所有日志行,例:tail=100

请求示例:

curl http://10.20.29.21:6666/containers/ba5cf1607701/logs?stdout=true\&stdout=true\&follow=true\&tail=all

[root@localhost ~]# curl http://10.20.29.21:6666/containers/ba5cf1607701/logs?stdout=true&stdout=true&follow=true&tail=all
[7] 31749
[8] 31750
[9] 31751
[8]   完成                  stdout=true
[root@localhost ~]# ±0.20.29.154 - - [11/Apr/2019:16:34:03 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-"
䯰.20.29.154 - - [11/Apr/2019:16:34:03 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://10.20.29.21:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-"
10.20.29.154 - - [11/Apr/2019:16:34:15 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-"
10.20.29.154 - - [11/Apr/2019:16:35:05 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-"
10.20.29.154 - - [11/Apr/2019:16:35:06 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-"
10.20.29.154 - - [11/Apr/2019:16:35:06 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-"
......
\10.20.29.26 - - [11/Apr/2019:17:34:19 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
`10.20.29.26 - - [11/Apr/2019:17:34:20 +0000] "GET /curl HTTP/1.1" 404 169 "-" "curl/7.29.0" "-"
\10.20.29.26 - - [11/Apr/2019:17:34:20 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
`10.20.29.26 - - [11/Apr/2019:17:34:20 +0000] "GET /curl HTTP/1.1" 404 169 "-" "curl/7.29.0" "-"
\10.20.29.26 - - [11/Apr/2019:17:34:20 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

[7]   完成                  curl http://10.20.29.21:6666/containers/ba5cf1607701/logs?stdout=true
[9]   完成                  follow=true

响应状态码解释:

  • 101 日志作为流数据返回
  • 200 没有错误
  • 4.4 没有这个容器
  • 500 服务器错误

2.镜像相关

2.1 获取镜像清单

返回服务器上的镜像列表

GET /images/json

URL

  • /images/json

查询参数

  • all :显示所有图片。默认为false,只显示最后一层的图像(没有子层),即最终层
  • filters:过滤器的JSON编码值(map[string][]string),用于处理镜像列表
  • digests:将摘要信息显示为每个镜像上的RepoDigests字段,默认为false

请求示例

响应结果

[root@localhost wasm]# curl http://127.0.0.1:6666/images/json | python -m json.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3550    0  3550    0     0   525k      0 --:--:-- --:--:-- --:--:--  577k
[
    {
        "Containers": -1,
        "Created": 1554895762,
        "Id": "sha256:8bc2104b95693541c31524ba25b7819af14b45360c0efa0c7d5b69344050a96b",
        "Labels": null,
        "ParentId": "sha256:996598012bcb1435d8e801cc3bc7041cb257f958095ff9c52f181c22ffbf24f6",
        "RepoDigests": null,
        "RepoTags": [
            "basis:latest"
        ],
        "SharedSize": -1,
        "Size": 12369196,
        "VirtualSize": 12369196
    },
    {
        "Containers": -1,
        "Created": 1554895758,
        "Id": "sha256:1c5c084fb13ab7cca82b6ee226a4ac19dbeb6f2983e8a81b1d5905ff83e062e4",
        "Labels": null,
        "ParentId": "sha256:49dc3f8ad471e760b96ac88fb367c6d72e503b34ae7767a7421b64fc54430e1c",
        "RepoDigests": [
            "<none>@<none>"
        ],
        "RepoTags": [
            "<none>:<none>"
        ],
        "SharedSize": -1,
        "Size": 345580587,
        "VirtualSize": 345580587
    },

响应状态码解释

  • 200 与查询匹配的镜像的摘要镜像数据
  • 500 服务器错误

2.2 构建镜像

POST /build

查询参数

  • t:设置镜像名,要以name:tag格式应用于图像的名称和可选标记。如果省略标记,latest则假定为默认值。

请求示例

响应结果

[root@localhost /]# curl -X POST "http://10.20.29.21:6666/build?t=contract:1.1&remote=https://github.com/wuxiaoyong/apiserver_demos/raw/master/contract-1.1.tar.gz"
{"status":"https://github.com/wuxiaoyong/apiserver_demos/raw/master/contract-1.1.tar.gz","progressDetail":{"current":4719},"progress":" 4.719kB","id":"Downloading context"}
{"stream":"Step 1/7 : FROM golang:1.11"}
{"stream":"\n"}
{"stream":" ---\u003e 28daaf3edbdb\n"}
{"stream":"Step 2/7 : ENV GO_PATH=/go/src/"}
{"stream":"\n"}
{"stream":" ---\u003e Running in 2ce99db89d68\n"}
{"stream":"Removing intermediate container 2ce99db89d68\n"}
{"stream":" ---\u003e 5d96a6cb3d7b\n"}
{"stream":"Step 3/7 : ENV CON_PATH=/go/src/git.phjr.com/contract-server"}
{"stream":"\n"}
......
{"stream":" ---\u003e Running in 82573697eedf\n"}
{"stream":"Removing intermediate container 82573697eedf\n"}
{"stream":" ---\u003e 3c470596b89e\n"}
{"aux":{"ID":"sha256:3c470596b89e4ee7a9a63e69fb6624f44a2a84f5974aab15af1d1964bd59ade4"}}
{"stream":"Successfully built 3c470596b89e\n"}
{"stream":"Successfully tagged contract:1.1\n"}

[root@localhost /]# docker images
REPOSITORY                    TAG                            IMAGE ID            CREATED             SIZE
contract                      1.1                            3c470596b89e        12 seconds ago      837MB

响应状态码解释

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

2.4 检查镜像

获取关于镜像的底层信息

GET /images/{name}/json

URL:

  • /images/{name}/json

路径参数:

  • name: 镜像名称或ID

请求示例:

响应结果

[root@localhost ~]# curl http://127.0.0.1:6666/images/8bc2104b9569/json | python -mjson.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2420    0  2420    0     0   557k      0 --:--:-- --:--:-- --:--:--  590k
{
    "Architecture": "amd64",
    "Author": "",
    "Comment": "",
    "Config": {
        "ArgsEscaped": true,
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "/bin/sh",
            "-c",
            "/mnt/wasm /mnt/compare.wasm 1 1"
        ],
        "Domainname": "",
        "Entrypoint": null,
        "Env": [
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "SRC_DIR=/go/src/git.phjr.com"
        ],
        "Hostname": "",
        "Image": "sha256:996598012bcb1435d8e801cc3bc7041cb257f958095ff9c52f181c22ffbf24f6",
        "Labels": null,
        "OnBuild": null,
        "OpenStdin": false,
        "StdinOnce": false,
        "Tty": false,
        "User": "",
        "Volumes": null,
        "WorkingDir": ""
    },
    "Container": "1dfcec665a0479c6519ffdea5516bc619b70a154114700d46ba583f44074ee12",
    "ContainerConfig": {
        "ArgsEscaped": true,
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "/bin/sh",
            "-c",
            "#(nop) ",
            "CMD [\"/bin/sh\" \"-c\" \"/mnt/wasm /mnt/compare.wasm 1 1\"]"
        ],
        "Domainname": "",
        "Entrypoint": null,
        "Env": [
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "SRC_DIR=/go/src/git.phjr.com"
        ],
        "Hostname": "1dfcec665a04",
        "Image": "sha256:996598012bcb1435d8e801cc3bc7041cb257f958095ff9c52f181c22ffbf24f6",
        "Labels": {},
        "OnBuild": null,
        "OpenStdin": false,
        "StdinOnce": false,
        "Tty": false,
        "User": "",
        "Volumes": null,
        "WorkingDir": ""

响应结果解释

  • 200 没有错误
  • 404 没有这个镜像
  • 500 服务器错误

2.5 获取镜像的历史记录

每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像,这条请求就是查看最终镜像的镜像层记录

GET /images/{name}/history

URL:

  • /images/{name}/history

路径参数:

  • name: 镜像的名称或者ID

请求示例

响应结果

[root@localhost ~]# curl http://10.20.29.26:6666/images/8bc2104b9569/history |python -mjson.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1356  100  1356    0     0   287k      0 --:--:-- --:--:-- --:--:--  331k
[
    {
        "Comment": "",
        "Created": 1554895762,
        "CreatedBy": "/bin/sh -c #(nop)  CMD [\"/bin/sh\" \"-c\" \"/mnt/wasm /mnt/compare.wasm 1 1\"]",
        "Id": "sha256:8bc2104b95693541c31524ba25b7819af14b45360c0efa0c7d5b69344050a96b",
        "Size": 0,
        "Tags": [
            "basis:latest"
        ]
    },
    {
        "Comment": "",
        "Created": 1554895762,
        "CreatedBy": "/bin/sh -c #(nop) COPY file:c4cd840b1e62e31e6717e6ae158d6533291637acab1efaa4b77f6d7185181cd5 in /mnt/ ",
        "Id": "sha256:996598012bcb1435d8e801cc3bc7041cb257f958095ff9c52f181c22ffbf24f6",
        "Size": 2444971,
        "Tags": null
    },
    {
        "Comment": "",
        "Created": 1554895761,
        "CreatedBy": "/bin/sh -c #(nop) COPY file:8cc7ec5e2f20daf71d43c8467d3ab0419c50e6d694510d02329be966e7c6f75c in /mnt/ ",
        "Id": "sha256:f766d15551a2f5e9f9450f2f7cafdc959bf80de69a6d612946b9569b42ef7961",
        "Size": 4391090,
        "Tags": null
    },
    {
        "Comment": "",
        "Created": 1554895759,
        "CreatedBy": "/bin/sh -c #(nop)  ENV SRC_DIR=/go/src/git.phjr.com",
        "Id": "sha256:20e3faf18f3500632d1496f3d1034d84cd856669f5470a49b7cf36e80938fa6f",
        "Size": 0,
        "Tags": null
    },
    {
        "Comment": "",
        "Created": 1554852018,
        "CreatedBy": "/bin/sh -c #(nop)  CMD [\"/bin/sh\"]",
        "Id": "sha256:cdf98d1859c1beb33ec70507249d34bacf888d59c24df3204057f9a6c758dddb",
        "Size": 0,
        "Tags": [
            "alpine:latest"
        ]
    },

响应状态码解释:

  • 200 镜像层列表
  • 404 没有这个镜像
  • 500 服务器错误

2.6 标记一个镜像

为一个镜像打一个标签

POST /images/{name}/tag

URL:

  • /images/{name}/tag

路径参数

  • name:镜像名称或者ID

查询参数:

  • repo:要标记的存储库的名称
  • tag:新标记的名称

请求示例:

响应结果:

[root@localhost ~]# curl -v -X POST http://10.20.29.26:6666/images/8bc2104b9569/tag?repo=10.20.29.45/myproject/basechain:1.1
* About to connect() to 10.20.29.26 port 6666 (#0)
*   Trying 10.20.29.26...
* Connected to 10.20.29.26 (10.20.29.26) port 6666 (#0)
> POST /images/8bc2104b9569/tag?repo=10.20.29.45/myproject/basechain:1.1 HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.20.29.26:6666
> Accept: */*
> 
< HTTP/1.1 201 Created
< Api-Version: 1.39
< Docker-Experimental: false
< Ostype: linux
< Server: Docker/18.09.4 (linux)
< Date: Thu, 11 Apr 2019 03:39:09 GMT
< Content-Length: 0
< 
* Connection #0 to host 10.20.29.26 left intact


[root@localhost ~]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
10.20.29.45/myproject/basechain   1.1                 8bc2104b9569        16 hours ago        12.4MB
basis                             latest              8bc2104b9569        16 hours ago        12.4MB

响应状态码解释

  • 201 没有错误
  • 400 参数错误
  • 409 冲突(例:新标签名称冲突)
  • 500 服务器错误

2.8 删除镜像

删除一个镜像,以及该镜像引用的任何未标记的父镜像

如果镜像具有子镜像、正在运行的容器使用该镜像或正在生成镜像,则无法删除该镜像

DELETE /images/{name}

URL:

  • /images/{name}

路径参数

  • name: 镜像名称或者ID

查询参数

  • force:即使被停止的容器或其他标记使用,也要删除镜像,默认为false

  • noprune:不能删除未加标签的父镜像,默认为false

请求示例

响应结果

[root@localhost ~]# curl -v -X DELETE http://127.0.0.1:6666/images/nginx:1.15
* About to connect() to 127.0.0.1 port 6666 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 6666 (#0)
> DELETE /images/nginx:1.15 HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1:6666
> Accept: */*
> 
< HTTP/1.1 200 OK
< Api-Version: 1.39
< Content-Type: application/json
< Docker-Experimental: false
< Ostype: linux
< Server: Docker/18.09.0 (linux)
< Date: Wed, 10 Apr 2019 22:59:19 GMT
< Content-Length: 379
< 
[{"Untagged":"nginx:1.15"},{"Untagged":"nginx@sha256:d14bbdf20f42375020c80315041ba252623b489966c5b5b0ce9d244fa4bf0400"},{"Deleted":"sha256:bb776ce48575796501bcc53e511563116132b789ab0552d520513da8c738cba2"},{"Deleted":"sha256:43e4bf6ebb72bc17f5f35af0ace5e5d5db31b2b631fac2cca3d4be2420ca9758"},{"Deleted":"sha256:2ceeec5cb749c4154ae2390bc3e0c2a4dee8663ca7012ca37a293734de83d498"}]
* Connection #0 to host 127.0.0.1 left intact

响应状态码解释

  • 200 镜像已成功删除
  • 404 没有这个镜像
  • 409 冲突(例如:镜像正在被某一个容器使用,没有使用强制删除)
  • 500 服务器错误

2.9 删除全部镜像

使用此方法可删除所有已停止的容器,请慎用!!!

相关推荐
通域14 分钟前
Docker Redis 7.2.3 部署
redis·docker·容器
生信圆桌3 小时前
使用 Docker 部署 RStudio 的终极教程
java·docker·容器
黄尚圈圈3 小时前
快速理解docker(一)docker 简介
docker·容器·eureka
风随心飞飞3 小时前
Docker 以外置数据库方式部署禅道
数据库·docker·容器
BBM的开源HUB3 小时前
Neko一个在Docker环境下的虚拟浏览器
chrome·docker·容器
甲柒5 小时前
03-Docker下载加速
运维·docker·容器
叫我DPT5 小时前
初始docker以及docker的基本使用!!!
docker·容器·镜像
lgily-12259 小时前
Docker与Kubernetes学习
后端·docker·kubernetes
行路见知9 小时前
Jenkins Pipeline 中通过勾选参数来控制是否构建 Docker 镜像
运维·docker·jenkins
W u 小杰10 小时前
Docker学习笔记
笔记·学习·docker