简单记录哈python的docker client的使用。
> 官方文档:
> https://docker-py.readthedocs.io/en/stable/client.html
> https://docs.docker.com/develop/sdk/examples/
> demo地址:
> https://github.com/zhiweiyin318/yzw.python.demo/tree/master/dockerclient
安装
1
|
$ pip install docker |
使用
client 初始化
需要先创建一个DockerClient类的对象,相当于本地的docker client端。有三种方式:
1 2 3 4 5 6 7 8 9 |
import docker # 方式1 base_url 可以是socket或者tcp方式,还有version,timeout等参数 dc = docker.APIClient(base_url='unix://var/run/docker.sock',timeout=5) # 方式2 docker_kwargs = docker.utils.kwargs_from_env() dc = docker.APIClient(version='auto', **docker_kwargs) # 方式3 这是上面2个的子集 dc = docker.from_env() |
client 的方法
client对象的有一些方法:
1 2 3 4 5 6 7 8 9 10 |
dc.configs dc.containers dc.images dc.networks dc.nodes dc.plugins dc.volumes dc.services dc.events ... |
运行,查询,停止,删除 一个容器
1 2 3 4 5 |
>>> import docker >>> dc = docker.from_env() >>> dc.containers.run("busybox",'echo hello world') 'hello world\n' >>> |
1 2 3 4 5 6 7 8 9 10 11 |
import docker dc = docker.from_env() container = dc.containers.run("busybox", name='test', command='echo hello world', detach=True, tty=True, stdin_open=True) print container.logs() print "containers: {}".format(dc.containers.list()) print "container {} status is {}".format(container.name, container.status) container.stop() container.remove() print "container {} status is {}".format(container.name, container.status) print "containers: {}".format(dc.containers.list()) |
list/pull image
1 2 3 4 5 6 7 8 9 10 11 12 |
import docker dc = docker.from_env() for i in dc.images.list(): print "image ID:{}, tag:{}".format(i.short_id, i.tags) for t in i.tags: if t == "busybox:latest": print "remove image {}".format(t) dc.images.remove('busybox:latest') # if no tag is specified all tags from the repo will be pulled. image = dc.images.pull('busybox:latest') print "pull busybox image, id:{},tag:{}".format(image.short_id, image.tags) |
Low-level API
The main object-orientated API is built on top of APIClient. Each method on APIClient maps one-to-one with a REST API endpoint, and returns the response that the API responds with.
It’s possible to use APIClient directly. Some basic things (e.g. running a container) consist of several API calls and are complex to do with the low-level API, but it’s useful if you need extra flexibility and power.
1 2 3 4 |
import docker dc = docker.APIClient(base_url='unix://var/run/docker.sock') print dc.version() dc.containers() |
等同于:
1 2 3 |
import docker dc = docker.from_env() dc.api.containers() |
输出结果是json结构的map
1
|
[{u'Status': u'Up Less than a second', u'Created': 1536673589, u'Image': u'busybox', u'Labels': {}, u'NetworkSettings': {u'Networks': {u'bridge': {u'NetworkID': u'754e02dfae9aa61b96e78ca6dfa743f121177c2985cd3179641e8650032180b4', u'MacAddress': u'02:42:ac:11:00:03', u'GlobalIPv6PrefixLen': 0, u'Links': None, u'GlobalIPv6Address': u'', u'IPv6Gateway': u'', u'DriverOpts': None, u'IPAMConfig': None, u'EndpointID': u'06443f233bfac60c83c9835172c9d076a9df406bd84a350e1e713fd274caf5d3', u'IPPrefixLen': 16, u'IPAddress': u'172.17.0.3', u'Gateway': u'172.17.0.1', u'Aliases': None}}}, u'HostConfig': {u'NetworkMode': u'default'}, u'ImageID': u'sha256:e1ddd7948a1c31709a23cc5b7dfe96e55fc364f90e1cebcde0773a1b5a30dcda', u'State': u'running', u'Command': u'/bin/sh', u'Names': [u'/cranky_lichterman'], u'Mounts': [], u'Id': u'ededc6515049f2d13b8ee79df0729bf9f8f4d92940e6012c4f1e23ccc055c0f7', u'Ports': []}, {u'Status': u'Up About a minute', u'Created': 1536673521, u'Image': u'busybox', u'Labels': {}, u'NetworkSettings': {u'Networks': {u'bridge': {u'NetworkID': u'754e02dfae9aa61b96e78ca6dfa743f121177c2985cd3179641e8650032180b4', u'MacAddress': u'02:42:ac:11:00:02', u'GlobalIPv6PrefixLen': 0, u'Links': None, u'GlobalIPv6Address': u'', u'IPv6Gateway': u'', u'DriverOpts': None, u'IPAMConfig': None, u'EndpointID': u'2a3d90402db5b9c26583a5bb4bad5c4561fb263cd2858d0e01774ab7fa5cc336', u'IPPrefixLen': 16, u'IPAddress': u'172.17.0.2', u'Gateway': u'172.17.0.1', u'Aliases': None}}}, u'HostConfig': {u'NetworkMode': u'default'}, u'ImageID': u'sha256:e1ddd7948a1c31709a23cc5b7dfe96e55fc364f90e1cebcde0773a1b5a30dcda', u'State': u'running', u'Command': u'/bin/sh', u'Names': [u'/loving_wright'], u'Mounts': [], u'Id': u'6721f996af1e9d04237fef0a1cb3f50e9e564173e8ff25056cdc475e8a985de5', u'Ports': []}] |