首页 > 系统 > Linux > 正文

远程调用 Docker API的实现方法

2024-08-27 23:59:20
字体:
来源:转载
供稿:网友

下面来看一个远程调用 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. These libraries have not been tested by the Docker Maintainers for compatibility.  
  2. Please file issues with the library owners. If you find more library implementations,  
  3. 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

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

  1. # docker ps 
  2. CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 

有一个已经关闭的容器:

  1. # docker ps -a 
  2. CONTAINER ID        IMAGE               COMMAND             CREATED                 STATUS                    PORTS               NAMES 
  3. 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')                      

获取当前运行的容器:

  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) 22 hours ago'}] 

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

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

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

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

  1. # vim /etc/profile 
  2. export DOCKER_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 % Xferd  Average Speed   Time    Time     Time  Current 
  5.                                  Dload  Upload   Total   Spent    Left  Speed 
  6. 100   218  100   218    0     0  14273      0 --:--:-- --:--:-- --:--:-- 14533 
  7.     { 
  8.         "Command": "/bin/bash", 
  9.         "Created": 1410588586, 
  10.         "Id": "050f47812f2c1925439bbdefb479efb80bc1df007fc45ced1d74a9d483036e9b", 
  11.         "Image": "ubuntu:14.04", 
  12.         "Names": [ 
  13.             "/hopeful_shockley" 
  14.         ], 
  15.         "Ports": [], 
  16.         "Status": "Exited (0) 23 hours ago" 
  17.     } 

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

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

用 docker-py 来验证:

  1. # ipython 
  2. In [1]: import docker 
  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',  --Vevb.com 
  9.   u'Image': u'ubuntu:14.04'
  10.   u'Names': [u'/hopeful_shockley'], 
  11.   u'Ports': [], 
  12.   u'Status': u'Exited (0) 23 hours ago'}] 
  13. In [4]:  

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

  1. # vim /etc/default/docker 
  2. DOCKER_OPTS='-H unix:///var/run/docker.sock -H docker01.thstack.com:6732' 
  3. # service docker restart 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表