批量管理容器和镜像
面试题
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


暂无评论内容