天天看點

使用python的docker-py實作docker的api操作

前沿:

        聽同僚說,以後的dba申請可能有部分走其他部門的docker ,那邊貌似在搞一個類似docker的平台管理系統,據說很霸道。于是乎,我自己也想嘗試寫一個簡單的doker管理平台。  做為起步我先搞搞docker api,docker官網有個docker-py,用起來很是清爽簡單。 

首先安裝docker的python相關的子產品。

1

2

3

4

5

6

7

8

9

10

<code>root@dev-ops:~</code><code># pip install docker-py</code>

<code>Requirement already satisfied (use --upgrade to upgrade): docker-py </code><code>in</code> <code>/usr/local/lib/python2</code><code>.7</code><code>/dist-packages</code>

<code>Requirement already satisfied (use --upgrade to upgrade): requests==2.2.1 </code><code>in</code> <code>/usr/lib/python2</code><code>.7</code><code>/dist-packages</code> <code>(from docker-py)</code>

<code>Requirement already satisfied (use --upgrade to upgrade): six&gt;=1.3.0 </code><code>in</code> <code>/usr/lib/python2</code><code>.7</code><code>/dist-packages</code> <code>(from docker-py)</code>

<code>Requirement already satisfied (use --upgrade to upgrade): websocket-client==0.11.0 </code><code>in</code> <code>/usr/local/lib/python2</code><code>.7</code><code>/dist-packages</code> <code>(from docker-py)</code>

<code>Requirement already satisfied (use --upgrade to upgrade): mock==1.0.1 </code><code>in</code> <code>/usr/local/lib/python2</code><code>.7</code><code>/dist-packages</code> <code>(from docker-py)</code>

<code>Requirement already satisfied (use --upgrade to upgrade): coverage==3.7.1 </code><code>in</code> <code>/usr/local/lib/python2</code><code>.7</code><code>/dist-packages</code> <code>(from docker-py)</code>

<code>Cleaning up...</code>

<code>root@dev-ops:~</code><code># </code>

<code>root@dev-ops:~</code><code>#</code>

咱們先檢視下已經下載下傳好的子產品

[root@dev-ops ~]$docker images

<code>http:</code><code>//rfyiamcool</code><code>.blog.51cto.com</code><code>/1030776/1539500</code>

<code>REPOSITORY               TAG                 IMAGE ID            CREATED             VIRTUAL SIZE</code>

<code>ubuntu_redis             latest              57672d1b5979        About an hour ago   257.6 MB</code>

<code>rastasheep</code><code>/ubuntu-sshd</code>   <code>14.04               636d86f228c7        2 days ago          254.9 MB</code>

<code>rastasheep</code><code>/ubuntu-sshd</code>   <code>12.04               1147568d245b        6 days ago          144.6 MB</code>

<code>rastasheep</code><code>/ubuntu-sshd</code>   <code>13.10               8a63145eed52        6 days ago          231.6 MB</code>

<code>rastasheep</code><code>/ubuntu-sshd</code>   <code>latest              47386e322f5d        8 days ago          254.9 MB</code>

<code>lemonbar</code><code>/centos6-ssh</code>     <code>latest              b78c71c001db        11 days ago         296.9 MB</code>

<code>rastasheep</code><code>/ubuntu-sshd</code>   <code>12.10               c9c48c3cb34c        4 weeks ago         188.9 MB</code>

<code>rastasheep</code><code>/ubuntu-sshd</code>   <code>13.04               bf49ae3d5534        4 weeks ago         213.1 MB</code>

<a href="http://s3.51cto.com/wyfs02/M01/45/C3/wKiom1Pq-dvxth9MAAK2XDrkoH0863.jpg" target="_blank"></a>

檢視已經啟動的容器

[root@dev-ops ~]$docker ps -a

<code>CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                   NAMES</code>

<code>c5f6d0240531        ubuntu_redis:latest             </code><code>/usr/sbin/sshd</code> <code>-D   About an hour ago   Up About an hour    0.0.0.0:49154-&gt;22</code><code>/tcp</code>   <code>redis_sshd          </code>

<code>df7b7568fa7a        rastasheep</code><code>/ubuntu-sshd</code><code>:latest   </code><code>/usr/sbin/sshd</code> <code>-D   About an hour ago   Up About an hour    0.0.0.0:49153-&gt;22</code><code>/tcp</code>   <code>test_sshd</code>

<a href="http://s3.51cto.com/wyfs02/M01/45/C3/wKiom1Pq-iyjKFhgAAJNPUnBE_w836.jpg" target="_blank"></a>

檢視 docker 相關的版本

[root@dev-ops ~]$docker version

<code>Client version: 0.9.1</code>

<code>Go version (client): go1.2.1</code>

<code>Git commit (client): 3600720</code>

<code>Server version: 0.9.1</code>

<code>Git commit (server): 3600720</code>

<code>Go version (server): go1.2.1</code>

<code>Last stable version: 1.1.2, please update docker</code>

<code>[root@dev-ops ~]$</code>

好了,到現在為止 docker image有了,容器也有了,docker-py這個api也有了。。。

下面是我的操作的記錄,有過shell操作經驗的人,應該就很好上手的。

[root@dev-ops ~]$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.

?         -&gt; Introduction and overview of IPython's features.

%quickref -&gt; Quick reference.

help      -&gt; Python's own help system.

object?   -&gt; Details about 'object', use 'object??' for extra details.

In [1]: import docker

建立docker的連結,這裡是通過sock連接配接的。

In [2]: c = docker.Client(base_url='unix://var/run/docker.sock',version='1.9',timeout=10)

我們可以看到裡面有很多的功能。

In [3]: c.

c.adapters                      c.copy                          c.headers                       c.login                         c.proxies                       c.send

c.attach                        c.create_container              c.history                       c.logs                          c.pull                          c.start

c.attach_socket                 c.create_container_from_config  c.hooks                         c.max_redirects                 c.push                          c.stop

c.auth                          c.delete                        c.images                        c.mount                         c.put                           c.stream

c.base_url                      c.diff                          c.import_image                  c.options                       c.remove_container              c.tag

c.build                         c.events                        c.info                          c.params                        c.remove_image                  c.top

c.cert                          c.export                        c.insert                        c.patch                         c.request                       c.trust_env

c.close                         c.get                           c.inspect_container             c.ping                          c.resize                        c.verify

c.commit                        c.get_adapter                   c.inspect_image                 c.port                          c.resolve_redirects             c.version

c.containers                    c.get_image                     c.kill                          c.post                          c.restart                       c.wait

c.cookies                       c.head                          c.load_image                    c.prepare_request               c.search                        

這裡是檢視已經部署好的images鏡像

In [3]: c.images()

Out[3]: 

[{u'Created': 1407902496,

  u'Id': u'57672d1b597912c7b6841c05c0e07e525890cfd64cbd37c84754e7d7e54ee766',

  u'ParentId': u'47386e322f5deffbc04c777632e1f1ac7e6ddd6909ae6b9ce8d1d78dc2bb6d0c',

  u'RepoTags': [u'ubuntu_redis:latest'],

  u'Size': 2675587,

  u'VirtualSize': 257554797},

 {u'Created': 1407684299,

  u'Id': u'636d86f228c7c6e844d1473245a9580d9c57fd0bfd1b5b9172aa5c168581978c',

  u'ParentId': u'e882dd610d1ca64817106dcbda29b2c78536f5fb75f780583cc9fac0efe05398',

  u'RepoTags': [u'rastasheep/ubuntu-sshd:14.04'],

  u'Size': 0,

  u'VirtualSize': 254925704},

 {u'Created': 1407342004,

  u'Id': u'1147568d245b369495b19b1943c0946a2b2d823d0a96b48bb7bee5f128090d29',

  u'ParentId': u'12175cbcbe499c80dd71e3085467d9178a1b5cfa47ecf1463302e09fe2f09e58',

  u'RepoTags': [u'rastasheep/ubuntu-sshd:12.04'],

  u'VirtualSize': 144645266},

 {u'Created': 1407341844,

  u'Id': u'8a63145eed52cf9ae6bdb064f370469d6fa3653f0da5d370ece9e270baf8d9cb',

  u'ParentId': u'ca60f67629d2c43012fb53f714e60672c4ad5b61520bb306e3a35614190dcf76',

  u'RepoTags': [u'rastasheep/ubuntu-sshd:13.10'],

  u'VirtualSize': 231639963},

 {u'Created': 1407167259,

  u'Id': u'47386e322f5deffbc04c777632e1f1ac7e6ddd6909ae6b9ce8d1d78dc2bb6d0c',

  u'ParentId': u'a8bbc54283bbc341c703970ed429e4def6c034273ede59aaf451449164c95775',

  u'RepoTags': [u'rastasheep/ubuntu-sshd:latest'],

  u'VirtualSize': 254879210},

 {u'Created': 1406884906,

  u'Id': u'b78c71c001db87eb2da7049f5f9610039afd3484f65e22a3284098792460040d',

  u'ParentId': u'e13b39edfcb4c5e15f876c2824fea1d738fb3825437162fad497138123f3235b',

  u'RepoTags': [u'lemonbar/centos6-ssh:latest'],

  u'VirtualSize': 296869021},

 {u'Created': 1405333140,

  u'Id': u'c9c48c3cb34c4b8305d7bae4f0c3c753fbca3ac96195e73e9fdab4a8fa24708a',

  u'ParentId': u'30ffc511bbe11f6205cdc0f2749cadcc0c2eca4f7296285b1af867afcb6ef842',

  u'RepoTags': [u'rastasheep/ubuntu-sshd:12.10'],

  u'VirtualSize': 188947523},

 {u'Created': 1405333120,

  u'Id': u'bf49ae3d55344648b354bddf22b2f15c48e2d74e52933404757a9eb470ac35e3',

  u'ParentId': u'561b2d67fd0a80367e9ab98f9893ce6d36006dbb452e7c8693f028fcaa5f6c7f',

  u'RepoTags': [u'rastasheep/ubuntu-sshd:13.04'],

  u'VirtualSize': 213124480}]

這裡是搜尋鏡像,比如我想搜下, ubuntu redis 字眼的,結果沒有搜到。  但是搜ubuntu_sshd有關的鏡像會發現有的。

In [5]: c.search('ubuntu_redis')

Out[5]: []

In [6]: c.search('ubuntu_sshd')

Out[6]: 

[{u'description': u'',

  u'is_official': False,

  u'is_trusted': False,

  u'name': u'pungoyal/ubuntu_sshd',

  u'star_count': 0}]

這裡是下載下傳鏡像

In []: c.pull('core9/docker-mongodb')

In [6]: c.create_container(image="ubuntu_redis", command="/usr/sbin/sshd -D",name="test_nima")

{u'Id': u'15bd8d4ecd1a50604732e1f81763eb347a1cf8937da929799e65261b004894ce',

 u'Warnings': None}

In [7]: 

啟動容器

In [7]: c.start(container="15bd8d4ecd1a50604732e1f81763eb347a1cf8937da929799e65261b004894ce")

檢視日志

In [8]: c.logs(container="15bd8d4ecd1a50604732e1f81763eb347a1cf8937da929799e65261b004894ce")

Out[8]: ''

<a href="http://s3.51cto.com/wyfs02/M01/45/C3/wKiom1Pq--ChU7DPAAJOleUQxEU687.jpg" target="_blank"></a>

我們再試圖關閉下這個容器,然後inspect看下他的運作狀态

In [18]: c.stop('15bd8d4ecd1a')

In [20]: re_info = c.inspect_container('15bd8d4ecd1a')

In [22]: re_info['State']['Running']

Out[31]: False

<a href="http://s3.51cto.com/wyfs02/M02/45/C5/wKioL1PrAyzwF-K1AAIVBUcpyxg738.jpg" target="_blank"></a>

好了,我們通過docker shell看下剛才建立的結果。 我們在用python docker api的時候,建立了一個叫test_nima的容器。  

<a href="http://s3.51cto.com/wyfs02/M01/45/C4/wKioL1Pq_JegbtxHAAKKqtWyJeQ809.jpg" target="_blank"></a>

篇幅的問題就不多說了, api幾乎包含了docker的功能,最少能滿足我的應用,及在開發中與運維平台的對接。朋友的公司已經在用純node.js寫了套api,為公司内部服務。其實官網和社群提供了好幾個web ui,但是那畢竟是别人寫的。改起來不簡單。我打算在下篇文章會介紹下, 如何自己實作一套簡單的docker rest api 接口。 

偶了 !

 本文轉自 rfyiamcool 51CTO部落格,原文連結:http://blog.51cto.com/rfyiamcool/1539500,如需轉載請自行聯系原作者