Docker DeviceMapper佔用空間太大解決方案

Docker的所有鏡像、緩存資源都會存儲在devicemapper這個目錄下,所以會導致這個目錄佔用磁盤極大,甚至會耗盡所有的服務器硬盤。如下圖所示:




解決方案1:失敗
  • 問題主要在於原先分配的空間過大導致的,使用“docker info”查看:

  • 首先備份需要的容器和鏡像,使用“docker save”或者“docker export”.
  • 然後暫停docker;
  • 刪除/var/lib/docker目錄;
  • 重建目錄,空間分配
mkdir -p /var/lib/docker/devicemapper/devicemapper

dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1M count=0 seek=8192



建立的文件最大爲  1M * 8192 = 8G
  • 重啓docker
。。。。設置失敗,無語了。


解決方案2:成功
  • 停止docker!!!這一步很關鍵,否則下面的設置會失敗。
  • 編輯以下文件:
vim /lib/systemd/system/docker.service

原內容如下:
ExecStart=/usr/bin/dockerd-current \
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --exec-opt native.cgroupdriver=systemd \
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY\
          $REGISTRIES


然後修改爲以下:
ExecStart=/usr/bin/dockerd-current \
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --exec-opt native.cgroupdriver=systemd \
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
          --storage-opt dm.loopdatasize=8G \
          --storage-opt dm.loopmetadatasize=4G \
          --storage-opt dm.basesize=8G \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY\
          $REGISTRIES


也就是多加以下3行:
          --storage-opt dm.loopdatasize=8G \
          --storage-opt dm.loopmetadatasize=4G \
          --storage-opt dm.basesize=8G \

設置devicemapper的data爲8G,metadata爲4G,鏡像的大小不能大於8G。

  • 刪除原有docker,並使用dd命令進行空間分配
rm -rf /var/lib/docker 
mkdir -p /var/lib/docker/devicemapper/devicemapper/ 
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1M count=0 seek=8192
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=1M count=0 seek=4096

  • 完成上述步驟後
systemctl daemon-reload 
systemctl start docker 
docker info



發佈了700 篇原創文章 · 獲贊 1462 · 訪問量 356萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章