文章來源:http://dockone.io/article/3056
1. Docker System命令
docker system df命令,類似於Linux上的df命令,用於查看Docker的磁盤使用情況:
可知,Docker鏡像占用了543MB磁盤,Docker容器占用了581.2MB磁盤,Docker數據卷占用了0B磁盤
docker system prune命令可以用於清理磁盤,刪除關閉的容器、無用的數據卷和網絡,以及dangling鏡像(即無tag的鏡像)。docker system prune -a命令清理得更加徹底,可以將沒有容器使用Docker鏡像都刪掉。注意,這兩個命令會把你暫時關閉的容器,以及暫時沒有用到的Docker鏡像都刪掉了……所以使用之前一定要想清楚吶。
執行docker system prune -a命令之后,Docker占用的磁盤空間減少了很多:
2. 手動清理Docker鏡像/容器/數據卷
對於舊版的Docker(版本1.13之前),是沒有Docker System命令的,因此需要進行手動清理。這里給出幾個常用的命令:
刪除所有dangling鏡像(即無tag的鏡像):docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
刪除所有dangling鏡像(即無tag的鏡像):docker rmi $(docker images | grep "^<none>" | 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/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7
由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"
因此,Nginx容器竟然占用了92GB的磁盤。進一步分析可知,真正占用磁盤空間的是Nginx的日志文件。那么這就不難理解了。我們Fundebug每天的數據請求為百萬級別,那么日志數據自然非常大。
使用truncate命令,可以將Nginx容器的日志文件“清零”:
truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f1
當然,這個命令只是臨時有作用,日志文件遲早又會漲回來。要從根本上解決問題,需要限制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無法清理一些無用目錄:
it's quite likely that for some reason when those container shutdown, docker couldn't remove the directory because the shm device was busy. This tends to happen often on 3.13 kernel. You may want to update it to the 4.4 version supported on trusty 14.04.5 LTS.
The reason it disappeared after a restart, is that daemon probably tried and succeeded to clean up left over data from stopped containers.
我查看了一下內核版本,發現真的是3.13:
uname -r 3.13.0-86-generic
如果你的內核版本也是3.13,而且清理磁盤沒能成功,不妨重啟一下Docker。當然,這個晚上操作比較靠譜。