远程调用 Docker API的实现方法
下面来看一个远程调用 Docker API的实现方法,希望文章可以帮助到各位深入的理解Docker API的使用方法.
Docker 的 API
API:Application Programe Interface, 应用程序访问接口,通过发布 API,我们的程序就可以在别的语言,平台中被调用,如果一个程序拥有 API,我们就可以为其开发 “客户端”,而不依赖某一个具体语言,当然也能集成到自己的平台,完成一些有趣的功能.
API 的主要类型:RESTful,基于 HTTP 协议,也能基于 RPC 协议.
所谓 RESTful,是指通过如HTTP协议封装的各种请求,主要包括 GET,POST,UPDATE,DELETE,PUT 等,保存创建,修改等操作,一般 RESTful 服务器提供这些请求的接口(地址,路径,参数,然后客户端可以通过过类似 Linux 命令 curl,Python 标准库 httplib、httplib2、urllib 等访问,需要注意的是,多数参数(数据)都是以 JSON/XML 打包,并且多数按照 token 方式验证请求权限和安全性,当然也支持其他类型的验证.
可以在 Docker 官网看到 Docker API 的介绍:
Docker Remote API
Docker Remote API Client Libraries(简称 rcli)
有何区别?
原生态 RESTful 标准,官方维护,支持最新的功能,支持各种语言的 SDK、Client 库,较 API 版本滞后.
和 OpenStack 的 python-*client 一样,rcli 无非就是对 Docker Remote API 的一种封装实现,由官方和第三方在维护,但并不保证兼容性.
下面是 官方 在介绍 rcli 的说明:
- TheselibrarieshavenotbeentestedbytheDockerMaintainersforcompatibility.
- Pleasefileissueswiththelibraryowners.Ifyoufindmorelibraryimplementations,
- pleaselisttheminDockerdocbugsandwewilladdthelibrarieshere.
需要注意的是,官方已经明确说明 Remote API 已经取代了 rcli:
https://docs.docker.com/reference/api/docker_remote_api
The Remote API is replacing rcli.
有精力的话完全可以自己封装一些方法.
远程调用 Docker API的实现方法
默认情况下 Docker 的守护进程启动会生成一个 socket(/var/run/docker.sock)进程通信文件,而并没有监听端口,只能在本机操作 Docker,如果想在其它地方操作 Docker 主机,就需要让 Docker 主机监听一个端口号,这样可以通过端口号就能实现远程操作.
直接和 Docker 守护进程通信
用 Python 来调用 API,Docker 提供了 Python API Client.
项目地址:https://github.com/docker/docker-py
在 Docker 主机上安装 docker-py:pip install docker-py
先用命令行看看操作输出,没有正在运行中的容器.
- #dockerps
- CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
有一个已经关闭的容器:
- #dockerps-a
- CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
- 050f47812f2cubuntu:14.04"/bin/bash"23hoursagoExited(0)22hoursagohopeful_shockley//phpfensi.com
用 API 方式重复上面命令行的操作,在 Python 交互里尝试调用:
# ipython
导入模块:In [1]: import docker
与 Docker 守护进程建立连接、通信:In [2]: c = docker.Client(base_url='unix:///var/run/docker.sock')
获取当前运行的容器:
- In[3]:c.containers()
- Out[3]:[]
加了一个参数:all=True,代表列出所有运行、关闭的容器.
- In[4]:c.containers(all=True)
- Out[4]:
- [{u'Command':u'/bin/bash',
- u'Created':1410588586,
- u'Id':u'050f47812f2c1925439bbdefb479efb80bc1df007fc45ced1d74a9d483036e9b',
- u'Image':u'ubuntu:14.04',
- u'Names':[u'/hopeful_shockley'],
- u'Ports':[],
- u'Status':u'Exited(0)22hoursago'}]
docker 模块可以实现命令行的所有操作,具体使用方法参考 help、dir 的输出,或者查阅 docker-py 项目的文档.
让 Docker 监听端口,修改 Docker 服务启动参数,添加一个没有被占用的端口号:
- #vim/etc/default/docker
- DOCKER_OPTS='-Hdocker01.thstack.com:6732'
重启 Docker 服务生效:service docker restart,设置一个 DOCKER_HOST 环境变量,可以用主机名或 IP 地址,用主机名时候注意域名的解析,有防火墙的添加下面端口:
- #vim/etc/profile
- exportDOCKER_HOST=tcp://docker01.thstack.com:6732
- #source/etc/profile
验证:,可以在本机或其它主机用 Curl 来验证,也可以使用 chrome 浏览器插件 postman 来验证.
返回空:
- #curl-k-X'GET'http://docker01.thstack.com:6732/containers/json-H'Content-type:application/json'|python-mjson.tool
- 在url上加一个参数:all=1,获取所有的container
- #curl-k-X'GET'http://docker01.thstack.com:6732/containers/json?all=1-H'Content-type:application/json'|python-mjson.tool
- %Total%Received%XferdAverageSpeedTimeTimeTimeCurrent
- DloadUploadTotalSpentLeftSpeed
- 10021810021800142730--:--:----:--:----:--:--14533
- [
- {
- "Command":"/bin/bash",
- "Created":1410588586,
- "Id":"050f47812f2c1925439bbdefb479efb80bc1df007fc45ced1d74a9d483036e9b",
- "Image":"ubuntu:14.04",
- "Names":[
- "/hopeful_shockley"
- ],
- "Ports":[],
- "Status":"Exited(0)23hoursago"
- }
- ]
具体 Docker Remote API 参数可以参考官方 API 文档:
https://docs.docker.com/reference/api/docker_remote_api_v1.14/
用 docker-py 来验证:
- #ipython
- In[1]:importdocker
- In[2]:c=docker.Client(base_url='http://docker01.thstack.com:6732')
- In[3]:c.containers(all=True)
- Out[3]:
- [{u'Command':u'/bin/bash',
- u'Created':1410588586,
- u'Id':u'050f47812f2c1925439bbdefb479efb80bc1df007fc45ced1d74a9d483036e9b',--phpfensi.com
- u'Image':u'ubuntu:14.04',
- u'Names':[u'/hopeful_shockley'],
- u'Ports':[],
- u'Status':u'Exited(0)23hoursago'}]
- In[4]:
现在的 Docker 守护进程默认只监听了端口,并没有开放 socket 入口,可以让两者同时工作:
- #vim/etc/default/docker
- DOCKER_OPTS='-Hunix:///var/run/docker.sock-Hdocker01.thstack.com:6732'
- #servicedockerrestart
现在我们在任何地方来连接、操作自己的 Docker 主机了.
热门评论