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