1. 程式人生 > >【Docker】 積累

【Docker】 積累

systemctl div 個數 per 清理 事情 load systemd total

■  磁盤空間和docker資源之間的關系

  通過docker info | grep Space可以看到Docker占據的磁盤空間的信息。其中Data Space Used表示實際上docker資源占用掉的磁盤空間。相對應的Metadata Space Used是表示了所謂的metadata占據空間的大小。

  data和metadata默認情況下是放在/var/lib/docker/devicemapper/devicemapper中。由於一般/var屬於系統盤,而系統盤的大小是比較小的,所以docker很容易占滿整個系統盤的空間。所以最好在啟動docker的時候指定一個數據盤上的另一個目錄作為docker運行時的根目錄。通過dockerd的-g或者--graph參數指定。

  另一方面,我們還可以在docker應用的這個層面限制一下docker資源最多可占用的空間的大小。這個數據體現在docker info中的Data Space Total,這個數字是docker啟動時配置項可配置的,不是真的磁盤中的總空間。也就是說這個數字有可能是大於docker運行時目錄所在磁盤的總空間的,它從docker應用層限制了docker發展的大小。

  這個數字的設置方法是dockerd --storage-opt dm.loopdatasize=500G --storage-opt dm.loopmetadatasize=20G --storage-opt dm.basesize=8G,三個參數限制的分別是docker資源總大小,metadata總大小,單個鏡像的最大大小。在啟動時配合docker運行時根目錄所在磁盤的實際空間,設置一個合適的大小,可以避免docker把磁盤擠滿這種事情的發生。

  如果使用systemctl的方式來啟動docker的話可以修改/lib/systemd/system/docker.service文件,這個文件是通過systemctl啟動dockerd時的各個參數,修改其中的ExecStart加上前面說的幾個參數即可。

  ● 擴容

  如果在docker運行過程中發現了大小不夠要擴容了,遵循上面的原理,大概可以這麽操作。1. 備份所有鏡像和容器,因為到時候會刪掉原有data文件並創建新的。2.關停docker服務,像上面說的那樣進行啟動參數的更改。 3. 刪除原有的數據文件,並利用dd命令生成一個指定大小的數據文件,參考【http://blog.csdn.net/TinyJian/article/details/78436739】:

sudo rm -rf /var/lib/docker
sudo mkdir -p /var/lib/docker/devicemapper/devicemapper/
sudo dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1M count=0 seek=8192
sudo dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=1M count=0 seek=4096

  然後重啟docker服務即可:

sudo systemctl daemon-reload
sudo systemctl start docker

  對於空間不夠等情況,除了要擴容,更重要的應該是及時清理不要用的容器和鏡像。對於鏡像,在Linux上可以簡單的認為是一個文件,刪掉就會減少占用空間,新增就會增加占用空間。在其他一些系統如OSX上則可能會出現刪掉了鏡像但是空間沒有空出來這種事。 * 其實在Linux上也不盡然,生成的鏡像即使立刻刪除,從dockerinfo的結果來看,似乎也總是會留一點東西在系統中。隨著鏡像的不斷增多,系統的空間肯定是會一點一點變小的。

  對於容器,當一個容器被生成,容器中的內容自然是作為docker數據的一部分被寫入磁盤的。容器在生命周期中,在磁盤中空間占用情況是只增不減的。也就是說當我在容器中建了一個1G的文件,磁盤自然多了1G占用,如果再建一個0.5G的文件,磁盤占用就到了1.5G。此時再把第二個文件刪掉,雖然容器中看起來占據空間減少了,但是外面的磁盤中依然維持1.5G占用。除非把這個容器刪除。

  

【Docker】 積累