
أداة اختبار الفوضى، ومحاكاة الشبكة، واختبار الضغط للحاويات
أداة اختبار الفوضى لحاويات Docker و containerd و Podman
بدء سريع · دليل المستخدم · فوضى الشبكة · النشر · المساهمة
Pumba هي أداة لاختبار الفوضى ومحاكاة الشبكة لحاويات Docker و containerd و Podman. مستوحاة من Netflix Chaos Monkey، تنقل Pumba هندسة الفوضى إلى مستوى الحاويات — قتل الحاويات أو إيقافها أو إيقافها مؤقتًا أو إزالتها، وحقن تأخيرات الشبكة وفقدان الحزم، أو اختبار إجهاد موارد الحاويات.
graph LR
A[Pumba CLI] -->|Docker API / containerd API / Podman compat API| B[Container Runtime]
B -->|List & Filter| C[Target Containers]
A -->|kill / stop / pause / rm| C
A -->|netem / iptables| D[Helper Container / Direct Exec]
D -->|Shares network namespace| C
D -->|Runs tc / iptables| E[Network Chaos]
| Runtime | Socket (default) | netem / iptables / stress | Notes |
|---|---|---|---|
| Docker | /var/run/docker.sock | Works as root or with socket access | Default runtime. |
| containerd | /run/containerd/containerd.sock | Requires root (overlayfs mounts for sidecar) | Namespaces: k8s.io (Kubernetes), moby (Docker-managed), default (pure containerd). |
| Podman | /run/podman/podman.sock (rootful) | Requires rootful Podman (fails fast else) | Uses Podman's Docker-compat API; on macOS pumba runs inside podman machine (see below). |
يستهدف Pumba حاويات Linux — يعتمد كل إجراء فوضى على أوليات Linux (netns و cgroups v2 و iptables و tc qdiscs ومقابس بيئة تشغيل الحاويات). الملفات الثنائية الصادرة:
| OS | amd64 | arm64 | Notes |
|---|---|---|---|
| Linux | ✅ | ✅ | الهدف الأساسي. شغّل pumba على نفس نواة الحاويات المستهدفة. |
| macOS | ✅ | ✅ | لراحة المطوّرين فقط. استخدمه لقيادة VM بعيد يعمل بـ Docker/Podman/containerd (مثل Colima أو podman machine). |
| Windows | ❌ | ❌ | غير مدعوم وغير مخطط له. انظر أدناه. |
لا يُبنى Windows عمدًا. أوليات الفوضى — كتابات Linux netns/cgroup، حقن الحاوية المساعدة (sidecar) عبر tc/iptables، إعادة توجيه إشارات POSIX (SIGCONT/SIGSTOP/SIGUSR1/SIGUSR2 المستخدمة من بيئة تشغيل containerd) — لا مقابل لها في Windows. لا توجد حالة استخدام معقولة لـ Windows حتى مع الواجهة الخلفية WSL2 في Docker Desktop، لذلك لا يُنشر أي ملف ثنائي لـ Windows. لن تُقبل طلبات السحب (PRs) التي تضيف دعمًا لـ Windows؛ يرجى تشغيل pumba على Linux (محليًا أو داخل حاوية أو VM).
| الفئة | الأوامر | الوصف |
|---|---|---|
| فوضى الحاويات | kill, stop, pause, rm, restart | تعطيل دورة حياة الحاويات |
| التنفيذ | exec | تشغيل أوامر داخل الحاويات |
| تأخير الشبكة | netem delay | إضافة كمون إلى حركة المرور الصادرة |
| فقدان الحزم | netem loss, iptables loss | إسقاط الحزم (الصادرة والواردة) |
| تأثيرات الشبكة | netem duplicate, corrupt, rate | تكرار الحزم أو إفسادها أو تحديد معدل نقلها |
| اختبار الإجهاد | stress | إجهاد CPU والذاكرة والإدخال/الإخراج عبر stress-ng (الحقن في cgroup فرعي أو نفس cgroup) |
| الاستهداف | الأسماء، التعبيرات النمطية (re2:)، التسميات، --random | تحديد مرن للحاويات |
| الجدولة | --interval | فوضى متكررة على فترات زمنية ثابتة |
حمّل أحدث إصدار الخاص بمنصتك، أو استخدم Docker:
# Binary
curl -sL https://github.com/alexei-led/pumba/releases/latest/download/pumba_linux_amd64 -o pumba
chmod +x pumba
# Docker (recommended)
docker pull ghcr.io/alexei-led/pumba:latest
# Kill a random container matching "test" every 30 seconds
pumba --interval=30s --random kill "re2:^test"
# Add 3 seconds network delay to mydb for 5 minutes
pumba netem --duration 5m delay --time 3000 mydb
# Drop 10% of incoming packets to myapp for 2 minutes
pumba iptables --duration 2m loss --probability 0.1 myapp
# Stress CPU of mycontainer for 60 seconds
pumba stress --duration 60s --stressors="--cpu 4 --timeout 60s" mycontainer
# Kill a container by ID via containerd
pumba --runtime containerd --containerd-namespace k8s.io kill <container-id>
# Add network delay via containerd (requires tc in the container image)
pumba --runtime containerd --containerd-namespace moby \
netem --duration 5m delay --time 3000 <container-id>
يتواصل Pumba مع Podman عبر مقبسه المتوافق مع Docker. خيار --podman-socket اختياري — إذا كان فارغًا، يستكشف pumba $CONTAINER_HOST ثم $PODMAN_SOCK ثم podman machine inspect ثم /run/podman/podman.sock ثم $XDG_RUNTIME_DIR/podman/podman.sock بالترتيب.
# Kill a container by name via Podman (rootful socket auto-detected)
sudo pumba --runtime podman kill mycontainer