使用IPython来操作Docker容器的入门指引


Posted in Python onApril 08, 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 相关文章推荐
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
Jan 17 Python
python基础练习之几个简单的游戏
Nov 10 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
Jan 04 Python
python实现用户答题功能
Jan 17 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
TensorFlow用expand_dim()来增加维度的方法
Jul 26 Python
利用Python如何批量更新服务器文件
Jul 29 Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
jupyter 导入csv文件方式
Apr 21 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
Python 绘制可视化折线图
Jul 22 Python
仅用50行Python代码实现一个简单的代理服务器
Apr 08 #Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 #Python
Python 创建子进程模块subprocess详解
Apr 08 #Python
Python中使用gzip模块压缩文件的简单教程
Apr 08 #Python
Python使用scrapy抓取网站sitemap信息的方法
Apr 08 #Python
Python中用format函数格式化字符串的用法
Apr 08 #Python
简单介绍Python中的JSON模块
Apr 08 #Python
You might like
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
PHP调用三种数据库的方法(2)
2006/10/09 PHP
PHP性能优化准备篇图解PEAR安装
2011/12/05 PHP
php 三大特点:封装,继承,多态
2017/02/19 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
HTML-CSS群中单选引发的“事件”
2007/03/05 Javascript
JS 继承实例分析
2008/11/04 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
快速搭建vue2.0+boostrap项目的方法
2018/04/09 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
virtualenv实现多个版本Python共存
2017/08/21 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
2019/07/19 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
python离线安装外部依赖包的实现
2020/02/13 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
Django实现简单的分页功能
2021/02/22 Python
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
Solaris操作系统的线程机制
2015/07/28 面试题
检举信的格式及范文
2014/04/04 职场文书
节水倡议书范文
2014/04/15 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
蜗居观后感
2015/06/11 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers