虽然Docker具有停止和删除image,容器,网络和卷的命令,但它们并不全面。使用这组指令清理并刷新整个Docker环境,并将它们设置为shell别名。
本篇文章解释了如何:
找出系统中存在的Docker数据和进程
删除未使用的Docker镜像,容器,卷和网络
全部删除以获得完全新鲜的Docker环境
如何使用shell别名轻松地重用这些命令
I. Docker glossary
image:一个只读模板,包含创建Docker容器的说明
容器:image的可运行实例。你可以使用Docker API或CLI创建,启动,停止,移动或删除容器
volume:保留Docker容器生成和使用的数据
(:)悬空:未使用的镜像或卷
network:连接Docker容器和服务
II. 列出Docker进程和数据
一个有用的起点是查看系统上已加载的docker元素的列表。
III. 只需清理未使用的数据和进程
清理Docker环境的主要区别在于你是想要完全刷新还是仅prune(修剪)它。
Docker提供了一种方便的方法来删除未使用的容器,网络和image:
docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all build cache
默认情况下,如果当前没有使用该卷的容器,则不会删除卷以防止删除重要数据。--volumes在运行命令时使用该标志来prune卷
因此,要删除卷(--volumes),任何未使用的image(--all),以及覆盖确认提示符(--force):
docker system prune --all --force --volumes
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all volumes not used by at least one container
- all images without at least one container associated to them
- all build cache
prune 也可以用于一个方面:
docker container prune #删除所有已停止的容器
docker volume prune #删除所有未使用的卷
docker image prune #删除未使用的image
IV. 销毁所有完整的Docker
上面的最后一个命令不会删除所有正在运行的容器 因此,对于完整的系统refresh ,你需要停止所有容器,然后运行system prune命令。
幸运的是,docker的stop containers命令就是这样 docker container stop [CONTAINERS...]
但是,要获取该命令的正确信息,你需要获取所有容器ID的列表。
docker container ls -aq
ls 列出容器
--all / -a 所有容器(默认显示刚刚运行)
--quiet / -q 仅显示数字ID
所以要通过这个命令的返回值,所有容器的ID,来docker stop,你需要用它$()。
命令替换允许替换命令的输出来代替命令名称本身。$(command)
现在停止所有docker容器的完整命令:
docker container stop $(docker container ls -a -q)
现在可以通过将此链接与本文前面介绍的完整prune命令相关联来实现完整的Docker系统清理。
docker container stop $(docker container ls -a -q) && docker system prune -a -f --volumes
同样,你现在知道如何组合docker命令,如果你愿意,只需删除一个方面。将所有ID的列表传递给关联的remove命令。
Containers docker container rm $(docker container ls -a -q)
Images docker image rm $(docker image ls -a -q)
Volumes docker volume rm $(docker volume ls -q)
Networks docker network rm $(docker network ls -q)
注意:有其他方法可以执行此操作,例如*docker ps*列出正在运行的容器以及*docker rm*删除容器。我已经这样写了,因为我觉得在docker对象中使用一致的命令名和语法更难忘。
V. 如何使用shell别名轻松地重用它们
每次你可以将它们设置为shell的别名,而不是输入这些。你可以随意调用命令,这里我称之为docker-clean。
alias docker-clean-unused='docker system prune --all --force --volumes'
alias docker-clean-all='docker stop $(docker container ls -a -q) && docker system prune -a -f --volumes'
要在运行shell时将它们设置为加载,请将它们添加到shell的rc文件中。
echo [ALIASES ...] \
>>〜/ .bashrc
然后使用新别名重新加载文件。
source~ / .bashrc
bash的完整命令:
echo "alias docker-clean-unused='docker system prune --all --force --volumes'
alias docker-clean-all='docker container stop $(docker container ls -a -q) && docker system prune -a -f --volumes'" \
>> ~/.bashrc && source ~/.bashrc
Zsh的完整命令:
echo "alias docker-clean-unused='docker system prune --all --force --volumes'
alias docker-clean-all='docker container stop $(docker container ls -a -q) && docker system prune -a -f --volumes'" \
>> ~/.zshrc && source ~/.zshrc
现在在终端中尝试别名命令
[root@linuxea.com ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7087fe30f52d rabbitmq:3.7.3-management "docker-entrypoint..." 4 minutes ago Up 4 minutes 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp docker_rabbit_1
[root@linuxea.com ~]$ docker-clean-all
7087fe30f52d
Deleted Containers:
7087fe30f52dbf84568f3429c52c8b24e335ff5f024a4d3f394f2eef7f0976c6
Deleted Networks:
docker_default
Deleted Volumes:
8c295273aca8a97bfe993fddbb9c0d4f66f7e81c8d8c625adbd0893d4b4a2847
Deleted Images:
untagged: rabbitmq:3.7.3-management
untagged: rabbitmq@sha256:0f681f18d80b2979596e8b262d06cacf7948e924d7f3a67e89be5fdea82cd116
deleted: sha256:2f415b0e9a6e74486edbc01ed99713225f6e65d31256819120319137c280c840
deleted: sha256:bcbbeee6343a0f57576e7c3f67dfa992c11d0e24d916e998dec5eb17c3e180f6
...
Total reclaimed space: 155.1MB
VI. 更多
使用这些命令可以快速轻松地管理docker系统。现在你知道如何列出和删除docker中的内容,为什么不创建其他别名,例如仅用于清理容器:
alias docker-clean-containers='docker container stop $(docker container ls -a -q) && docker container rm $(docker container ls -a -q)'
VII. 学习更多
学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助您更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。
除非另有说明,否则本站上的内容根据以下许可进行许可: CC署名-非商业性使用-相同方式共享4.0国际许可协议4.0进行许可
本文作者:www.linuxea.com for Mark
文章链接:http://www.linuxea.com/2246.html (转载请注明本文出处和本章链接)