在Docker的日常使用中,我们或许偶尔遇到下面这些情况:
$ docker-compose ps [27142] INTERNAL ERROR: cannot create temporary directory! $ df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 489M 132K 488M 1% /dev tmpfs 497M 0 497M 0% /dev/shm /dev/xvda1 7.8G 7.7G 0 100% /
这时候,我们大概明白了,大概是Docker把磁盘占满了。这时就需要我们去做一些清理了,这篇博客主要总结如下一些有效的Docker清理操作。
- 找到dockers数据与进程;
- 删除未使用的镜像,容器,卷和网络;
- 重置docker
- 限制日志大小
- 其他相关操作
在了解这些之前,我相信你已经对下面的一些词汇已经有一定的了解。
- image: 一个只读模版,可以用来创建container。如,一个包含ubuntu系统的镜像。
- container: 从镜像创建的运行实例。可以用docker命令去控制这些container。
- volume: docker数据持久化。
- dangling: 未使用的image。
- network: 连接docker容器服务。
查看Docker的磁盘使用情况
使用docker system df
即可查看:
$ docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 13 7 6.4 GB 7.2 MB (88%) Containers 8 0 42.85 MB 42.85 MB (100%) Local Volumes 5 5 3.541 GB 0 B (0%)
如上,镜像占了6.4GB
, 容器占了42.85 MB
, 数据卷占了3.541 GB
。 了解基本占用后,我们就可以用下面介绍的命令进行针对性的清理了。
找到Dockers数据与进程
要清理docker,就要知道docker数据在哪,具体有哪些docker进程。
docker images
列出docker镜像;docker ps
列出docker容器;docker volume ls
列出docker数据卷;docker network ls
列出docker网络;docker info
列出容器镜像的数量以及一些docker 安装等系统信息。
清除未使用的数据与进程
docker提供了一些快捷的命令去清除未使用的容器,网络和镜像:
$ docker system prune WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all dangling images - all dangling build cache Are you sure you want to continue? [y/N]
默认是没有清除数据卷的功能,由于数据比较重要,防止意外删除一些数据。可以通过
--volumes
指定。
同时,我们还可以将—all
清除未使用的images。使用--force
免确认。
$ docker system prune --all --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 Are you sure you want to continue? [y/N]
当然,我们也可以单独清除。
docker container prune
清除停止的容器;docker volume prune
清除未使用的数据卷;docker image prune
清除未使用的镜像;
清除所有数据重置docker
上面的命令不会影响运行中的容器以及关联的镜像,数据卷和网络。如果你需要全部清理就需要将所有容器都停止下来。
使用docker container stop [CONTAINERS...]
能停止正在运行的容器。同时我们可以通过下面命令获取正在运行的容器ID。
$ docker container ls -aq
ls
列出所有容器;--all / -a
列出所有容器(包含未运行的);--quiet / -q
只显示容器ID;
于是我们可以使用下面命令停止所有容器:
$ docker container stop $(docker container ls -a -q)
结合清除的命令,完整的清除所有的容器命令如下:
$ docker container stop $(docker container ls -a -q) && docker system prune -a -f --volumes
同理,我们可以想到:
- 清除容器
docker container rm $(docker container ls -a -q)
/docker rm $(docker ps -a -q)
; - 清除镜像
docker image rm $(docker images ls -a -q)
; - 清除数据卷
docker volume rm $(docker volume ls -q)
; - 清除网络
docker network rm $(docker network ls -q)
;
限制容器日志大小
很多时候,我们发现我们都是被日志文件撑爆的,解决问题的源头就是限制容器日志大小,方法有三:
- 修改
daemon.json
配置;
{ "log-opts": { "max-size" : "521m" } }
- 修改
docker-compose
;
ubuntu: image: ubuntu restart: always logging: driver: "json-file" options: max-size: "1g"
- 通过参数;
$ docker run -d --log-opt max-size=1g ubuntu
其他常见的有关清理命令
- 清除指定日志文件;
如果你要删除指定容器的日志,只有几步即可。
# 获取指定的容器ID, 可通过docker ps 查看 如:2ed640d8fcd1 # 获取该容器的日志地址 $ docker inspect 2ed640d8fcd1 --format '{{.LogPath}}' /mnt/data/docker/containers/2ed640d8fcd1bd464a23be78513d23be1807c8ad6a95116da5cb9118a6b2380a/2ed640d8fcd1bd464a23be78513d23be1807c8ad6a95116da5cb9118a6b2380a-json.log
- 知道了日志地址,你就可以删除或清空该日志了,不过注意权限哦~
- 杀死所有正在运行的容器;
$ docker kill $(docker ps -a -q)
- 删除所有已经停止的容器;
$ docker rm $(docker ps -a -q)
- 删除未打标签的镜像;
$ docker rmi $(docker images -q -f dangling=true)
- 批量删除指定镜像/容器等;
我们可以通过--format
指出docker命令的输出形式,通过grep
去筛选,然后删除。 如:
# 删除带有指定 hub.docker.com 仓库的镜像 $ docker rmi $(docker images --format '{{.Repository}}' | grep 'hub.docker.com') # 杀掉带有ubuntu 镜像名字的容器 $ docker kill $(docker ps -a --format '{{.Images}}' | grep 'ubuntu')