使用 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 环境下测试通过。

相关推荐
weixin_462446234 小时前
Python 异步下载文件实战:使用 asyncio + aiohttp 实现高并发下载
python·并发下载
bloglin999994 小时前
anaconda环境中如何生成requirements
python
溜达的大象4 小时前
Navidrome 打造专属无损音乐库,加载cpolar局域网外访问也能超丝滑
阿里云·docker·云原生·eureka
【赫兹威客】浩哥4 小时前
【赫兹威客】框架模板-后端bat脚本部署教程
python·django
Cestb0n4 小时前
某果app 加密校验算法逆向分析
python·算法·逆向安全
薛定谔的猫喵喵4 小时前
解决 xlrd 2.0+ 版本只支持 xls 格式的问题
python·excel
2501_941805314 小时前
使用Python和Go构建高性能分布式任务调度系统的实践分享
分布式·python·golang
OLOLOadsd1234 小时前
基于YOLO11-C3k2-LFE的岩石颗粒智能检测与识别系统_2
python
_pass_4 小时前
Agent-Chat模式核心流程解析
python