菜鸟笔记
提升您的技术认知

docker 清理占用的磁盘空间-ag真人游戏

1. docker system命令

docker system df命令,类似于linux上的df命令,用于查看docker的磁盘使用情况:

docker system df
type total active size reclaimable
images 147 36 7.204gb 3.887gb (53%)
containers 37 10 104.8mb 102.6mb (97%)
local volumes 3 3 1.421gb 0b (0%)
build cache 0b 0b

可知,docker镜像占用了7.2gb磁盘,docker容器占用了104.8mb磁盘,docker数据卷占用了1.4gb磁盘。

docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。docker system prune -a命令清理得更加彻底,可以将没有容器使用docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的docker镜像都删掉了…所以使用之前一定要想清楚吶。

执行docker system prune -a命令之后,docker占用的磁盘空间减少了很多:

docker system df
type total active size reclaimable
images 10 10 2.271gb 630.7mb (27%)
containers 10 10 2.211mb 0b (0%)
local volumes 3 3 1.421gb 0b (0%)
build cache 0b 0b

2. 手动清理docker镜像/容器/数据卷

对于旧版的docker(版本1.13之前),是没有docker system命令的,因此需要进行手动清理。这里给出几个常用的命
删除所有关闭的容器

docker ps -a | grep exit | cut -d ' ' -f 1 | xargs docker rm

删除所有dangling镜像(即无tag的镜像):

docker rmi $(docker images | grep "^" | awk "{print $3}")
docker rmi $(docker images | grep "^" | awk "{print $3}")
docker rmi $(docker images | grep "none" | awk '{print $3}')

sudo docker rmi -f $(sudo docker images -a | awk {'print $3'})

删除所有dangling数据卷(即无用的volume):

docker volume rm $(docker volume ls -qf dangling=true)

3. 限制容器的日志大小

有一次,当我使用1与2提到的方法清理磁盘之后,发现并没有什么作用,于是,我进行了一系列分析。

在ubuntu上,docker的所有相关文件,包括镜像、容器等都保存在/var/lib/docker/目录中:

du -hs /var/lib/docker/
97g /var/lib/docker/

docker竟然使用了将近100gb磁盘,这也是够了。使用du命令继续查看,可以定位到真正占用这么多磁盘的目录:

92g	/var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53

docker ps可知,nginx容器的id恰好为a376aa694b22,与上面的目录/var/lib/docker/containers/a376aa694b22的前缀一致:

docker ps
container id image command created status ports names
a376aa694b22 192.168.59.224:5000/nginx:1.12.1 "nginx -g 'daemon off" 9 weeks ago up 10 minutes nginx

因此,nginx容器竟然占用了92gb的磁盘。进一步分析可知,真正占用磁盘空间的是nginx的日志文件。那么这就不难理解了。

使用truncate命令,可以将nginx容器的日志文件“清零”:

truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log

当然,这个命令只是临时有作用,日志文件迟早又会涨回来。要从根本上解决问题,需要限制nginx容器的日志文件大小。这个可以通过配置日志的max-size来实现,下面是nginx容器的docker-compose配置文件:

nginx:
image: nginx:1.12.1
restart: always
logging:
driver: "json-file"
options:
max-size: "5g"

重启nginx容器之后,其日志文件的大小就被限制在5gb,再也不用担心了~

4. 重启docker

还有当我清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少。根据docker disk usage提到过的建议,我重启了docker,发现磁盘使用率从83%降到了19%。根据高手指点,这应该是与内核3.13相关的bug。

,

docker system df命令,类似于linux上的df命令,用于查看docker的磁盘使用情况:

docker system df
type total active size reclaimable
images 147 36 7.204gb 3.887gb (53%)
containers 37 10 104.8mb 102.6mb (97%)
local volumes 3 3 1.421gb 0b (0%)
build cache 0b 0b

可知,docker镜像占用了7.2gb磁盘,docker容器占用了104.8mb磁盘,docker数据卷占用了1.4gb磁盘。

docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。docker system prune -a命令清理得更加彻底,可以将没有容器使用docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的docker镜像都删掉了…所以使用之前一定要想清楚吶。

执行docker system prune -a命令之后,docker占用的磁盘空间减少了很多:

docker system df
type total active size reclaimable
images 10 10 2.271gb 630.7mb (27%)
containers 10 10 2.211mb 0b (0%)
local volumes 3 3 1.421gb 0b (0%)
build cache 0b 0b

2. 手动清理docker镜像/容器/数据卷

对于旧版的docker(版本1.13之前),是没有docker system命令的,因此需要进行手动清理。这里给出几个常用的命
删除所有关闭的容器

docker ps -a | grep exit | cut -d ' ' -f 1 | xargs docker rm

删除所有dangling镜像(即无tag的镜像):

docker rmi $(docker images | grep "^" | awk "{print $3}")
docker rmi $(docker images | grep "^" | awk "{print $3}")
docker rmi $(docker images | grep "none" | awk '{print $3}')

sudo docker rmi -f $(sudo docker images -a | awk {'print $3'})

删除所有dangling数据卷(即无用的volume):

docker volume rm $(docker volume ls -qf dangling=true)

3. 限制容器的日志大小

有一次,当我使用1与2提到的方法清理磁盘之后,发现并没有什么作用,于是,我进行了一系列分析。

在ubuntu上,docker的所有相关文件,包括镜像、容器等都保存在/var/lib/docker/目录中:

du -hs /var/lib/docker/
97g /var/lib/docker/

docker竟然使用了将近100gb磁盘,这也是够了。使用du命令继续查看,可以定位到真正占用这么多磁盘的目录:

92g	/var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53

docker ps可知,nginx容器的id恰好为a376aa694b22,与上面的目录/var/lib/docker/containers/a376aa694b22的前缀一致:

docker ps
container id image command created status ports names
a376aa694b22 192.168.59.224:5000/nginx:1.12.1 "nginx -g 'daemon off" 9 weeks ago up 10 minutes nginx

因此,nginx容器竟然占用了92gb的磁盘。进一步分析可知,真正占用磁盘空间的是nginx的日志文件。那么这就不难理解了。

使用truncate命令,可以将nginx容器的日志文件“清零”:

truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log

当然,这个命令只是临时有作用,日志文件迟早又会涨回来。要从根本上解决问题,需要限制nginx容器的日志文件大小。这个可以通过配置日志的max-size来实现,下面是nginx容器的docker-compose配置文件:

nginx:
image: nginx:1.12.1
restart: always
logging:
driver: "json-file"
options:
max-size: "5g"

重启nginx容器之后,其日志文件的大小就被限制在5gb,再也不用担心了~

4. 重启docker

还有当我清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少。根据docker disk usage提到过的建议,我重启了docker,发现磁盘使用率从83%降到了19%。根据高手指点,这应该是与内核3.13相关的bug。

网站地图