28.4 编程开发

由于Docker服务端提供了REST风格的API,通过对这些API进一步地封装,可以提供给各种开发语言作为Docker的使用库。

这里以docker-py项目为例,介绍在Python语言中对Docker相关资源进行的操作。

1.安装docker-py


  1. $ sudo
  2. $ sudo pip install docker-py

安装后可以发现,代码结构十分清晰,主要提供了Client类,用来封装提供用户可以用Docker命令执行的各种操作,包括build、run、commit、create_container、info等接口。

对REST接口的调用使用了request库。对于这些API,用户也可以通过curl来进行调用测试。

2.使用示例

打开Python的终端,首先创建一个Docker客户端连接:


  1. $ sudo python
  2. >>> import docker
  3. >>> c = docker.Client(base_url='unix://var/run/docker.sock',version='1.15',timeout=10)

通过info()方法查看Docker系统信息:


  1. >>> c.info()
  2. {u'KernelVersion': u'3.13.0-24-generic', u'NFd': 19, u'MemoryLimit': 1, u'InitSha1':
  3. u'', u'SwapLimit': 0, u'Driver': u'aufs', u'IndexServerAddress': u'https://
  4. index.docker.io/v1/', u'NGoroutines': 27, u'Images': 200, u'InitPath':
  5. u'/usr/bin/docker', u'Containers': 2, u'ExecutionDriver': u'native-0.2',
  6. u'Debug': 0, u'NEventsListener': 0, u'DriverStatus': [[u'Root Dir', u'/var
  7. /lib/docker/aufs'], [u'Dirs', u'204']], u'OperatingSystem': u'Ubuntu 14.04.1
  8. LTS', u'IPv4Forwarding': 1}

通过images()和containers()方法可以查看本地的镜像和容器的列表:


  1. >>> c.images()
  2. [{u'Created': 1414108439, u'VirtualSize': 199257566, u'ParentId':
  3. u'22093c35d77bb609b9257ffb2640845ec05018e3d96cb939f68d0e19127f1723',
  4. u'RepoTags': [u'ubuntu:latest'], u'Id': u'5506de2b643be1e6febbf3b8a240760
  5. c6843244c41e12aa2f60ccbb7153d17f5', u'Size': 0}]
  6. >>> c.containers()
  7. [{u'Status': u'Up 5 seconds', u'Created': 1415086513, u'Image': u'ubuntu:latest',
  8. u'Ports': [], u'Command': u'/bin/bash', u'Names': [u'/romantic_blackwell'],
  9. u'Id': u'f51f2e4cc6df8829baa00018fe3a9e5112cc4d0786cc674d621e51ab795c9fd6'}]

通过create_container()方法来创建一个容器,之后启动它:


  1. >>> container = c.create_container(image='ubuntu:latest', command='bash')
  2. >>> print(container)
  3. {u'Id': u'a8439e4c8e64a94a287d408fdc3ff9a0b4a8577fe3b5e32975b790afb41414af',
  4. u'Warnings': None}
  5. >>> c.start(container='a8439e4c8e64a94a287d408fdc3ff9a0b4a8577fe3b5e32975b790afb41414af')

可见,所提供的方法与Docker提供的命令都十分类似。实际上,在执行Docker命令的时候,也是通过Docker提供的客户端进行了封装,并向服务端发起API请求。