Docker Desktop 点“Stop”仅发送 SIGTERM 使容器进入 exited 状态,不会删除容器;必须用 docker compose down(或 docker-compose down)显式停止并删除容器、网络,加 -v 才删命名卷,加 --rmi all 才删所有关联镜像。

直接说结论:Docker Desktop 里残留的 Compose 服务容器,不能只靠界面点“Stop”或关掉窗口来清理——它根本不会自动删容器,必须用命令行明确执行 docker-compose down 或 docker compose down(v2+)。
为什么 Docker Desktop 的“停止”按钮不等于“删除容器”
Docker Desktop 界面中点击某个 Compose 栈的 Stop,只是调用 docker-compose stop,相当于给容器发 SIGTERM 信号并保持其状态为 exited。这些容器仍留在 docker ps -a 列表里,占用 ID、端口、磁盘空间,甚至可能干扰新启动的服务(比如端口被占、卷挂载冲突)。
常见错误现象包括:
- 重启同一
docker-compose.yml后报错port is already allocated - 在 Docker Desktop 的 Containers 标签页看到一堆 “Exited (0)” 的灰条容器,但找不到对应栈
- 执行
docker system df发现Reclaimable空间巨大,却无法通过界面释放
docker-compose down 和 docker compose down 的区别
Docker Desktop 从 v4.16+ 默认启用 Compose V2(即 docker compose 命令),而旧版用的是 docker-compose(带短横线)。两者行为基本一致,但注意以下细节:
-
docker-compose down:适用于所有版本,兼容性最好;路径下必须有docker-compose.yml或指定-f -
docker compose down:V2 原生命令,响应更快,对profiles和include支持更好;若提示command not found,说明 Docker Desktop 未启用 V2(可在 Settings → Features in development → Use the new Docker Compose V2 中开启) - 二者默认都不删卷(-v 需显式加),也不删镜像(
--rmi需显式加)
示例:
docker compose down # 停止 + 删除容器 + 删除默认网络
docker compose down -v # 加 -v 才会删命名卷(⚠️数据会丢)
孤立容器(orphaned containers)怎么识别和清理
所谓“孤立容器”,是指那些由旧版 docker-compose.yml 启动、后来文件被改名/删掉/移动,但容器仍在运行或已退出的状态。Docker Desktop 不会主动关联它们到任何栈,所以在 UI 上看不到归属,但 docker ps -a 能查到。
识别方式:
- 看容器名是否含
_1、_web_1这类 Compose 模式命名(如myapp-db-1) - 执行
docker inspect <container_id> | grep com.docker.compose</container_id>,若输出非空,基本可判定是 Compose 创建的 - 检查创建时间:
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.CreatedAt}}" --sort Created
安全清理建议:
- 先停再删:
docker stop $(docker ps -aq --filter "status=exited" --filter "name=_1$" | head -n 5)(加head防误删) - 批量删已退出的 Compose 容器:
docker rm $(docker ps -aq --filter "status=exited" --filter "name=_1$") - 慎用
docker container prune:它会删所有已退出容器,不管是不是 Compose 创建的
删完容器后,镜像和卷还剩着怎么办
执行 docker compose down 后,镜像和命名卷默认保留——这是设计使然,避免误删数据。但如果你确认不需要了,得手动补刀:
- 删本地构建的镜像(比如
build: .生成的):docker compose down --rmi local - 删所有关联镜像(含
image: nginx:alpine这类拉取的):docker compose down --rmi all(失败时说明该镜像被其他容器引用) - 删命名卷(⚠️不可逆):
docker compose down -v;若只想删特定卷,用docker volume rm <volume_name></volume_name> - 查残留卷:
docker volume ls --filter "dangling=true",再用docker volume prune清理悬空卷
真正容易被忽略的是:--rmi all 和 -v 组合使用时,Docker Desktop 不会弹窗提醒,也不会在 UI 中标记风险,全靠你记清自己删了什么。











