Docker Swarm如何自动移除已停止/未使用的容器?
嘿,这个问题我之前维护Swarm集群时也碰到过!Docker Swarm默认会保留失败任务对应的停止容器,方便排查问题,但时间久了确实会堆积,下面给你两个实用的解决办法:
方法1:通过Swarm服务配置自动清理失效任务容器
这是最贴合Swarm集群场景的方案——直接限制Swarm保留的任务历史数量,让它自动移除旧的停止容器。
你可以在部署服务(或Stack)时,添加task_history_limit配置:
- 如果用命令行创建服务:
docker service create \ --name your-service \ --replicas 2 \ --task-history-limit 0 \ your-image:tag - 如果用Docker Compose部署Stack,在
docker-compose.yml的deploy块里添加:version: '3.8' services: your-service: image: your-image:tag deploy: replicas: 2 task_history_limit: 0 # 设置为0表示不保留历史任务容器
设置为0的话,当容器失败重启后,旧的停止容器会被立即移除。如果你偶尔需要查看最近的失败日志,可以把这个值设为1或2,既保留少量历史用于排查,又不会堆积太多无用容器。
方法2:定时全局清理所有停止容器
如果你的集群里还有非Swarm创建的停止容器,或者不想逐个修改服务配置,可以创建一个全局定时服务,在所有节点上自动清理停止的容器。
比如用cron镜像部署一个Swarm全局服务,每天凌晨执行一次清理:
docker service create \ --name container-pruner \ --mode global \ --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \ cron:latest \ sh -c "echo '0 0 * * * docker container prune -f' > /etc/crontabs/root && crond -f"
这个服务会在每个节点上每天0点自动运行docker container prune -f,删除所有处于停止状态的容器。注意:这个命令会清理所有停止容器,包括你手动停止的容器,如果你有需要保留的手动容器,建议谨慎使用,或者调整prune命令的参数(比如加上--filter过滤特定标签的容器)。
内容的提问来源于stack exchange,提问作者martin




