You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.ymldeploy块里添加:
    version: '3.8'
    services:
      your-service:
        image: your-image:tag
        deploy:
          replicas: 2
          task_history_limit: 0  # 设置为0表示不保留历史任务容器
    

设置为0的话,当容器失败重启后,旧的停止容器会被立即移除。如果你偶尔需要查看最近的失败日志,可以把这个值设为12,既保留少量历史用于排查,又不会堆积太多无用容器。

方法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

火山引擎 最新活动