下面来看一个远程调用 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 的说明:
- These libraries have not been tested by the Docker Maintainers for compatibility.
- Please file issues with the library owners. If you find more library implementations,
- please list them in Docker doc bugs and we will add the libraries here.
需要注意的是,官方已经明确说明 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
先用命令行看看操作输出,没有正在运行中的容器.
- # docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
有一个已经关闭的容器:
- # docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 050f47812f2c ubuntu:14.04 "/bin/bash" 23 hours ago Exited (0) 22 hours ago hopeful_shockley //Vevb.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) 22 hours ago'}]
docker 模块可以实现命令行的所有操作,具体使用方法参考 help、dir 的输出,或者查阅 docker-py 项目的文档.
让 Docker 监听端口,修改 Docker 服务启动参数,添加一个没有被占用的端口号:
- # vim /etc/default/docker
- DOCKER_OPTS='-H docker01.thstack.com:6732'
重启 Docker 服务生效:service docker restart,设置一个 DOCKER_HOST 环境变量,可以用主机名或 IP 地址,用主机名时候注意域名的解析,有防火墙的添加下面端口:
- # vim /etc/profile
- export DOCKER_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 % Xferd Average Speed Time Time Time Current
- Dload Upload Total Spent Left Speed
- 100 218 100 218 0 0 14273 0 --:--:-- --:--:-- --:--:-- 14533
- [
- {
- "Command": "/bin/bash",
- "Created": 1410588586,
- "Id": "050f47812f2c1925439bbdefb479efb80bc1df007fc45ced1d74a9d483036e9b",
- "Image": "ubuntu:14.04",
- "Names": [
- "/hopeful_shockley"
- ],
- "Ports": [],
- "Status": "Exited (0) 23 hours ago"
- }
- ]
具体 Docker Remote API 参数可以参考官方 API 文档:
https://docs.docker.com/reference/api/docker_remote_api_v1.14/
用 docker-py 来验证:
- # ipython
- In [1]: import docker
- 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', --Vevb.com
- u'Image': u'ubuntu:14.04',
- u'Names': [u'/hopeful_shockley'],
- u'Ports': [],
- u'Status': u'Exited (0) 23 hours ago'}]
- In [4]:
现在的 Docker 守护进程默认只监听了端口,并没有开放 socket 入口,可以让两者同时工作:
- # vim /etc/default/docker
- DOCKER_OPTS='-H unix:///var/run/docker.sock -H docker01.thstack.com:6732'
- # service docker restart
现在我们在任何地方来连接、操作自己的 Docker 主机了.
新闻热点
疑难解答