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,在某些参数上甚至格式上都有可能产生较大变化

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号