天天看點

(轉)[docker]清理Docker占用的磁盤空間

1. Docker System指令

docker system df指令,類似于Linux上的df指令,用于檢視Docker的磁盤使用情況:

(轉)[docker]清理Docker占用的磁盤空間

可知,Docker鏡像占用了543MB磁盤,Docker容器占用了581.2MB磁盤,Docker資料卷占用了0B磁盤

docker system prune指令可以用于清理磁盤,删除關閉的容器、無用的資料卷和網絡,以及dangling鏡像(即無tag的鏡像)。docker system prune -a指令清理得更加徹底,可以将沒有容器使用Docker鏡像都删掉。注意,這兩個指令會把你暫時關閉的容器,以及暫時沒有用到的Docker鏡像都删掉了……是以使用之前一定要想清楚吶。

執行docker system prune -a指令之後,Docker占用的磁盤空間減少了很多:

(轉)[docker]清理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:

繼續閱讀