Python操縱Docker Remote API實現自動化

Docker提供了Remote API,能夠經過REST接口進行Docker服務的控制,包括pull/push等全部操做,結果與本機的操做徹底同樣。使用Docker Remote API能夠經過腳本進行Docker集羣的自動化控制。前端

一、啓用Docker Remote API

加入Docker的啓動選項:docker

DOCKER_OPTS="-H=unix:///var/run/docker.sock -H=0.0.0.0:2375"

「-H=0.0.0.0:2375」 表示在任何IP的2375端口上監聽,提供服務。json

這個選項的設置在Ubuntu上15.04版本後有一些不一樣,主要是服務的啓動方式變爲了systemd。vim

Ubuntu 15.04(含)之後版本

修改/usr/lib/systemd/system/docker.service文件,使docker支持遠程tcp接口和本地SOCK鏈接。安全

vim /usr/lib/systemd/system/docker.service

將ExecStart修改成:app

ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

按esc+:+wq保存,退出。負載均衡

從新載入systemd,掃描新的或有變更的單元:tcp

systemctl daemon-reload

重啓docker服務加密

systemctl stop docker.service
systemctl start docker.service

Ubuntu 15.04(不含)之前版本

在Ubuntu環境下修改其配置文件 /etc/default/docker, 加入:url

DOCKER_OPTS="-H=unix:///var/run/docker.sock -H=0.0.0.0: 2375"

啓動服務:

sudo service docker restart
  • 注意,上面的方法只適合局域網使用,在Internet下應配置相應的加密、安全措施,並在前端部署負載均衡和防火牆設備。

二、鏈接到Docker本地服務

首先安裝Docker Remote API的Python客戶端:

pip install docker-py

而後在docker的同一臺機器,能夠鏈接和查看docker的容器信息。

from docker import Client

cli = Client(base_url='tcp://127.0.0.1:2375')
print( len(cli.containers()) )
print(cli.containers())
  • 在未啓用Remote API的狀況下,能夠進行本地鏈接:
cli = Client(base_url='unix://var/run/docker.sock')

三、鏈接到Docker遠程服務

能夠在遠程進行訪問docker 服務:

from docker import Client

cli = Client(base_url='tcp://192.168.199.120:2375')
len(cli.containers())
  • 上面的 "192.168.199.120:2375"是docker服務所在的IP地址和端口。

四、操縱Docker服務實例

經過上面的 cli = Client(base_url='tcp://192.168.199.120:2375')能夠執行全部的Docker命令行操做。

4.1 docker images

from docker import Client

cli = Client(base_url='tcp://192.168.199.120:2375')
print( len(cli.images()) )

# 打印出容器鏡像的參數
for img in cli.images():
    print(img['RepoTags'][0])

4.2 docker containers

from docker import Client

cli = Client(base_url='tcp://192.168.199.120:2375')
print( len(cli.containers()) )

# 打印出容器的參數
for c in cli.containers():
    print(c["Command"],'\t',c["Image"],'\t',c["Names"])

4.3 docker pull

from docker import Client

cli = Client(base_url='tcp://127.0.0.1:2375')
for line in cli.pull('busybox', stream=True):
     print(json.dumps(json.loads(line), indent=4))

4.4 docker push

from docker import Client

cli = Client(base_url='tcp://127.0.0.1:2375')
response = [line for line in cli.push('yourname/app', stream=True)]
response
相關文章
相關標籤/搜索