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 ...
随机推荐
- Jenkins(6)测试报告邮件发送
前言 前面已经实现在jenkins上展示html的测试报告,接下来只差最后一步,把报告发给你的领导,展示你的劳动成果了. 安装 Email Extension Plugin 插件 jenkins首页- ...
- Mybatis学习笔记1
mybatis是一个orm持久化框架,mybatis专注于sql的操作从3.0开始名字改变了:ibatis-mybatis 对象关系映射(Object Relational Mapping) 一.My ...
- codeforces B. Pasha and String
Pasha got a very beautiful string s for his birthday, the string consists of lowercase Latin letters ...
- 2019-2020 ACM-ICPC Brazil Subregional Programming Contest Problem A Artwork (并查集)
题意:有一个矩形,有\(k\)个警报器,警报器所在半径\(r\)内不能走,问是否能从左上角走到右下角. 题解:用并查集将所有相交的圆合并,那么不能走的情况如下图所示 所以最后查询判断一下即可. 代码: ...
- Beautiful numbers CodeForces - 55D
题意: 找出区间[li,ri]内有多少数满足,这个数的每一个位的非0数都能把这个数整除 题解: 因为这个数每一位的值都可以把这个数整除,那也就是说这个数是它所有位数的公倍数,但是可能不是最小公倍数. ...
- Educational Codeforces Round 91 (Rated for Div. 2) C. Create The Teams (模拟)
题意:有\(n\)个队员,每个队友都有一个能力值,构造队伍,要求队伍人数*队伍中最低能力值不小于\(x\),求能构造的最大队伍数. 题解:大水题,排个序,倒着模拟就行了. 代码: int t; int ...
- CF1478-A. Nezzar and Colorful Balls
CF1478-A. Nezzar and Colorful Balls 题意: 有\(n\)个球,每个球上面都有一个数字\(a_i\),这些数字是组成的序列是非递减的.现在你要给每个球涂色,你必须保证 ...
- AF_INET与套接字SOCKET
一.SOCKET--套接字 套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信.这就是所谓的进程间通信(Inter Process Commu ...
- sqli-libs(4) 双引号报错
经测试,发现单引号不报错,而双引号却报错了 通过查看源码,发现下图中红色的箭头,如果不知道是什么意思,我们可以复制出来看看是什么含义: <?php$id=1;$id='"' .$id. ...
- AbstractQueuedSynchronizer的使用和juc里的相关类的解析
对AQS进行解析后,先来实现两个简单的基于AQS的类,然后再解析juc里基于AQS构造的类. 1.基于AQS的类的示例 首先先看这个类,这个类是<Java并发编程实战>的一个示例,AQS源 ...