一、概述
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