
Ferramenta de testes de caos, emulação de rede e testes de estresse para contêineres.
Ferramenta de teste de caos para Docker, containerd e Podman
Início Rápido · Guia do Usuário · Caos de Rede · Implantação · Contribuição
Pumba é uma ferramenta de teste de caos e emulação de rede para contêineres Docker, containerd e Podman. Inspirado no Netflix Chaos Monkey, o Pumba leva a engenharia do caos ao nível de contêineres — mate, pare, pause e remova contêineres, injete atrasos de rede e perda de pacotes ou teste a resistência dos recursos dos contêineres.
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]
O Pumba tem como alvo contêineres Linux — toda ação de caos depende de primitivas do Linux (netns, cgroups v2, iptables, qdiscs tc, sockets do runtime de contêiner). Binários publicados:
O Windows não é compilado intencionalmente. As primitivas de caos — gravações em netns/cgroups do Linux, injeção de sidecar tc/iptables, encaminhamento de sinais POSIX (SIGCONT/SIGSTOP/SIGUSR1/SIGUSR2 usados pelo runtime containerd) — não têm equivalente no Windows. Não há caso de uso plausível no Windows, mesmo com o backend WSL2 do Docker Desktop; portanto, nenhum binário para Windows é publicado. PRs que adicionem suporte ao Windows não serão aceitos; execute o pumba no Linux (nativo, contêiner ou VM).
Baixe a última versão para sua plataforma ou use 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>
O Pumba se comunica com o Podman por meio do socket compatível com Docker. --podman-socket é opcional — se estiver vazio, o pumba verifica $CONTAINER_HOST, $PODMAN_SOCK, podman machine inspect, /run/podman/podman.sock e $XDG_RUNTIME_DIR/podman/podman.sock, nessa ordem.
# Kill a container by name via Podman (rootful socket auto-detected)
sudo pumba --runtime podman kill mycontainer
# Add network delay via Podman (requires rootful socket)
sudo pumba --runtime podman netem --duration 5m delay --time 3000 mycontainer
# Stress CPU via Podman (default child-cgroup mode)
sudo pumba --runtime podman stress --duration 60s --stressors="--cpu 4 --timeout 60s" mycontainer
# Explicit socket override
pumba --runtime podman --podman-socket unix:///run/podman/podman.sock kill mycontainer
netem, iptables e stress exigem Podman rootful — o modo rootless falha rapidamente com uma mensagem clara apontando para podman machine set --rootful (macOS) ou para a unit systemd rootful (Linux).
O Podman no macOS roda dentro de uma VM Linux. O Pumba deve ser executado no mesmo kernel dos contêineres alvo (leitura de /proc/<pid>/cgroup no lado do host); portanto, execute o binário pumba dentro da VM do podman machine:
# one-time setup
brew install podman
podman machine init --rootful --cpus 4 --memory 4096 --now
podman machine ssh sudo dnf install -y bats # optional, for bats tests
# copy a linux/arm64 or linux/amd64 pumba binary into the VM
podman machine ssh sudo cp /path/to/pumba /usr/local/bin/
# run inside the VM
podman machine ssh sudo pumba --runtime podman --log-level debug ps
podman machine ssh sudo pumba --runtime podman netem --duration 10s delay --time 200 <container-id>
Dica: Para caos de rede em contêineres sem
tc/iptables, use--tc-imagepara iniciar um sidecar:pumba --runtime containerd netem --tc-image ghcr.io/alexei-led/pumba-alpine-nettools:latest \ --duration 5m delay --time 3000 <container-id>
docker run -it --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
ghcr.io/alexei-led/pumba --interval=10s --random kill "re2:^test"
| Registro | Imagem | Status |
|---|---|---|
| GitHub Container Registry | ghcr.io/alexei-led/pumba | ✅ Principal |
| Docker Hub | alexeiled/pumba | ⚠️ Obsoleto |
As imagens são compiladas nativamente para linux/amd64 e linux/arm64 (sem QEMU).
| Runtime | Socket (padrão) | netem / iptables / stress | Observações |
|---|
| Docker | /var/run/docker.sock | Funciona como root ou com acesso ao socket | Runtime padrão. |
| containerd | /run/containerd/containerd.sock | Requer root (montagens overlayfs para o sidecar) | Namespaces: k8s.io (Kubernetes), moby (gerenciado pelo Docker), default (containerd puro). |
| Podman | /run/podman/podman.sock (rootful) | Requer Podman rootful (falha rapidamente caso contrário) | Usa a API compatível com Docker do Podman; no macOS, o pumba roda dentro do podman machine (veja abaixo). |
| OS | amd64 | arm64 | Observações |
|---|
| Linux | ✅ | ✅ | Alvo principal. Execute o pumba no mesmo kernel dos contêineres alvo. |
| macOS | ✅ | ✅ | Apenas para ergonomia de desenvolvimento. Use-o para controlar uma VM remota Docker/Podman/containerd (ex.: Colima, podman machine). |
| Windows | ❌ | ❌ | Não suportado e não planejado. Veja abaixo. |
| Categoria | Comandos | Descrição |
|---|
| Caos de contêineres | kill, stop, pause, rm, restart | Interrompe o ciclo de vida dos contêineres |
| Execução | exec | Executa comandos dentro de contêineres |
| Atraso de rede | netem delay | Adiciona latência ao tráfego de saída |
| Perda de pacotes | netem loss, iptables loss | Descarta pacotes (saída e entrada) |
| Efeitos de rede | netem duplicate, corrupt, rate | Duplica, corrompe ou limita a taxa de pacotes |
| Teste de estresse | stress | Estresse de CPU, memória e I/O via stress-ng (cgroup filho ou injeção no mesmo cgroup) |
| Alvos | nomes, regex (re2:), labels, --random | Seleção flexível de contêineres |
| Agendamento | --interval | Caos recorrente em intervalos fixos |
| Flag | Padrão | Descrição |
|---|
--runtime | docker | Runtime de contêiner (docker, containerd ou podman) |
--containerd-socket | /run/containerd/containerd.sock | Caminho do socket do containerd |
--containerd-namespace | k8s.io | Namespace do containerd (k8s.io para Kubernetes, moby para Docker) |
--podman-socket | (detectado automaticamente) | URI do socket do Podman (ex.: unix:///run/podman/podman.sock); vazio aciona a detecção automática |
| Documento | Descrição |
|---|
| Guia do Usuário | Comandos de caos em contêineres, seleção de alvos, agendamento, configuração |
| Caos de Rede | netem, iptables, cenários avançados, diagramas de arquitetura |
| Teste de estresse | Testes de estresse de CPU/memória/I/O com stress-ng |
| Implantação | Docker, DaemonSets do Kubernetes, OpenShift |
| Contribuição | Compilar a partir do código-fonte, executar testes, estrutura do projeto |