Exited容器本质是主进程终止但元数据保留,状态可查docker ps -a --filter "status=exited",退出码(如0正常、137内存溢出)通过docker inspect获取,需定期用docker container prune -f或docker rm $(docker ps -aq --filter "status=exited")清理。
容器处于 exited 状态时,数据卷(尤其是 bind mount)有时会显示“busy”或无法卸载,表现为 umount: /path: target is busy,本质是内核仍持有挂载引用,常见于容器虽已退出但进程残留、命名空间未完全释放,或 docker daemon 未及时清理挂载点。
确认是否真被占用
不要直接强制卸载。先查清谁在用:
- 运行
lsof +D /your/bind/mount/path或fuser -v /your/bind/mount/path,看是否有残留进程(如未彻底退出的 init 进程、shell、日志收集器) - 检查该路径是否被其他容器复用:
docker ps -a --format "{{.ID}} {{.Names}} {{.Mounts}}" | grep -F '/your/bind/mount/path' - 查看挂载详情:
findmnt -D | grep -F '/your/bind/mount/path',确认挂载类型(bind / volume)、propagation 模式(如 shared/slave)
释放挂载引用的常用方法
按安全优先级排序,避免破坏文件系统一致性:
- 重启 Docker daemon:
sudo systemctl restart docker——多数情况下可自动清理僵尸挂载,适用于生产环境快速恢复 - 手动清理命名空间残留:若发现
lsof显示有docker-containe或sh进程残留,用sudo kill -9 PID终止后重试umount - 延迟卸载(lazy unmount):
sudo umount -l /your/bind/mount/path——立即解除用户空间可见性,内核在无引用后自动回收,适合紧急场景 - 对 volume 类型,优先用 Docker 命令管理:
docker volume rm vol_name,而非直接操作/var/lib/docker/volumes/下目录
预防锁死的关键配置
从源头减少挂载残留风险:
- 启动容器时避免使用
--privileged或--cap-add=SYS_ADMIN,除非必要——这类权限可能绕过挂载隔离机制 - bind mount 路径尽量不嵌套在其他挂载点内(如不要把
/host/data挂到/mnt/nfs/share下),防止 propagation 链式传播 - 在
docker run中显式设置--mount type=bind,source=/host/path,destination=/container/path,bind-propagation=rprivate,禁用共享传播,避免宿主机挂载变动影响容器 - 容器停止前主动清理:在
CMD或入口脚本末尾加sync && sleep 0.1,确保 I/O 完成后再退出主进程
本质上,这不是 Docker 特有 bug,而是 Linux 挂载命名空间与进程生命周期耦合导致的正常行为。只要不强行 rm -rf 挂载点目录或跳过清理直接重启宿主机,基本都能稳妥解决。


















