详解在Python和IPython中使用Docker


Posted in Python onApril 28, 2015

现在Docker是地球上最炙手可热的项目之一,就意味着人民实际上不仅仅是因为这个才喜欢它。

话虽如此,我非常喜欢使用容器,服务发现以及所有被创造出的新趣的点子和领域来切换工作作为范例。

这个文章中我会简要介绍使用python中的docker-py模块来操作Docker 容器,这里会使用我喜爱的编程工具IPython。

安装docker-py

首先需要docker-py。注意这里的案例中我将会使用Ubuntu Trusty 14.04版本。

$ pip install docker-py

IPyhton

我真的很喜欢用IPython来探索Python。 它像是一共高级的python Shell,但是可以做的更多。

$ sudo apt-get install ipython

SNIP!

$ ipython

Python 2.7.6 (default, Mar 22 2014, 22:59:56)

Type "copyright", "credits" or "license" for more information.
IPython 1.2.1 -- An enhanced Interactive Python.

?         -> Introduction and overview of IPython's features.

%quickref -> Quick reference.

help      -> Python's own help system.

object?   -> Details about 'object', use 'object??' for extra details.
In [1]:

安装 docker

如果没有安装Docker,那首先安装docker

$ sudo apt-get install docker.io

然后把 docker.io 起个别名 docker
$ alias docker='docker.io'

$ docker version

Client version: 0.9.1

Go version (client): go1.2.1

Git commit (client): 3600720

Server version: 0.9.1

Git commit (server): 3600720

Go version (server): go1.2.1

Last stable version: 0.11.1, please update docker

Docker现在应该有个socket开启,我们可以用来连接。
$ ls /var/run/docker.sock

/var/run/docker.sock

Pull 镜像

让我们下载 busybox镜像

$ docker pull busybox

Pulling repository busybox

71e18d715071: Download complete

98b9fdab1cb6: Download complete

1277aa3f93b3: Download complete

6e0a2595b580: Download complete

511136ea3c5a: Download complete

b6c0d171b362: Download complete

8464f9ac64e8: Download complete

9798716626f6: Download complete

fc1343e2fca0: Download complete

f3c823ac7aa6: Download complete

现在我们准备使用 docker-py 了。

使用 docker-py

现在我们有了docker-py , IPython, Docker 和 busybox 镜像,我们就能建立一些容器。

如果你不是很熟悉IPython,可以参照这个教程学习(http://ipython.org/ipython-doc/stable/interactive/tutorial.html),
IPython是十分强大的。

首先启动一个IPython ,导入docker模块。

$ ipython

Python 2.7.6 (default, Mar 22 2014, 22:59:56)

Type "copyright", "credits" or "license" for more information.
IPython 1.2.1 -- An enhanced Interactive Python.

?         -> Introduction and overview of IPython's features.

%quickref -> Quick reference.

help      -> Python's own help system.

object?   -> Details about 'object', use 'object??' for extra details.
In [1]: import docker

然后我们建立一个连接到Docker
In [2]: c = docker.Client(base_url='unix://var/run/docker.sock',

   ...:                   version='1.9',

   ...:                   timeout=10)

现在我们已经连接到Docker。

IPython使用tab键来补全的。 如果 输入 “c.” 然后按下tab键,IPython会显示Docker连接对象所有的方法和属性。

In [3]: c.

c.adapters                      c.headers                       c.pull

c.attach                        c.history                       c.push

c.attach_socket                 c.hooks                         c.put

c.auth                          c.images                        c.remove_container

c.base_url                      c.import_image                  c.remove_image

c.build                         c.info                          c.request

c.cert                          c.insert                        c.resolve_redirects

c.close                         c.inspect_container             c.restart

c.commit                        c.inspect_image                 c.search

c.containers                    c.kill                          c.send

c.cookies                       c.login                         c.start

c.copy                          c.logs                          c.stop

c.create_container              c.max_redirects                 c.stream

c.create_container_from_config  c.mount                         c.tag

c.delete                        c.options                       c.top

c.diff                          c.params                        c.trust_env

c.events                        c.patch                         c.verify

c.export                        c.port                          c.version

c.get                           c.post                          c.wait

c.get_adapter                   c.prepare_request

c.head                          c.proxies

让我们来看下c.images 我输入一个 “?”在c.之后,ipython 会提供这个对象的详细信息。
In [5]: c.images?

Type:       instancemethod

String Form:<bound method Client.images of <docker.client.Client object at 0x7f3acc731790>>

File:       /usr/local/lib/python2.7/dist-packages/docker/client.py

Definition: c.images(self, name=None, quiet=False, all=False, viz=False)

Docstring:  <no docstring>

获取busybox 镜像。
In [6]: c.images(name="busybox")

Out[6]:

[{u'Created': 1401402591,

  u'Id': u'71e18d715071d6ba89a041d1e696b3d201e82a7525fbd35e2763b8e066a3e4de',

  u'ParentId': u'8464f9ac64e87252a91be3fbb99cee20cda3188de5365bec7975881f389be343',

  u'RepoTags': [u'busybox:buildroot-2013.08.1'],

  u'Size': 0,

  u'VirtualSize': 2489301},

 {u'Created': 1401402590,

  u'Id': u'1277aa3f93b3da774690bc4f0d8bf257ff372e23310b4a5d3803c180c0d64cd5',

  u'ParentId': u'f3c823ac7aa6ef78d83f19167d5e2592d2c7f208058bc70bf5629d4bb4ab996c',

  u'RepoTags': [u'busybox:ubuntu-14.04'],

  u'Size': 0,

  u'VirtualSize': 5609404},

 {u'Created': 1401402589,

  u'Id': u'6e0a2595b5807b4f8c109f3c6c5c3d59c9873a5650b51a4480b61428427ab5d8',

  u'ParentId': u'fc1343e2fca04a455f803ba66d1865739e0243aca6c9d5fd55f4f73f1e28456e',

  u'RepoTags': [u'busybox:ubuntu-12.04'],

  u'Size': 0,

  u'VirtualSize': 5454693},

 {u'Created': 1401402587,

  u'Id': u'98b9fdab1cb6e25411eea5c44241561326c336d3e0efae86e0239a1fe56fbfd4',

  u'ParentId': u'9798716626f6ae4e6b7f28451c0a1a603dc534fe5d9dd3900150114f89386216',

  u'RepoTags': [u'busybox:buildroot-2014.02', u'busybox:latest'],

  u'Size': 0,

  u'VirtualSize': 2433303}]

建立一个容器。 注意我添加一个可以将要运行的命令,这里用的是”env”命令。
In [8]: c.create_container(image="busybox", command="env")

Out[8]:

{u'Id': u'584459a09e6d4180757cb5c10ac354ca46a32bf8e122fa3fb71566108f330c87',

 u'Warnings': None}

使用ID来启动这个容器
In [9]: c.start(container="584459a09e6d4180757cb5c10ac354ca46a32bf8e122fa3fb71566108f330c87")

我们可以检查日志,应该可以看到当容器创建的时候 ,我们配置的”env”命令的输出。
In [11]: c.logs(container="584459a09e6d4180757cb5c10ac354ca46a32bf8e122fa3fb71566108f330c87")

Out[11]: 'HOME=/\nPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nHOSTNAME=584459a09e6d\n'

如果使用docker命令行,使用同样的命令行选项运行一个容器,应该可以看到类似的信息。
$ docker run busybox env

HOME=/

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

HOSTNAME=ce3ad38a52bf

据我所知,docker-py没有运行选项,我们只能创建一个容器然后启动它。

以下是一个案例:

In [17]: busybox = c.create_container(image="busybox", command="echo hi")
In [18]: busybox?

Type:       dict

String Form:{u'Id': u'34ede853ee0e95887ea333523d559efae7dcbe6ae7147aa971c544133a72e254', u'Warnings': None}

Length:     2

Docstring:

dict() -> new empty dictionary

dict(mapping) -> new dictionary initialized from a mapping object's

    (key, value) pairs

dict(iterable) -> new dictionary initialized as if via:

    d = {}

    for k, v in iterable:

        d[k] = v

dict(**kwargs) -> new dictionary initialized with the name=value pairs

    in the keyword argument list.  For example:  dict(one=1, two=2)
In [19]: c.start(busybox.get("Id"))
In [20]: c.logs(busybox.get("Id"))

Out[20]: 'hi\n'

如果你还没有使用过busybox镜像,我建议你使用下。我也建议debain下的jessie镜像,它只有120MB,比Ubuntu镜像要小。

总结

Docker是一个吸引人的新系统,可以用来建立有趣的新技术应用,特别是云服务相关的。使用IPython我们探索了怎么使用
docker-py模块来创建docker 容器。 现在使用python,我们可以结合docker和容易 创造出很多新的点子。

Python 相关文章推荐
python3.0 字典key排序
Dec 24 Python
python局域网ip扫描示例分享
Apr 03 Python
python数据结构之列表和元组的详解
Sep 23 Python
python3中获取文件当前绝对路径的两种方法
Apr 26 Python
Python设计模式之工厂方法模式实例详解
Jan 18 Python
django 自定义过滤器的实现
Feb 26 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
Django实现网页分页功能
Oct 31 Python
Python性能分析工具Profile使用实例
Nov 19 Python
tensorflow使用指定gpu的方法
Feb 04 Python
Django Path转换器自定义及正则代码实例
May 29 Python
教你如何使用Python开发一个钉钉群应答机器人
Jun 21 Python
在Python程序中进行文件读取和写入操作的教程
Apr 28 #Python
介绍Python中的文档测试模块
Apr 28 #Python
Django中几种重定向方法
Apr 28 #Python
详解Python的单元测试
Apr 28 #Python
Python xlrd读取excel日期类型的2种方法
Apr 28 #Python
Python发送email的3种方法
Apr 28 #Python
Python中使用partial改变方法默认参数实例
Apr 28 #Python
You might like
php支付宝接口用法分析
2015/01/04 PHP
php简单图像创建入门实例
2015/06/10 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
2017/09/18 Javascript
three.js 入门案例详解
2018/01/23 Javascript
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
javascript 高级语法之继承的基本使用方法示例
2019/11/11 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
django模板语法学习之include示例详解
2017/12/17 Python
python构建深度神经网络(续)
2018/03/10 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
使用python实现简单五子棋游戏
2019/06/18 Python
python读取并定位excel数据坐标系详解
2019/06/26 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
python破解同事的压缩包密码
2020/10/14 Python
CSMA/CD介质访问控制协议
2015/11/17 面试题
药品采购员岗位职责
2014/02/08 职场文书
网站美工岗位职责
2014/04/02 职场文书
小区门卫岗位职责范本
2014/08/24 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
教代会闭幕词
2015/01/28 职场文书
武侯祠导游词
2015/02/04 职场文书
大学生十八大感想
2015/08/11 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
素质教育培训心得体会
2016/01/19 职场文书
如何利用python实现Simhash算法
2022/06/28 Python