使用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 相关文章推荐
Python实现Windows上气泡提醒效果的方法
Jun 03 Python
Python比较2个时间大小的实现方法
Apr 10 Python
Python反射和内置方法重写操作详解
Aug 27 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
python计算无向图节点度的实例代码
Nov 22 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 Python
基于Python爬取素材网站音频文件
Oct 21 Python
python操作toml文件的示例代码
Nov 27 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
Jan 13 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 Python
pytorch实现加载保存查看checkpoint文件
Jul 15 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
PHP的FTP学习(二)
2006/10/09 PHP
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
PHP下打开URL地址的几种方法小结
2010/05/16 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
js完美的div拖拽实例代码
2014/01/22 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
js编写一个简单的产品放大效果代码
2016/06/27 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
VUE 全局变量的几种实现方式
2018/08/22 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
python使用knn实现特征向量分类
2018/12/26 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
基于django传递数据到后端的例子
2019/08/16 Python
Django实现分页显示效果
2019/10/31 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
html5简介_动力节点Java学院整理
2017/07/07 HTML / CSS
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
中介公司区域经理岗位职责范本
2014/03/02 职场文书
教育读书笔记
2015/07/02 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript