批量管理容器和镜像

批量管理容器和镜像

面试题

Docker 如何批量管理容器和镜像?有哪些高效的批量操作技巧?

标准答案

生产环境中经常需要批量清理、停止、删除容器和镜像。掌握批量管理技巧能大幅提高运维效率。

批量管理容器

批量停止所有运行中容器

# 方法一:使用 -f 过滤(推荐)
docker stop $(docker ps -q)

# 方法二:过滤特定名称
docker stop $(docker ps -q --filter "name=web")

# 方法三:xargs 模式
docker ps -q | xargs docker stop

批量启动/重启

# 批量启动所有已停止容器
docker start $(docker ps -aq --filter status=exited)

# 批量重启所有运行中容器
docker restart $(docker ps -q)

批量删除容器

# 删除所有已退出的容器
docker rm $(docker ps -aq --filter status=exited)

# 强制删除所有容器(包括运行中)
docker rm -f $(docker ps -aq)

# 删除运行超过 24 小时的容器
docker ps -aq --filter "status=exited" --filter "until=24h" | xargs docker rm

# 删除特定标签的容器
docker rm $(docker ps -aq --filter "label=env=test")

批量暂停/恢复

# 暂停所有运行中的容器
docker pause $(docker ps -q)

# 恢复所有暂停的容器
docker unpause $(docker ps -q --filter status=paused)

批量管理镜像

批量删除镜像

# 删除所有未使用的镜像(dangling images)
docker image prune

# 删除所有未使用的镜像(包括不被引用的)
docker image prune -a

# 根据名称模式删除
docker rmi $(docker images "myapp*" -q)

# 删除所有  镜像
docker rmi $(docker images -f "dangling=true" -q)

# 删除旧版本镜像(保留最新)
docker images myapp --format "{{.ID}}" | tail -n +2 | xargs docker rmi

批量标记镜像

# 批量打标签
for tag in v1.0 v1.1 v2.0; do
  docker tag myapp:latest myapp:$tag
done

# 批量推送所有标签
docker images myapp --format "{{.Repository}}:{{.Tag}}" | xargs -I {} docker push {}

使用 system prune(一键清理)

# 最强大的清理命令
docker system prune

# 清理包括:
# - 所有停止的容器
# - 所有未被使用的网络
# - 所有 dangling 镜像
# - 所有构建缓存

# 清理所有(包括未使用的镜像)
docker system prune -a

# 不提示直接执行
docker system prune -f
docker system prune -a -f --volumes  # 甚至清理数据卷(慎用)

高级过滤技巧

按时间过滤

# 创建时间超过 24 小时的容器
docker ps -aq --filter "until=24h"

# 特定时间之前
docker ps -aq --filter "before=myapp_v1"

# 特定时间之后
docker ps -aq --filter "since=myapp_v2"

按状态过滤

# 组合过滤条件
docker ps -aq \
  --filter status=exited \
  --filter status=created \
  --filter "label=env=test"

# 排除某些状态
docker ps -aq | grep -v "$(docker ps -q)"

按标签过滤

# 给容器打标签便于批量管理
docker run -d --label project=myapp --label env=prod nginx

# 按标签过滤
docker rm $(docker ps -aq --filter "label=env=test")

实用脚本示例

清理残留容器

#!/bin/bash
# clean-containers.sh

echo "=== 清理已退出的容器 ==="
docker rm $(docker ps -aq --filter status=exited) 2>/dev/null
echo "=== 清理 dangling 镜像 ==="
docker image prune -f
echo "=== 清理构建缓存 ==="
docker builder prune -f
echo "=== 磁盘使用情况 ==="
docker system df

按项目批量操作

#!/bin/bash
# manage-project.sh
PROJECT=$1
ACTION=$2

containers=$(docker ps -aq --filter "label=project=$PROJECT")

case $ACTION in
  stop)
    docker stop $containers
    ;;
  start)
    docker start $containers
    ;;
  restart)
    docker restart $containers
    ;;
  rm)
    docker rm -f $containers
    ;;
  *)
    echo "Usage: $0  "
    ;;
esac

常用组合命令

# 查看容器和镜像占用空间
docker system df

# 格式化输出(更像 Linux df)
docker system df --format "table {{.Type}}\t{{.TotalCount}}\t{{.Size}}"

# 停止所有容器并删除
docker stop $(docker ps -q) && docker rm $(docker ps -aq)

# 删除旧镜像,保留最近几个版本
docker images --format "{{.ID}} {{.Repository}} {{.Tag}}" | \
  grep "myapp" | \
  sort -k3 -V | \
  head -n -3 | \
  awk '{print $1}' | \
  xargs docker rmi

性能注意事项

# 大量容器时注意命令超时
# 建议加上超时限制
timeout 10 docker stop $(docker ps -q)

# 分批操作(避免一次性操作过多)
docker ps -q | head -10 | xargs docker stop
sleep 2
docker ps -q | head -10 | xargs docker stop

安全注意事项

# 删除前确认(强烈建议)
echo "Will delete:"
docker ps -aq --filter status=exited
read -p "Confirm? (y/N) " confirm
if [ "$confirm" = "y" ]; then
  docker rm $(docker ps -aq --filter status=exited)
fi

总结

批量管理的核心是组合 $(docker ... -q) 命令替换和 xargs。最常用:
– 批量停止:docker stop $(docker ps -q)
– 批量清理退出容器:docker rm $(docker ps -aq -f status=exited)
– 一键清理:docker system prune -a -f

始终先确认再执行删除操作,特别是生产环境。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容