使用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 Web框架Flask信号机制(signals)介绍
Jan 01 Python
Python中type的构造函数参数含义说明
Jun 21 Python
python查看微信好友是否删除自己
Dec 19 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
python逐行读写txt文件的实例讲解
Apr 03 Python
python获取微信小程序手机号并绑定遇到的坑
Nov 19 Python
Python bytes string相互转换过程解析
Mar 05 Python
keras绘制acc和loss曲线图实例
Jun 15 Python
基于python实现生成指定大小txt文档
Jul 20 Python
在 Python 中使用 MQTT的方法
Aug 18 Python
python 网络编程要点总结
Jun 18 Python
python自动化测试之Selenium详解
Mar 13 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
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
php实现两个数组相加的方法
2015/02/17 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
写了个监控nginx进程的Python脚本
2012/05/10 Python
Python创建文件和追加文件内容实例
2014/10/21 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
对pandas里的loc并列条件索引的实例讲解
2018/11/15 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
基于Python在MacOS上安装robotframework-ride
2018/12/28 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
纽约手袋品牌:KARA
2018/03/18 全球购物
expedia比利时:预订航班+酒店并省钱
2018/07/13 全球购物
一套.net面试题及答案
2016/11/02 面试题
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
试用期旷工辞退通知书
2015/04/17 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android