远程调用 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
用 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',
  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 主机了

时间: 2024-10-07 10:17:10

远程调用 Docker API的实现方法的相关文章

Android工作实践总结:Aidl 远程调用(aidl实例总结)

在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦. AIDL(AndRoid接口描述语言)是一种借口描述语言;

rmi-如何使用ant+maven实现远程调用接口

问题描述 如何使用ant+maven实现远程调用接口 该如何用ant+maven来实现rmi接口远程调用?也就是说在java工程里写业务代码,然后在web工程里通过远程调用java工程里的方法?请指教

Python实现远程调用MetaSploit的方法_python

本文较为详细的讲述了Python实现远程调用MetaSploit的方法,对Python的学习来说有很好的参考价值.具体实现方法如下: (1)安装Python的msgpack类库,MSF官方文档中的数据序列化标准就是参照msgpack. root@kali:~# apt-get install python-setuptools root@kali:~# easy_install msgpack-python   (2)创建createdb_sql.txt: create database msf

jax_ws 客户端远程调用方法时必须使用wsimport命令生成接口代码

问题描述 jax_ws 客户端远程调用方法时必须使用wsimport命令生成接口代码 jax_ws 客户端远程调用方法时,不生成服务端的代码如何实现?

如何远程调用Access数据库方法详解

  如何远程调用Access数据库方法详解: 使用了TCP/IP,ADO及XML(需要安装Microsoft XML 4.0.).分服务器和客户端两部分,服务器可以多用户同时连接.远程连接Access数据库有很多方法,我以前已经比较详细的回答过(见下面所列的5种方法),我现在这个例子属于其中的第3种方法(不需要使用RDS或Web服务器). 远程连接access数据库的几个方法: 1.建立VPN(Virtual Private Network),这样你的电脑和主机的连接就与局域网无异,然后把服务器

JQUERY中的ajax方法怎样通过JSONP进行远程调用

 这一节主要演示下在JQUERY中的ajax方法怎样通过JSONP进行远程调用,需要的朋友可以参考下 关于JSONP的概念和为什么要使用JSONP网上已经有很多教程,这一节主要演示下在JQUERY中的ajax方法怎样通过JSONP进行远程调用    首先介绍下$.ajax的参数  type:请求方式 GET/POST  url:请求地址  async:布尔类型,默认为true 表示请求是否为异步,如果为false表示为同步.  dataType:返回的数据类型  jsonp:传递给请求处理程序或

jquery中的ajax方法怎样通过JSONP进行远程调用_jquery

关于JSONP的概念和为什么要使用JSONP网上已经有很多教程,这一节主要演示下在JQUERY中的ajax方法怎样通过JSONP进行远程调用 首先介绍下$.ajax的参数 type:请求方式 GET/POST url:请求地址 async:布尔类型,默认为true 表示请求是否为异步,如果为false表示为同步. dataType:返回的数据类型 jsonp:传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback) jsonpCallback:自定义的js

在jquery中的ajax方法怎样通过JSONP进行远程调用_jquery

关于JSONP的概念和为什么要使用JSONP网上已经有很多教程,这一节主要演示下在JQUERY中的ajax方法怎样通过JSONP进行远程调用 首先介绍下$.ajax的参数 type:请求方式 GET/POST url:请求地址 async:布尔类型,默认为true 表示请求是否为异步,如果为false表示为同步. dataType:返回的数据类型 jsonp:传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback) jsonpCallback:自定义的js

架构师之路-在Dubbo中开发REST风格的远程调用

概述 dubbo支持多种远程调用方式,例如dubbo RPC(二进制序列化 + tcp协议).http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持).hessian(二进制序列化 + http协议).WebServices (文本序列化 + http协议)等等,但缺乏对当今特别流行的REST风格远程调用(文本序列化 + http协议)的支持. 有鉴于此,我们基于标准的Java REST API--JAX-RS 2.0(Java API for REST