Docker(5) API

目前Docker提供了三类Restful API:

Docker Remote Api   诸如docker run 等操作最终通过调用Docker Remote API向Docker daemon发起请求

Docker Registry Api  与镜像存储有关的操作可通过Docker Registry API 来完成的

Docker Hub API 用户管理操作

配置可以远程访问Docker daemon(Server) 远程访问

1:Centos系统配置

需要在   /etc/sysconfig/docker  中修改other_args

other_args="--graph=/software/data/docker/ -H tcp://0.0.0.0:5678 -H unix:///var/run/docker.sock"

还需要在启动脚本中添加 [标红的就是添加的]

    if ! [ -f $pidfile ]; then
        prestart
        printf "Starting $prog:\t"
        echo "\n$(date)\n" >> $logfile
        $exec -d --insecure-registry 192.168.29.16:5000 $other_args &>> $logfile &
        pid=$!

 

2)Ubantu配置

需要在/etc/default/docker.io  中修改DOCKER_OPTS

DOCKER_OPTS="-H tcp://0.0.0.0:5678 -H unix:///var/run/docker.sock"

然后进行测试一下

[root@linux-node2 opt]# docker -H localhost:5678 version
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d/1.7.1
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d/1.7.1
OS/Arch (server): linux/amd64

###这里可以遇到一个在使用api过程中,经常出现的问题,-----curl链接服务器失败,错误代码为502,遇到这种情况,可通过curl命令加-v参数来获取相关的信息

例如:

[root@linux-node2 opt]# curl -v -X GET localhost:5678/_ping
* About to connect() to localhost port 5678 (#0)
*   Trying ::1... connected
* Connected to localhost (::1) port 5678 (#0)
> GET /_ping HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: localhost:5678
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Thu, 06 Jul 2017 08:46:35 GMT
< Content-Length: 2
< Content-Type: text/plain; charset=utf-8
< 
* Connection #0 to host localhost left intact
* Closing connection #0

 1.API初级示例一

获取docker镜像列表   -----》对应docker 命令  docker images

-Endpoint  --GET/imgaes/josn

-cli命令   --docker imgaes

curl -XGET 127.0.0.1:5678/images/json | python -mjson.tool

---得到很多值:

其中Size:指的是改层镜像   VirtualSize:相较于上一层所增加的大小  单位都是字节

2.API初级示例二

从容器中拷贝文件到容器外API

-Endpoint  -POST/containers/PID/COPY

-cli命令  -docker cp

curl -k -X POST http://192.168.29.16:5678/containers/9b10f20e885d/copy -H "Content-Type: application/json" -d '{"Resource":"/0707"}' | tar x

0707也可以是容器中的一个目录

该API返回的是一个流,因此想要获得返回的文件,则需要在curl命令后将其传递给tar做提取动作

如果你需要获取tar包,则可以通过重定向的方式,将数据流导入另一个文件保存

curl -k -X POST http://localhost:5678/containers/d59de61e083d/copy \
-H "Content-Type: application/json" -d '{"Resource":"/sayhi"}' >
tmpfile

3.API中级示例(1)

下面示例中都使用了exec的方式来做

[root@linux-node2 ~]# docker exec 9b10f20e885d ls /usr/
bin
etc
games
include
lib
lib64
libexec
local
sbin
share
src
tmp

接下来让我们构建API

-Endpoint      --POST/containers/(id)/exec

-Endpoint      --POST/exec/(id)/start

-Cli命令  -docker exec 

利用API查询到任务ID

[root@linux-node1 ~]# curl -XPOST -H "Content-Type: application/json" http://192.168.29.16:5678/containers/9b10f20e885d/exec -d '{"AttachStdin": false,"AttachStdout": true,"AttachStderr":true,"Tty":false,"Cmd": ["ls","/usr"]}'
{"Id":"5197e2df672272fcf8de7f04a53545b061d2e9127eb2ae8d8cfe08bec58205d1"}

说明:

使用这个参数来处理exec返回的数据

  AttachStdin:标准输出流

  AttachStderr:标准错误流

  Cmd: 是一个数组,也就是列表  

    不仅可以给其传递单独的命令,也可以传例子中的"ls /usr"  ,也可以传输错误命令。如果顺利,最后该api会返回状态码201,并通过JSON数据格式返回exec示例ID

  detach:下面有单独解释

根据返回的ID查询结果

curl -XPOST -H "Content-Type: application/json" http://192.168.29.16:5678/exec/c130eea4c6cd1e946a1c095ee808828319078e747111d00f4aecb55e5f5fc2c8/start -d '{"Detach":false,"Tty":false}'

这里注意:对于第一个API,可通过容器的ID制定需要在哪一个容器中创建exec实例,但制定的容器必须处于运行状态,否则就会报错误 "Container *** is not running"

监控容器的状态

docker inspect 9b10f20e885d
##就可以查看到容器的状态,

Api的方式

 curl -XGET http://localhost:5678/containers/9b10f20e885d/json | python -mjson.tool

所有这些实例都会随着容器的退出而消失,如果 9b10f20e885d 容器退出了。当你再次执行 inspect的时候或者调用API操作,那返回值中的ExecIDs会成为null

例子:

##试着请求一个关闭状态的容器

[root@linux-node2 ~]# docker inspect 77fd458200d7 | grep ExecIDs
    "ExecIDs": null,

 不同于image,container,history等API,由于docker目前还不支持exec实例的短ID方式,因此必须填写一个全长度的exec实例ID

exec的detach参数

若设置为true,则api会直接返回,不会得到任何信息,因为一般设置为false

4.API中级(2)

目前可以用两种方式来构建Docker镜像

  通过docker commit命令构建

  通过docker build命令解析Dockerfile文件

接下来用API的方式来调用dockerfile构建一个docker镜像,

  Endpoint  --POST/build

  对于CLI命令  -docker build

1)创建一个Dockerfile文件

[root@linux-node1 soft]# cat Dockerfile
FROM nginx:v1
RUN touch newFile
CMD ["date"]

2)打包

tar -cf Dockerfile.tar Dockerfile 

3)执行API build生成

curl -v -XPOST -H "Content-Type: application/tar" --data-binary @Dockerfile.tar http://192.168.29.16:5678/build?t=mynginx:mynginx

#t :是指打镜像名称:镜像标签

这个api的例子,是传递的数据为一个tar包流.

4)测试是否按照Dockerfile文件来生成镜像

[root@linux-node2 ~]# docker run mynginx:mynginx ls | grep newFile
newFile
[root@linux-node2 ~]# docker run mynginx:mynginx
Wed Jul 12 06:11:57 UTC 2017

API的高级应用

用法:找准Endpoint,然后根据正确的格式传递参数,最后以正确的格式处理返回值

需求的增加

1)当有需求是设置对外端口

[root@linux-node1 soft]# cat Dockerfile
FROM ubuntu:12.04
ADD server.py /bin/
EXPOSE 22222
CMD ["server.py"]

2)目录结构

$ pwd
/tmp/newdir
$ tar -cf Zeus.tar Dockerfile server.py
$ find .
.
./server.py
./Zeus.tar
./Dockerfile

3)api生成镜像

curl -XPOST -H "Content-Type: application/tar" --data-binary
@Zeus.tar \
http://192.168.29.16:5678/build?t=earth/zeus

一:push镜像到Registry

  Endpont  ---POST/images/(name)/tag

  对应的CLI命令  --docker tag

 本地我配置的Registry的端口是5000。

Docker规定

  1:push镜像的时候,需要指定Registry服务器的名称,因此还需要另给生成的镜像打一个tag,

  2:如果要将镜像push到第三方Registry,那么镜像中必须包含该Registry的地址

curl -XPOST http://192.168.29.16:5678/images/mynginx:mynginx/tag?repo=192.168.29.16:5000/mynginx/v2


##mynginx:mynginx :就是你的镜像名字
##repo: 后面跟着你传给私有仓库打的tag名字

 pull到本地镜像

curl -XPOST -H "X-Registry-Auth: $XRA" http://192.168.29.16:5678/images/create?fromImage=192.168.29.16:5000/nginx:v1

##pull镜像的时候,会持续收到服务器返回的用户刷新pull进度条的大量信息并打印,因为会可能造成卡屏

二:运行容器

1.根据基础镜像创建容器

  Endpoint  -POST/containers/create

  对应CLI命令  -docker create

###有很多丰富的参数以满足不同的功能需求

示例:

1)创建一个容器

curl -XPOST -H "Content-Type: application/json" http://192.168.29.16:5678/containers/create -d '{
"Hostname":"Cybertron",
"User":"root",
"Memory":'16777216',
"AttachStdin":false,
"AttachStdout":true,
"AttachStderr":true,
"PortSpecs":null,
"Tty":true,
"OpenStdin":true,
"StdinOnce":false,
"Image":"nginx:v1","MemorySwap":0}'

{"Id":"9915b155e7d6e870c265c235e6cb80babb5af9566e5804b090cd4b39975bb550","Warnings":["Your kernel does not support swap limit capabilities, memory limited without swap."]}

如果顺利,则会生成容器的ID,此时容器处于未运行状态,接下来需要调用容器API来重启

2)运行容器

  Endporint  -POST/containers/(id)/start

  对应的CLI命令  -docker start

更具ID 然后启动容器,这里可以取6位数的ID号

curl -XPOST http://192.168.29.16:5678/containers/9915b155e7d/start     

这里因为我的基础镜像是已经做好的nginx,基础镜像中把端口映射出去了。所有利用api生成新的容器时,也可以访问端口

--对于不同版本的API,在某些参数上甚至格式上都有可能产生较大变化

 

posted @ 2017-07-06 16:50  所有的梦想都画在墙上  阅读(1099)  评论(1)    收藏  举报