小知识:Docker-client for python详解及简单示例

Dockerclient for python使用指南:

客户端初始化的三种方法

?
1
2
3
4
5
6
import docker
docker.api()
docker.APIClient()
docker.client()
docker.DockerClient() 其实也是docker.client()的一个子集
docker.from_env() 其实就是docker.client()的一个子集

一、初始化客户端

1.Docker客户端的初始化工作

?
1
2
3
4
5
6
7
8
9
10
11
12
>>> import docker
>>> client = docker.APIClient(base_url=unix://var/run/docker.sock,version=1.21,timeout=5)
>>> client.version()
{uApiVersion: u1.21,
uArch: uamd64,
uBuildTime: u2016-09-27T23:38:15.810178467+00:00,
uExperimental: True,
uGitCommit: u45bed2c,
uGoVersion: ugo1.6.3,
uKernelVersion: u4.4.22-moby,
uOs: ulinux,
uVersion: u1.12.2-rc1}
?
1
2
3
4
5
6
7
8
9
Args:
base_url (str): 指定链接路径,可以通过socket或者tcp方式链接
“unix:///var/run/docker.sock“ or “tcp://127.0.0.1:1234“.
version (str): 指定API使用的版本(docker=2.0.0默认的api版本是1.24,最低支持1.21,docker1.9+的api是1.21),因此在使用python的docker模块时一定要注意docker的api以及docker模块的api是否兼容。当然如果设置为 “auto“ 降回去自动检测server的版本
timeout (int): 使用API调用的默认超时时间,默认单位为秒
tls (bool or :py:class:`~docker.tls.TLSConfig`): Enable TLS. Pass
“True“ to enable it with default options, or pass a
:py:class:`~docker.tls.TLSConfig` object to use custom
configuration.

查看docker引擎当前版本:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sudo docker version
Client:
Version:   1.9.1
API version: 1.21
Go version:  go1.4.3
Git commit:  a34a1d5-dirty
Built:    Tue Mar 28 15:39:19 UTC 2017
OS/Arch:   linux/amd64
Server:
Version:   1.9.1
API version: 1.21
Go version:  go1.4.3
Git commit:  a34a1d5-dirty
Built:    Tue Mar 28 15:39:19 UTC 2017
OS/Arch:   linux/amd64

The sdk of docker for python–docker==2.0.0:

?
1
2
3
4
5
6
7
1.丢弃了python2.6的支持
2.最低支持API版本为1.12(Engine version 1.9.0+)
3.`docker.Client`被替换成`docker.APIClient`
4.`docker.from_env`初始化一个docker客户端实例代替了`APIClient `实例
5.从`APIClient.start`中移除了HostConfig参数
6.开始由之前的docker-py模块变为docker
7.`docker.ssladapter`替换为`docker.transport.ssladapter`

2.Docker客户端的具体方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import docker
C = docker.DockerClient(base_url=unix://var/run/docker.sock,version=auto,timeout=10)
##docker相关的方法使用
使用DockerClient对象,会有以下方法:
C.api,
C.containers,
C.events,
C.from_env,
C.images,
C.info,
C.login,
C.networks,
C.nodes,
C.ping,
C.services,
C.swarm,
C.version,
C.volumes,
#输出docker的相关信息,相当于docker info
C.info()

二、api方法使用示例

1. login方法定义

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
C.login()
login(*args, **kwargs) method of docker.client.DockerClient instance
Authenticate with a registry. Similar to the “docker login“ command.
Args:
username (str): The registry username
password (str): The plaintext password
email (str): The email for the registry account
registry (str): URL to the registry. E.g.
“https://index.docker.io/v1/“
reauth (bool): Whether refresh existing authentication on the
Docker server.
dockercfg_path (str): Use a custom path for the “.dockercfg“ file
(default “$HOME/.dockercfg“)
Returns:返回的错误日志信息
(dict): The response from the login request
Raises:
:py:class:`docker.errors.APIError`
If the server returns an error.
##使用login方法登录
C.login(xxbandy123,nslalla)

2.images 类定义:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
build方法
get方法:
get(self, name)
Gets an image.
Args:
name (str): The name of the image.
Returns:
(:py:class:`Image`): The image.
Raises:
:py:class:`docker.errors.ImageNotFound` If the image does not
exist.
:py:class:`docker.errors.APIError`
If the server returns an error.
list方法:
list(self, name=None, all=False, filters=None)
List images on the server.
Args:
name (str): Only show images belonging to the repository “name“
all (bool): Show intermediate image layers. By default, these are
filtered out.
filters (dict): Filters to be processed on the image list.
Available filters:
– “dangling“ (bool)
– “label“ (str): format either “key“ or “key=value“
Returns:
(list of :py:class:`Image`): The images.
Raises:
:py:class:`docker.errors.APIError`
If the server returns an error.

示例:

?
1
2
3
4
5
6
7
8
查看默认所有的镜像文件,以image-id进行区分
In [34]: C.images.list()
Out[34]:
[<Image: busybox:latest>,
<Image: 172.24.254.235:5010/rancher-server:latest, rancher/server:latest>,
<Image: 172.24.254.235:5010/jdsingleuser:latest>,
<Image: registry:2>,
<Image: 172.24.254.235:5010/rancher-agent:latest, rancher/agent:v1.0.2>]
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
load方法:相当于docker load
pull方法:下载镜像文件
pull(self, name, **kwargs)
Pull an image of the given name and return it. Similar to the
“docker pull“ command.
If you want to get the raw pull output, use the
:py:meth:`~docker.api.image.ImageApiMixin.pull` method in the
low-level API.
Args:
repository (str): The repository to pull
tag (str): The tag to pull
insecure_registry (bool): Use an insecure registry
auth_config (dict): Override the credentials that
:py:meth:`~docker.client.DockerClient.login` has set for
this request. “auth_config“ should contain the “username“
and “password“ keys to be valid.
Returns:
(:py:class:`Image`): The image that has been pulled.
需要注意的是:使用pull的时候,会弱匹配所有的tag标签
push方法:上传镜像文件
push(self, repository, tag=None, **kwargs)
Push an image or a repository to the registry. Similar to the “docker
push“ command.
Args:
repository (str): The repository to push to
tag (str): An optional tag to push
stream (bool): Stream the output as a blocking generator
insecure_registry (bool): Use “http://“ to connect to the
registry
auth_config (dict): Override the credentials that
:py:meth:`~docker.api.daemon.DaemonApiMixin.login` has set for
this request. “auth_config“ should contain the “username“
and “password“ keys to be valid.
Returns:
(generator or str): The output from the server.
Raises:
:py:class:`docker.errors.APIError`
remove方法:docker rmi
remove(self, *args, **kwargs)
Remove an image. Similar to the “docker rmi“ command.
Args:
image (str): The image to remove
force (bool): Force removal of the image
noprune (bool): Do not delete untagged parents
search方法:
search(self, *args, **kwargs)
Search for images on Docker Hub. Similar to the “docker search“
command.
Args:
term (str): A term to search for.
Returns:
(list of dicts): The response of the search.

3.docker管理容器相关

C.containers类,下面有相关的方法:

client,create,get,list,model,run

列出当前存活的容器:

C.containers.list()

列出指定容器:

C.containers.get()

创建容器:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
C.containers.create
create(image, command=None, **kwargs) method of docker.models.containers.ContainerCollection instance
Create a container without starting it. Similar to “docker create“.
Takes the same arguments as :py:meth:`run`, except for “stdout“,
“stderr“, and “remove“.
Returns:
A :py:class:`Container` object.
Raises:
:py:class:`docker.errors.ImageNotFound`
If the specified image does not exist.
:py:class:`docker.errors.APIError`
If the server returns an error.
run一个容器:类似于命令行的docker run方法
run(image, command=None, stdout=True, stderr=False, remove=False, **kwargs) method of docker.models.containers.ContainerCollection instance
Run a container. By default, it will wait for the container to finish
and return its logs, similar to “docker run“.
如果detach参数设置为True,他将立即返回一个Container对象,类似于docker run -d
实例:
运行一个容器并获取输出。
>>> import docker
>>> client = docker.from_env()
>>> client.containers.run(alpine, echo hello world)
bhello world\n
后台运行一个容器:
>>> container = client.containers.run(bfirsh/reticulate-splines,
detach=True)
获取该容器的日志信息
>>> container.logs()
Reticulating spline 1…\nReticulating spline 2…\n
参数介绍:
image (str): run一个容器所需要的镜像(str类型)
command (str or list): 容器启动默认运行的命令(字符串或者列表类型).
blkio_weight_device: 设置设备Block IO 权重:“[{“Path”: “device_path”, “Weight”: weight}]“.
blkio_weight: 设置block IO 的权重 范围10-1000.
cap_add (list of str): 增加内核特性 比如:“[“SYS_ADMIN”, “MKNOD”]“.
cap_drop (list of str): 删除内核特性
cpu_group (int): 每颗cpu的长度
cpu_period (int): 容器在每一个cpu的时间周期内可以得到多少的的cpu时间(ms)
cpu_shares (int): 共享cpu权重CPU 相对权重
cpuset_cpus (str): 绑定cpu的执行 (“0-3“,“0,1“).
detach (bool): 后台运行一个容器,布尔类型值.相当于docker run -d选项
device_read_bps: 从一个设备上限制读速率(bytes/s) `[{“Path”: “device_path”, “Rate”: rate}]`
device_read_iops: 从一个设备中限制读取速率(IO/s)
device_write_bps: 从一个设备上限制写速率(bytes/s)
device_write_iops: 从一个设备中限制读取速率(IO/s)
devices (list): 映射主机的设备到容器中“<path_on_host>:<path_in_container>:<cgroup_permissions>“.
dns (list): 配置当前的dns-server
dns_opt (list): 添加额外的dns参数选项到容器内部,比如resolv.conf文件
dns_search (list): 设置dns搜索域
domainname (str or list): 设置当前dns搜索域名
entrypoint (str or list): 为容器设置入口,覆盖镜像中的entrypoint
environment (dict or list): 内部环境变量[“SOMEVARIABLE=xxx”]“
extra_hosts (dict): 在容器内部添加额外的主机名解析(本地hosts文件)
group_add (list): 设置容器内部进程运行时额外的组名(gid)
hostname (str): 容器设置额外的主机名.相当于docker run -h/–hostname 选项
ipc_mode (str): 为容器设置ipc模式
isolation (str): 隔离技术的使用Default: `None`.
labels (dict or list): 一个k/v类型的标签存储“{“label1”: “value1”, “label2”: “value2”}“)或一个列表类型的k/v存储“[“label1”, “label2”]“
links (dict or list of tuples): 为容器映射一个别名“(name, alias)“
log_config (dict): 容器的日志配置。
keys:
– “type“ The logging driver name.
– “config“ A dictionary of configuration for the logging
driver.
mac_address (str): 绑定mac地址.
mem_limit (float or str): 内存限制,允许浮点型数据或单位区分的字符串(“100000b“, “1000k“, “128m“, “1g“). 如果一个字符串没有指定单位,默认会使用字节(bytes)
mem_limit (str or int): 容器可以使用的最大内存数量(e.g. “1G“).
mem_swappiness (int): 调整容器内存的swappiness行为状态,允许的数值为0-100
memswap_limit (str or int): 最大内存限制,容器可用的内存为(memory+swap)
networks (list): 设置连接到该容器网络的名称
name (str): 为容器设置名字
network_disabled (bool): 禁用容器网络
network_mode (str): 网络模式 相当于docker run –net=none
– “bridge“ 默认使用桥接模式
– “none“ 无网络模式
– “container:<name|id>“ 重用另外一个容器的网络
– “host“ 使用本机的网络栈
oom_kill_disable (bool): 是否启用OOM
oom_score_adj (int): 一个整数,以调整OOM的整体性能.
pid_mode (str): pid模式,如果设置为host,在容器内部将会使用宿主机的host pid
pids_limit (int): 调整容器的pid的限制。-1表示不限制
ports (dict): 为容器内部绑定端口 相当于docker run -p
实例:
“{2222/tcp: 3333}“ 暴露容器内部的2222端口到本机的3333端
“{2222/tcp: None}“ 将容器内部的2222随机映射到本机
“{1111/tcp: (127.0.0.1, 1111)}“.
“{1111/tcp: [1234, 4567]}“ 绑定多个端口
privileged (bool): 给容器额外的特权
publish_all_ports (bool): 开放所有的端口到本机上 相当于docker run -P
read_only (bool): 以只读方式挂载容器的根文件系统
remove (bool): 当容器退出的时候删除,默认是False
restart_policy (dict): 当容器退出时重启容器
配置参数如下:
– “Name“ One of “on-failure“, or “always“.
– “MaximumRetryCount“ 容器失败多少次后进行重启
实例:
“{“Name”: “on-failure”, “MaximumRetryCount”: 5}“
security_opt (list): 设置安全标签,类似于selinux
shm_size (str or int): /dev/shm 的大小(e.g. “1G“).
stdin_open (bool): 保持 “STDIN“ 打开即使没有attach到容器内部相当于docker run -i
stdout (bool): 当detach=False的时候,从STDOUT返回日志。默认为True
stdout (bool): 当detach=False的时候,从STDERR返回日志,默认为False
stop_signal (str): 设置用于停止容器的信号。(e.g. “SIGINT“).
sysctls (dict): 容器内部设置内核参数
tmpfs (dict): 挂载临时文件系统
.. code-block:: python
{
/mnt/vol2: ,
/mnt/vol1: size=3G,uid=1000
}
tty (bool): 分配一个tty 相当于docker run -t
ulimits (list): 在容器内部设置ulimits值,一个字典类型的列表
user (str or int): 设置容器启动的用户名以及id
userns_mode (str): 为容器设置用户的命名空间模式,当用户的namespace的remapping参数被启用的时候,支持参数有host
values are: “host“
volume_driver (str): 数据卷挂载驱动名
volumes (dict or list): 一个字典配置,将外部数据卷挂载到容器内部,key是主机或者数据卷的名字,value是带有key的字典:
实例:
{/home/user1/: {bind: /mnt/vol2, mode: rw},
/var/www: {bind: /mnt/vol1, mode: ro}}
volumes_from (list): 获取容器名或者id标识。
working_dir (str): 容器默认的工作目录
返回参数:
容器的日志,包含 “STDOUT“, “STDERR“
If “detach“ is “True“, a :py:class:`Container` object is
returned instead.
异常信息:
如果容器以非0状态退出,或者`detach`参数为`False`
:py:class:`docker.errors.ContainerError`
如果指定的镜像不存在
:py:class:`docker.errors.ImageNotFound`
如果是服务返回一个错误
:py:class:`docker.errors.APIError`
If the server returns an error.

示例: 一个完成的创建容器的基本粒子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Command line:
$ docker run -itd -P –cpuset_cpus=0,1 –cpu_shares=2 –cpu_period=10000 –hostname=xxbandy –mem_limit=512m –net=none –oom_kill_disable=True -P -u admin busybox /bin/sh
Python API:
c1 = C.containers.run(busybox,command=/bin/sh,name=xxb-test,detach=True,tty=True,stdin_open=True,cpuset_cpus=0,1,cpu_shares=2,cpu_period=10000,hostname=xxbandy,mem_limit=512m,network_mode=none,oom_kill_disable=True,publish_all_ports=True,user=root)
查看容器相关信息:
容器id,64位的字符
In [20]: c1.id
Out[20]: 499db0824206d61d09db2f36c70aa84bdb1a4b6d508b001a618d2010a23fea7e
c1.logs
c1.name   获取容器名信息
c1.reload
c1.remove  删除容器信息,相当于docker rm 参数:c1.remove(v=True,link=True,force=True)
c2.rename   重命名容器名,相当于docker renmame oldname newname
c1.resize   设置tty session信息
c1.restart  重启容器信息
c1.start   启动容器信息
c1.stats   容器状态
c1.update  动态调整容器内部信息(blkio_weight,cpu_period,cpu_quota,cpu_shares,cpuset_cpus,cpuset_mems,mem_limit,mem_reservation)
Args:
blkio_weight (int): 块IO权重比例(10-100)
cpu_period (int): 限制cpu公平调度周期
cpu_quota (int): 限制cpu公平调度配额
cpu_shares (int): 设置cpu共享权重
cpuset_cpus (str): 指定cpu执行(0-3, 0,1)
cpuset_mems (str): 指定cpu内存的执行(0-3, 0,1)
mem_limit (int or str): 内存限制
mem_reservation (int or str): 内存软限制
memswap_limit (int or str): swap限制总的可使用内存限制(memory + swap),-1表示关闭swap
kernel_memory (int or str): 内核内存限制
restart_policy (dict): 重启策略

注意:update方法在docker1.10之后才增加了改功能

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
查看容器相关信息:
容器id,64位的字符
In [20]: c1.id
Out[20]: 499db0824206d61d09db2f36c70aa84bdb1a4b6d508b001a618d2010a23fea7e
可以在/sys/fs/cgroup/memory/docker目录下面查看到每个容器的相关cgroup配置信息。
查看内存信息:
# grep hierarchical memory.stat   分别显示容器的内存限制和swap限制
hierarchical_memory_limit 536870912
hierarchical_memsw_limit 1073741824
#cat memory.limit_in_bytes
536870912
可以在/sys/fs/cgroup/cpuset/docker目录下面查看到容器cpu的相关配置
# cat cpuset.cpus    显示当前绑定的cpu信息
0-1
使用docker update动态调整内存信息:
docker update -m 1024M xuxuebiao-test
# cat memory.limit_in_bytes
1073741824
# grep hierarchical_memory_limit memory.stat
hierarchical_memory_limit 1073741824

感谢阅读 ,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:https://my.oschina.net/xxbAndy/blog/872487

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:docker images 如何建立自己的原生镜像

2023-4-18 10:32:14

建站知识

小知识:CentOS7.3中Docker的安装教程

2023-4-18 10:46:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索