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

相关推荐
AI探索者16 小时前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者17 小时前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python
FishCoderh18 小时前
Python自动化办公实战:批量重命名文件,告别手动操作
python
躺平大鹅18 小时前
Python函数入门详解(定义+调用+参数)
python
曲幽19 小时前
我用FastAPI接ollama大模型,差点被asyncio整崩溃(附对话窗口实战)
python·fastapi·web·async·httpx·asyncio·ollama
两万五千个小时1 天前
落地实现 Anthropic Multi-Agent Research System
人工智能·python·架构
小p1 天前
docker学习: 2. 构建镜像Dockerfile
docker
哈里谢顿1 天前
Python 高并发服务限流终极方案:从原理到生产落地(2026 实战指南)
python
用户8356290780512 天前
无需 Office:Python 批量转换 PPT 为图片
后端·python
小p2 天前
docker学习: 1. docker基本使用
docker