Docker的所有鏡像、緩存資源都會存儲在devicemapper這個目錄下,所以會導致這個目錄佔用磁盤極大,甚至會耗盡所有的服務器硬盤。如下圖所示:
- 問題主要在於原先分配的空間過大導致的,使用“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!!!這一步很關鍵,否則下面的設置會失敗。
- 編輯以下文件:
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。
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