使用 Python 脚本自动化管理 Docker 容器:启动、修改密码、删除及系统资源监控

在日常开发和运维中,我们经常需要对 Docker 容器进行批量操作,比如启动容器、重置 root 密码、删除无用容器等。手动执行命令效率低且容易出错。本文将通过 Python 脚本实现以下功能:

  1. 启动指定名称的容器
  2. 修改容器内 root 用户密码
  3. 安全删除容器(先 stop 再 rm)
  4. 获取当前主机的 CPU、内存、磁盘使用情况

所有操作均基于 subprocesspsutil 库,适用于 Linux 环境(如 CentOS、Ubuntu)。


前提条件

  • 已安装 Docker 并运行

  • Python 3.6+

  • 安装依赖库:

    bash 复制代码
    pip install psutil

一、启动 Docker 容器

python 复制代码
from subprocess import Popen, PIPE

name = "centos7-novnc3d"

p = Popen(['docker', 'start', name], stderr=PIPE)
_, stderr = p.communicate()
code = stderr.decode("utf-8").strip()

if code == "" or code.startswith(name):
    response = {"code": 200, 'msg': "success"}
else:
    response = {"code": 500, 'msg': code}

print(response)

✅ 说明:

  • docker start 成功时通常无输出(stderr 为空)
  • 若容器不存在或已运行,可能返回错误信息,需根据实际 stderr 判断

二、修改容器内 root 密码

python 复制代码
from subprocess import Popen, PIPE

root_passwd = "1234567"
name = "centos7-novnc28"

# 构造修改密码的 shell 命令
pass_cmd = f"echo 'root:{root_passwd}' | chpasswd && echo 'success'"

p2 = Popen(['docker', 'exec', '-i', name, '/bin/bash', '-c', pass_cmd],
           stdout=PIPE, stderr=PIPE)
stdout, stderr2 = p2.communicate()

# 注意:chpasswd 成功时通常无 stderr,成功标志由 stdout 中的 'success' 判断
output = stdout.decode("utf-8").strip()
error = stderr2.decode("utf-8").strip()

if "success" in output or (output == "" and error == ""):
    response = {"code": 200, 'msg': "root修改密码成功"}
else:
    response = {"code": 500, 'msg': error or output}

print(response)

⚠️ 注意:

  • 原始代码中误将 stderr 当作成功标志,实际上 chpasswd 成功时 不会输出到 stderr
  • 更可靠的方式是检查 stdout 是否包含 "success",或两者均为空

三、安全删除容器(先 stop 再 rm)

python 复制代码
from subprocess import Popen, PIPE

name = "reverent_matsumoto"

try:
    # 停止容器
    p_stop = Popen(['docker', 'stop', name], stdout=PIPE, stderr=PIPE)
    stdout, stderr = p_stop.communicate()
    stop_output = stdout.decode("utf-8").strip()

    if stop_output == name:  # docker stop 成功会返回容器名
        # 删除容器
        p_rm = Popen(['docker', 'rm', name], stdout=PIPE, stderr=PIPE)
        rm_out, rm_err = p_rm.communicate()
        response = {"code": 200, 'msg': "删除成功"}
    else:
        response = {"code": 500, 'msg': stderr.decode("utf-8")}

except FileNotFoundError:
    response = {"code": 500, 'msg': "docker未安装"}

print(response)

✅ 提示:

  • docker stop 成功时会输出容器 ID 或名称(取决于输入)
  • 必须先 stop 再 rm,否则 docker rm 会失败(除非加 -f

四、获取系统资源使用情况(CPU、内存、磁盘)

python 复制代码
import psutil
import os

def bytes2human(n):
    """将字节转换为易读格式"""
    symbols = ('KB', 'MB', 'GB', 'TB')
    for i, s in enumerate(symbols):
        unit = 1 << (i + 1) * 10  # 1KB=1024, 1MB=1024^2...
        if n < unit:
            return f"{n / (unit // 1024):.2f} {s}"
    return f"{n:.2f} B"

# 内存信息
mem_info = psutil.virtual_memory()
disk_usage = psutil.disk_usage('/')

response = {
    "code": 200,
    "msg": "success",
    "data": {
        "memory": {
            "current_process_memory": bytes2human(psutil.Process(os.getpid()).memory_info().rss),
            "total": bytes2human(mem_info.total),
            "used": bytes2human(mem_info.used),
            "available": bytes2human(mem_info.available),
            "free": bytes2human(mem_info.free),
            "active": bytes2human(mem_info.active),
            "inactive": bytes2human(mem_info.inactive),
            "percent": f"{mem_info.percent}%",
            "cpu_cores": psutil.cpu_count()
        },
        "disk_usage": {
            "total": bytes2human(disk_usage.total),
            "used": bytes2human(disk_usage.used),
            "free": bytes2human(disk_usage.free),
            "percent": f"{disk_usage.percent}%"
        }
    }
}

print(response)

📊 输出示例(简化):

json 复制代码
{
  "code": 200,
  "msg": "success",
  "data": {
    "memory": { "total": "15.50 GB", "percent": "45.2%", ... },
    "disk_usage": { "total": "931.51 GB", "percent": "32.1%", ... }
  }
}

总结

通过以上脚本,我们可以:

  • 自动化管理 Docker 容器生命周期
  • 动态修改容器内部用户密码(适用于初始化配置)
  • 实时监控服务器资源,便于集成到运维平台

💡 建议:在生产环境中,应增加日志记录、异常重试、权限校验等机制,提升脚本健壮性。


参考资料


如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注!也欢迎在评论区交流你的自动化运维经验 😊


✍️ 本文代码已在 CentOS 7 + Docker 20.10 + Python 3.9 环境下测试通过。

相关推荐
历程里程碑22 分钟前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
weixin_3954489123 分钟前
mult_yolov5_post_copy.c_cursor_0205
c语言·python·yolo
执风挽^39 分钟前
Python基础编程题2
开发语言·python·算法·visual studio code
虾说羊1 小时前
docker容器化部署项目流程
运维·docker·容器
纤纡.1 小时前
PyTorch 入门精讲:从框架选择到 MNIST 手写数字识别实战
人工智能·pytorch·python
大大大反派1 小时前
CANN 生态中的自动化部署引擎:深入 `mindx-sdk` 项目构建端到端 AI 应用
运维·人工智能·自动化
kjkdd1 小时前
6.1 核心组件(Agent)
python·ai·语言模型·langchain·ai编程
小镇敲码人1 小时前
剖析CANN框架中Samples仓库:从示例到实战的AI开发指南
c++·人工智能·python·华为·acl·cann
萧鼎1 小时前
Python 包管理的“超音速”革命:全面上手 uv 工具链
开发语言·python·uv
缺点内向2 小时前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net