Paused更适合封禁,因其仅冻结进程调度,保留内存数据、TCP连接、网络配置及文件锁状态;而stop会终止进程并释放资源,kill则强制中断,易导致数据丢失或事务破坏。
直接用 docker pause 就能临时封禁异常流量容器,不终止、不丢状态,适合快速隔离加观察。
为什么Paused比stop或kill更适合封禁
Stop 会终止进程、清空网络连接、释放资源;Kill 更是强制中断,可能丢失未刷盘日志或破坏事务一致性。而 Paused 只冻结进程调度,保留:
- 内存中全部运行时数据(如缓存、会话、未提交事务)
- 已建立的 TCP 连接(仍显示 ESTABLISHED,便于后续分析连接来源)
- 网络命名空间和 IP 配置(
ip addr、netstat -tuln在宿主机上仍可查) - 挂载卷内容与文件锁状态(不影响其他容器对共享卷的读写)
实战封禁四步操作
发现某容器(如 api-gateway)突发大量 499/502 请求或 CPU 持续 100%,按顺序执行:
-
确认异常:用
docker stats api-gateway查实时资源占用,docker logs --tail 20 api-gateway看最近错误 -
立即封禁:运行
docker pause api-gateway,几秒内所有请求将卡住或超时返回 -
验证冻结:
-
docker top api-gateway返回空或报错 → 进程已不可见 -
ps aux | grep $(cat /var/run/docker/containerd/daemon/io.containerd.runtime.v2.task/default/api-gateway/init.pid 2>/dev/null)中状态列为 T(stopped) -
curl -v http://localhost:8000/health卡住或 Connection refused
-
-
同步分析:在 pause 状态下检查:
- 宿主机侧:抓包
tcpdump -i docker0 port 8000 -w pause-analyze.pcap - 容器内残留信息(需提前准备):若容器启用了
nsenter或挂载了/proc,可用nsenter -t $(cat /proc/$(cat /var/run/docker/containerd/daemon/io.containerd.runtime.v2.task/default/api-gateway/init.pid)/status | grep PPid | awk '{print $2}') -m -u -i -n -p sh -c 'ls /proc/*/fd | head -5'查打开连接 - cgroup 冻结状态:
cat /sys/fs/cgroup/freezer/docker/*/freezer.state 2>/dev/null | grep FROZEN
- 宿主机侧:抓包
关键注意事项
Pause 是“快照式暂停”,不是万能方案,必须规避以下风险:
- 分布式锁失效:Redis/Etcd/ZooKeeper 客户端心跳停摆,租约会在 TTL 后自动释放 → 若该容器持有业务锁,务必先人工确认或触发安全释放
-
客户端超时级联:HTTP Keep-Alive 连接、数据库连接池、gRPC 流等会在数秒至数十秒后断开 → 建议单次 pause 不超过 2 分钟,长分析改用
docker exec+strace或 eBPF 工具 - 不适用于 Windows 容器:Docker for Windows 不支持 pause/unpause,仅限 Linux 容器
-
避免嵌套 pause:不能对已 paused 容器重复执行
docker pause,会报错且无意义
恢复与收尾
分析完成后,用 docker unpause api-gateway 恢复服务。注意:
- 恢复瞬间应用会继续执行被冻结前的系统调用(如刚卡在
accept()的监听线程会立刻响应新连接) - 日志输出会从 pause 前最后一条继续,log driver 缓存的数据不会丢失
- 若发现是恶意流量,应紧接着更新防火墙规则或 WAF 策略,而非依赖 pause 长期防护











