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