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")
View Code

注意:修改project_list變量即可。

 

執行代碼

python3 start.py

 

 

本文參考鏈接:

https://www.jianshu.com/p/c1bfc14d5c02

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章