当前位置: 首页 > news >正文

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

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

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

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


前提条件

  • 已安装 Docker 并运行
  • Python 3.6+
  • 安装依赖库:
    pipinstallpsutil

一、启动 Docker 容器

fromsubprocessimportPopen,PIPE name="centos7-novnc3d"p=Popen(['docker','start',name],stderr=PIPE)_,stderr=p.communicate()code=stderr.decode("utf-8").strip()ifcode==""orcode.startswith(name):response={"code":200,'msg':"success"}else:response={"code":500,'msg':code}print(response)

✅ 说明:

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

二、修改容器内 root 密码

fromsubprocessimportPopen,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"inoutputor(output==""anderror==""):response={"code":200,'msg':"root修改密码成功"}else:response={"code":500,'msg':errororoutput}print(response)

⚠️ 注意:

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

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

fromsubprocessimportPopen,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()ifstop_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")}exceptFileNotFoundError:response={"code":500,'msg':"docker未安装"}print(response)

✅ 提示:

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

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

importpsutilimportosdefbytes2human(n):"""将字节转换为易读格式"""symbols=('KB','MB','GB','TB')fori,sinenumerate(symbols):unit=1<<(i+1)*10# 1KB=1024, 1MB=1024^2...ifn<unit:returnf"{n/(unit//1024):.2f}{s}"returnf"{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)

📊 输出示例(简化):

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

总结

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

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

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


参考资料

  • Docker CLI 文档
  • psutil 官方文档

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


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

http://www.jsqmd.com/news/285663/

相关文章:

  • 从DEM到等高线:手撕矢量与栅格两种地形表达
  • 智表ZCELL产品V3.5 版发布,新增行列选中操作等功能
  • 自定义广播数据实现网络冲突自检中的问题
  • 深入解析:量化血流动力学新时代:以数据驱动重构临床决策的精准与高效
  • 整数、浮点数的内存中存储
  • AlexNet 迁移学习实战:CIFAR-10 图像分类实验 - 指南
  • element-ui table高度自适应实现分享
  • Linux Rootkit 手法解析(下):深入内核态的“隐形”攻防战
  • Linux Rootkit 手法解析(上):用户态的“隐身术”与检测思路
  • TikTok矩阵工具实操指南:分主体适配与落地流程拆解
  • 人群仿真软件:Pathfinder_(3).人群建模与行为设置
  • 人群仿真软件:Pathfinder_(2).Pathfinder的基本功能与操作
  • FastAPI系列(02):第一个示例
  • DeepSeek+Cursor封神指南:AI驱动编码全流程实战(含代码精解)
  • 心愈语伴:DeepSeek+Qwen2.5打造专属情感聊天工具全教程
  • 2026年会议纪要工具top9_工具_测评_ASR
  • Vue3+Cesium教程(38)--动态雾浓度、颜色
  • 一天一个Python库:requests - 简单好用的HTTP请求库
  • Vue3+Cesium教程(37)--下雪啦!动态设置降雪效果
  • 星瞳OpenMV官方机械臂教程|从零开始:Robot Arm机械臂快速上手
  • 【docker部署milvus向量库和可视化界面attu】
  • PX4中关于GPS质量检测和相关控制参数
  • PX4导航遇到GPS数据丢失的处理和相关控制参数
  • Java小白求职者面试:从Spring Boot到微服务架构设计的问答解析
  • day162—递归—买卖股票的最佳时机Ⅱ(LeetCode-122)
  • day163—递归—买卖股票的最佳时机含冷冻期(LeetCode-309)
  • Jupyter Notebook的5个实用技巧,可视化模型训练过程
  • send-proxy vs send-proxy-v2 vs send-proxy-v2-ssl
  • 完整教程:Spring Boot 中的定时任务:从基础调度到高可用实践
  • 北京汽车美容哪里好?五方天雅汽车服务园全面评测