北京SEO

远程调用 Docker API的实现方法

2019/10/10/17:45:49  阅读:1931  来源:谷歌SEO算法  标签: 百度K站

下面来看一个远程调用 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 的说明:

  1. TheselibrarieshavenotbeentestedbytheDockerMaintainersforcompatibility.
  2. Pleasefileissueswiththelibraryowners.Ifyoufindmorelibraryimplementations,
  3. 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

先用命令行看看操作输出,没有正在运行中的容器.

  1. #dockerps
  2. CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

有一个已经关闭的容器:

  1. #dockerps-a
  2. CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
  3. 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')

获取当前运行的容器:

  1. In[3]:c.containers()
  2. Out[3]:[]

加了一个参数:all=True,代表列出所有运行、关闭的容器.

  1. In[4]:c.containers(all=True)
  2. Out[4]:
  3. [{u'Command':u'/bin/bash',
  4. u'Created':1410588586,
  5. u'Id':u'050f47812f2c1925439bbdefb479efb80bc1df007fc45ced1d74a9d483036e9b',
  6. u'Image':u'ubuntu:14.04',
  7. u'Names':[u'/hopeful_shockley'],
  8. u'Ports':[],
  9. u'Status':u'Exited(0)22hoursago'}]

docker 模块可以实现命令行的所有操作,具体使用方法参考 help、dir 的输出,或者查阅 docker-py 项目的文档.

让 Docker 监听端口,修改 Docker 服务启动参数,添加一个没有被占用的端口号:

  1. #vim/etc/default/docker
  2. DOCKER_OPTS='-Hdocker01.thstack.com:6732'

重启 Docker 服务生效:service docker restart,设置一个 DOCKER_HOST 环境变量,可以用主机名或 IP 地址,用主机名时候注意域名的解析,有防火墙的添加下面端口:

  1. #vim/etc/profile
  2. exportDOCKER_HOST=tcp://docker01.thstack.com:6732
  3. #source/etc/profile

验证:,可以在本机或其它主机用 Curl 来验证,也可以使用 chrome 浏览器插件 postman 来验证.

返回空:

  1. #curl-k-X'GET'http://docker01.thstack.com:6732/containers/json-H'Content-type:application/json'|python-mjson.tool
  2. 在url上加一个参数:all=1,获取所有的container
  3. #curl-k-X'GET'http://docker01.thstack.com:6732/containers/json?all=1-H'Content-type:application/json'|python-mjson.tool
  4. %Total%Received%XferdAverageSpeedTimeTimeTimeCurrent
  5. DloadUploadTotalSpentLeftSpeed
  6. 10021810021800142730--:--:----:--:----:--:--14533
  7. [
  8. {
  9. "Command":"/bin/bash",
  10. "Created":1410588586,
  11. "Id":"050f47812f2c1925439bbdefb479efb80bc1df007fc45ced1d74a9d483036e9b",
  12. "Image":"ubuntu:14.04",
  13. "Names":[
  14. "/hopeful_shockley"
  15. ],
  16. "Ports":[],
  17. "Status":"Exited(0)23hoursago"
  18. }
  19. ]

具体 Docker Remote API 参数可以参考官方 API 文档:

https://docs.docker.com/reference/api/docker_remote_api_v1.14/

用 docker-py 来验证:

  1. #ipython
  2. In[1]:importdocker
  3. In[2]:c=docker.Client(base_url='http://docker01.thstack.com:6732')
  4. In[3]:c.containers(all=True)
  5. Out[3]:
  6. [{u'Command':u'/bin/bash',
  7. u'Created':1410588586,
  8. u'Id':u'050f47812f2c1925439bbdefb479efb80bc1df007fc45ced1d74a9d483036e9b',--phpfensi.com
  9. u'Image':u'ubuntu:14.04',
  10. u'Names':[u'/hopeful_shockley'],
  11. u'Ports':[],
  12. u'Status':u'Exited(0)23hoursago'}]
  13. In[4]:

现在的 Docker 守护进程默认只监听了端口,并没有开放 socket 入口,可以让两者同时工作:

  1. #vim/etc/default/docker
  2. DOCKER_OPTS='-Hunix:///var/run/docker.sock-Hdocker01.thstack.com:6732'
  3. #servicedockerrestart

现在我们在任何地方来连接、操作自己的 Docker 主机了.

广告内容

远程调用 Docker API的实现方法 远程调用 Docker API的实现方法 远程调用 Docker API的实现方法

相关阅读

热门评论

小浪SEO博客 小浪SEO博客

专注SEO优化思维、SEO技术的实战分享类博客~

总篇数183

精选文章

RMAN中catalog和nocatalog区别介绍 小技巧:为Linux下的文件分配多个权限 zimbra8.5.1安装第三方签名ssl证书的步骤 解决mysql不能远程连接数据库方法 windows服务器mysql增量备份批处理数据库 mysql中slow query log慢日志查询分析 JavaScript跨域问题总结 Linux下负载均衡软件LVS配置(VS/DR)教程 mysql中权限参数说明 MYSQL(错误1053)无法正常启动

SEO最新算法