Docker SDK for Python
一、概述
Docker引擎API的Python库。它允许您执行docker命令所做的任何操作,但可以在Python应用程序中运行容器、管理容器、管理群集等。
官方文档:
https://docker-py.readthedocs.io/en/stable/
安装模块
pip3 install docker
二、语法介绍
运行一个容器
import docker
client = docker.from_env()
r = client.containers.run("alpine", ["echo", "hello", "world"])
print(str(r, encoding='utf-8'))
端口映射
r = client.containers.run('mysql/mysql-server:5.7',ports={'3306/tcp': 3300}, auto_remove=True, name='shark_mysql')
{'3306/tcp': 3300} 将容器的 TCP 3306 端口映射到宿主机的 3300 端口
name 指定了容器的名称
在后台运行容器
import docker
client = docker.from_env()
container = client.containers.run("busybox", detach=True)
print(container.id)
停止所有正在运行的容
import docker
client = docker.from_env()
for container in client.containers.list():
container.stop()
打印特定容器的日志
您还可以对单个容器执行操作。此示例打印给定其ID的容器的日志。您需要在运行代码之前修改代码以更改容器的硬编码ID以打印日志。
import docker
client = docker.from_env()
container = client.containers.get('f1064a8a4c82')
print(container.logs())
列出所有镜像
import docker
client = docker.from_env()
for image in client.images.list():
print(image.id)
拉取镜像
import docker
client = docker.from_env()
image = client.images.pull("alpine")
print(image.id)
提交容器
import docker
client = docker.from_env()
container = client.containers.run("alpine", ["touch", "/helloworld"], detach=True)
container.wait()
image = container.commit("helloworld")
print(image.id)
三、项目实战
需求说明
线上服务器的应用服务都是通过docker跑的。上线时,通过jenkins来发布的。版本号以BUILD_NUMBER为准!比如:
app_user:1
app_user:2
app_user:3
app_user:4
app_user:5
app_user:6
...
那么问题就来了,服务器本地镜像越来越多,会导致磁盘空间急剧上涨。但是我只需要最近3个版本即可,用了做回滚操作。
之前的镜像可以删除掉。
完整代码
start.py
#!/usr/bin/env python3
# coding: utf-8
# 删除本地镜像,保留最近3个版本 import time
import docker # 项目列表
project_list = ['app_user'] def write_log(content, colour='white', skip=False):
"""
写入日志文件
:param content: 写入内容
:param colour: 颜色
:param skip: 是否跳过打印时间
:return:
"""
# 颜色代码
colour_dict = {
'red': 31, # 红色
'green': 32, # 绿色
'yellow': 33, # 黄色
'blue': 34, # 蓝色
'purple_red': 35, # 紫红色
'bluish_blue': 36, # 浅蓝色
'white': 37, # 白色
}
choice = colour_dict.get(colour) # 选择颜色 path = "output.log" # 日志文件
with open(path, mode='a+', encoding='utf-8') as f:
if skip is False: # 不跳过打印时间时
content = time.strftime('%Y-%m-%d %H:%M:%S') + ' ' + content info = "\033[1;{};1m{}\033[0m".format(choice, content)
print(info)
f.write(content + "\n") client = docker.from_env()
# 镜像列表
images_obj = client.images.list() # 项目字典
project_dict = {}
# project_dict ={
# 'app_user':['app_user:1', 'app_user:2'],
# }
for i in images_obj:
# print(i,type(i),i.attrs.get('RepoTags'),type(i.attrs.get('RepoTags')))
for project in project_list:
# print("RepoTags",i.attrs.get('RepoTags'))
if project not in project_dict:
project_dict[project] = []
for image in i.attrs.get('RepoTags'):
if project in image:
project_dict[project].append(image) # print("project_dict",project_dict) for i in project_dict:
# print("i",len(project_dict[i]))
# 判断镜像列表是否小于等于3
if len(project_dict[i]) > 3:
# print(project_dict[i])
# 镜像列表排序,默认升序(从小到大)
project_dict[i].sort()
# print(project_dict[i])
# 删除最后3个元素
for n in range(3):
project_dict[i].pop()
# print(project_dict[i]) # 将剩下的镜像删除
for image in project_dict[i]:
# print("删除",image)
try:
result = client.images.remove(image)
write_log("删除镜像: %s 成功"%image, "green")
except Exception as e:
print(e)
write_log("删除镜像: %s 失败"%image, "red")
注意:修改project_list变量即可。
执行代码
python3 start.py
本文参考链接:
https://www.jianshu.com/p/c1bfc14d5c02
Docker SDK for Python的更多相关文章
- [python](Docker SDK)上传镜像到私有仓库(tls、身份认证)
(Docker SDK)上传镜像到私有仓库(tls.身份认证) API:https://docker-py.readthedocs.io/en/stable/ 环境:python:3.7.3 配置参数 ...
- pycharm使用docker容器的python解释器,
上一篇是pycharm调用docker的镜像的python解释器. 此篇介绍pycharm 调用docker的容器的python解释器. 这两个思路还是不一样的,第一个是用pycham界面的选择pyt ...
- pycharm使用docker镜像的python解释器,pycahrm可视化操作和管理dcoker
网上关于pycahrm怎么使用docker容器的python解释器的科普,这方面太少,一半都只介绍pycahrm怎么使用linux的解释器.首先pycahrm确保是pro版本. 下面详细的介绍步骤 首 ...
- python + docker, 实现天气数据 从FTP获取以及持久化(五)-- 利用 Docker 容器化 Python 程序
背景 不知不觉中,我们已经完成了所有的编程工作.接下来,我们需要把 Python 程序 做 容器化 (Docker)部署. 思考 考虑到项目的实际情况,“持久化天气”的功能将会是一个独立的功能模块发布 ...
- PyCharm使用之利用Docker镜像搭建Python开发环境
在我们平时使用PyCharm的过程中,一般都是连接本地的Python环境进行开发,但是如果是离线的环境呢?这样就不好搭建Python开发环境,因为第三方模块的依赖复杂,不好通过离线安装包的方式安装 ...
- Azure SDK for Python Url
Azure SDK for Python URL 明细表 AZURE_PUBLIC_CLOUD = Cloud( 'AzureCloud', endpoints=CloudEndpoints( man ...
- docker容器化python服务部署(supervisor-gunicorn-flask)
docker容器化python服务部署(supervisor-gunicorn-flask) 本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-furt ...
- 优酷上传SDK解析(Python)
1.优酷上传 1)调用优酷的sdk完成优酷视频的上传首先需要将实例化YoukuUpload类实例化,传入的参数为(client_id,access_token,文件地址) 实例化时执行__init__ ...
- PIE SDK与Python结合说明文档
1.功能简介 Python是一种跨平台语言.无论是在Windows.Linux.Unix还是Mac Os系统,我们都可以使用Python.甚至在Linux.Unix及Mac OS系统内已经集成了Pyt ...
随机推荐
- Hyperbase数据迁移
原老集群有100台服务器,新增90台服务器和原来的服务器构成新Hyperbase集群最初考虑有两种方案distcp和snapshot,由于distcp进行数据迁移时不在HBase本身控制范围内,故选用 ...
- CF-559C Gerald and Giant Chess(计数DP)
给定一个 \(H*W\)的棋盘,棋盘上只有\(N\) 个格子是黑色的,其他格子都是白色的. 在棋盘左上角有一个卒,每一步可以向右或者向下移动一格,并且不能移动到黑色格子中.求这个卒从左上角移动到右下角 ...
- 2019牛客暑期多校训练营(第五场)E.independent set 1(状压dp)
题意:给你n个点 m条边 问你所有子图的最大独立集的和 思路:我们可以设f state 为当前点集下的最大独立集的大小 所以我们可以把集合分为两个部分 绝对包含了这个一个点 绝对不包含这个点 两种情况 ...
- POJ - 3376 Finding Palindromes(拓展kmp+trie)
传送门:POJ - 3376 题意:给你n个字符串,两两结合,问有多少个是回文的: 题解:这个题真的恶心,我直接经历了5种错误类型 : ) ... 因为卡内存,所以又把字典树改成了指针版本的. 字符串 ...
- 【uva 11572】Unique Snowflakes(算法效率--滑动窗口,3种实现方法)
题意:求长度为N的序列中,最长的一个无重复元素的连续子序列. 解法:[L,R]每次R++或L++延伸就可以得到答案. 实现:(1)next[],last[]--O(n): 1 #include< ...
- URAL - 1029 dp
题意: n层楼,每层楼有m个房间.找出一个路径从第一层到达第M层,使得路径上的所有数的和是所有可达路径中最小的,每次上到下一层以后就不能再上去,依次输出路径上的各点在所在层的列数. 题解: 参考链接: ...
- Codeforces Round #241 (Div. 2) B. Art Union (DP)
题意:有\(n\)个画家,\(m\)幅画,每个画家负责\(m\)幅画,只有前一个画家画完时,后面一个画家才能接着画,一个画家画完某幅画的任务后,可以开始画下一幅画的任务,问每幅画最后一个任务完成时的时 ...
- 牛客练习赛70 B.拼凑 (序列自动机)
题意:有一个模板串,有\(T\)个字符串,从字符串中找到某个子串,使得这个子串中的子序列包含模板串,求最短的子串的长度. 题解:找子序列,很容易想到序列自动机,根据序列自动机的原理,我们一定可以确保除 ...
- Codeforces Round #669 (Div. 2) C. Chocolate Bunny (交互,构造)
题意:有一个长度为\(n\)的隐藏序列,你最多可以询问\(2n\)次,每次可以询问\(i\)和\(j\)位置上\(p[i]\ mod\ p[j]\)的结果,询问的格式是\(?\ x\ y\),如果已经 ...
- 2017, X Samara Regional Intercollegiate Programming Contest E. Bonuses and Teleports (思维,模拟)
题意:在\(x\)轴上有很多传送点和钻石,当位于传送点上时,可以传送到其他任意传送点(不记操作数),位于钻石上时可以吃掉它,每次可以移动一个单位,问最少多少次可以吃掉所有的钻石. 题解:对于某个位置上 ...