在日常开发和运维中,我们经常需要对 Docker 容器进行批量操作,比如启动容器、重置 root 密码、删除无用容器等。手动执行命令效率低且容易出错。本文将通过 Python 脚本实现以下功能:
- 启动指定名称的容器
- 修改容器内 root 用户密码
- 安全删除容器(先 stop 再 rm)
- 获取当前主机的 CPU、内存、磁盘使用情况
所有操作均基于subprocess和psutil库,适用于 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 环境下测试通过。