大家在使用Docker的過程中,有沒有想過,Docker在本地存儲鏡像時把文件存儲在哪里了呢?有沒有對文件的總大小做一定的限制呢?能不能調整本地存儲的位置及總限制大小呢?今天,我們就從這些問題入手,來討論一下Docker的存儲優化方案。
一、Docker的默認存儲策略
Docker提供了查看配置信息的命令,即docker info命令,通過該命令可以查看Docker的各種系統層面的信息,如當前運行的容器數、鏡像數、Docker版本等信息,其中就包括了存儲信息。
我們輸入docker info命令后,可得到類似如下的內容:
Storage Driver: devicemapper
Pool Name: docker-253:2-923803-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 GB
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 12.9 GB
Data Space Total: 107.4 GB
Data Space Available: 19.75 GB
Metadata Space Used: 21.77 MB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.126 GB
Thin Pool Minimum Free Space: 10.74 GB
Udev Sync Supported: true
Deferred Removal Enabled: false
Deferred Deletion Enabled: false
Deferred Deleted Device Count: 0
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
WARNING: Usage of loopback devices is strongly discouraged for production use. Use `--storage-opt
dm.thinpooldev` to specify a custom block storage device.
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.140-RHEL7 (2017-05-03)
其中,Data Space Total 即默認的最大儲存空間,約為100G;Data loop file即默認的鏡像存儲路徑,可以看到默認設置在/var/lib/docker路徑下。
值得一提的是,存儲目錄下的devicemapper/devicemapper/data文件是docker創建的稀疏文件,該文件在創建時即指定了大小,未真正使用的部分被系統由0填充,並且在磁盤統計時不計入使用磁盤大小。同時,該文件的大小即為Docker的最大儲存空間。
-rw------- 1 root root 100G Nov 8 10:11 data
根據實際情況,有時需要擴大或者縮小Docker的最大儲存空間,下面介紹一下具體的方法,並測試Docker的最大儲存空間過小,對於Docker的影響,以及相關的建議。
二、修改存儲位置及儲存空間
一般情況下,Docker的配置文件的位置為:
/etc/systemd/system/docker.service.d/docker.conf
若無此文件可手動創建。此文件的內容可參照如下配置填寫:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --storage-driver=devicemapper --insecure-registry 0.0.0.0/0 --registry-mirror http://dockerhub.yonyou.com -g /data/docker/
其中,利用-g參數即可指定存儲掛載路徑。比如,示例中的配置將存儲目錄掛載在/data/docker/路徑下。
若想修改Docker的最大儲存空間,也需要通過修改此配置文件實現。
擴大存儲空間
擴大Docker的最大儲存空間,直接修改配置文件即可。假設需要將Docker的最大儲存空間擴大到200G,則具體的方法為:
1、停止docker服務
停止docker服務的命令如下。
systemctl stop docker
2、修改配置文件
在Docker的配置文件最后一行的末尾添加——storage-opt dm.loopdatasize=200G,添加完之后的配置為:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --storage-driver=devicemapper --insecure-registry 0.0.0.0/0 --registry-mirror http://dockerhub.yonyou.com -g /data/docker/ --storage-opt dm.loopdatasize=200G
3、重啟docker服務
重啟docker的命令如下。
systemctl daemon-reload && systemctl start docker
重啟之后,查看Docker的最大儲存空間:
…
Data Space Used: 1.09 GB
Data Space Total: 214.7 GB
Data Space Available: 22.36 GB
Metadata Space Used: 1.753 MB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.146 GB
…
Data loop file:/data/docker/devicemapper/devicemapper/data
可以看到,最大存儲空間的配置已經生效,當前約為200G.
我們在配置中同時配置了掛載目錄,可以看到,當前docker的存儲文件也改變至/data/docker目錄下。
縮小存儲空間
我們首先想要提醒您的是,縮小Docker存儲空間需要清空Docker的工作目錄才能生效,清空Docker的工作目錄會導致所有數據丟失。一定要確認本地所有鏡像均已備份或可丟棄后,才可進行縮小存儲空間操作。
假設要將Docker的最大儲存空間縮小為50G,具體的方法為:
1、停止docker服務
同樣的,先使用命令停止docker服務。
systemctl stop docker
2、修改配置文件
在Docker的配置文件最后一行的末尾添加——storage-opt dm.loopdatasize=50G,添加完之后的配置為:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --storage-driver=devicemapper --insecure-registry 0.0.0.0/0 --registry-mirror http://dockerhub.yonyou.com -g /data/docker/ --storage-opt dm.loopdatasize=50G
3、刪除Docker的工作目錄
請再次注意,清空Docker的工作目錄會導致所有數據丟失,包括在本地保存的所有Docker鏡像。
rm -rf /data/docker
4、重啟docker服務
systemctl daemon-reload && systemctl start docker
重啟之后,查看Docker的最大儲存空間:
Data Space Used: 11.8 MB
Data Space Total: 53.69 GB
Data Space Available: 23.44 GB
可以看到,docker的存儲空間已縮小至50G左右。
那么我們可以思考一下,如果Docker的儲存空間過小,會對我們使用Docker產生什么樣的影響呢?
儲存空間過小的影響
為了測試Docker的最大儲存空間過小對Docker的影響,將Docker的最大儲存空間設置為2G。
下載四個鏡像,分別為:
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 053cde6e8953 4 days ago 3.96 MB
apps latest 67ea7f76e6db 5 days ago 687 MB
jenkins latest ec714cdad606 3 months ago 975 MB
dclb latest 483ca54282f0 4 months ago 44 MB
使用docker info查看Docker存儲空間的使用情況:
Data Space Used: 1.935 GB
Data Space Total: 2.147 GB
Data Space Available:212.3 MB
在Data Space Available項中,可以看到僅剩余200M左右存儲空間。
若此時下載其他鏡像,則可能會報如下錯誤:
failed to register layer: devmapper: Thin Pool has 3190 free data blocks which is less than minimum required 3276 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior
如果創建一個容器,如alpine,則也可能會報如下錯誤:
docker: Error response from daemon: devmapper: Thin Pool has 3239 free data blocks which is less than minimum required 3276 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior.
通過測試,可知在刪除一個鏡像並釋放空間之后,可以重新拉取小於此鏡像大小的鏡像,或者也可以成功創建alpine容器。
三、優化Docker的存儲策略
在日常使用Docker服務時,我們給出以下兩點建議:
1)、每天定時清理不用的Docker文件;
2)、將Docker的工作目錄設置在數據掛載磁盤文件夾里面,且設置磁盤大於100G.
優化建議一:定時清理Docker文件
使用docker-gc可以清理Docker文件,docker-gc的清理規則是:
·Containers that exited more than an hour ago are removed(刪除已經退出一小時的容器)
·Images that don't belong to any remaining container after that are removed(刪除不屬於任何容器的鏡像)
運行如下命令,每天定時使用docker-gc清理Docker文件:
sudo echo '0 2 * * * docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc:ro -e FORCE_IMAGE_REMOVAL=1 spotify/docker-gc' >> /var/spool/cron/root
其中:FORCE_IMAGE_REMOVAL=1代表清理重復的鏡像。
優化建議二:遷移Docker工作目錄
在Docker的工作目錄里面,會有很多大文件,如果將Docker的工作目錄存放在根目錄的話,會導致根目錄很快被占滿,因此需要將Docker的工作目錄遷移到掛載的數據磁盤。
假設要將Docker的工作目錄從/var/lib/docker遷移到/data/docker目錄下,遷移的方法為:
1、暫停Docker服務
systemctl stop docker
2、遷移工作目錄的數據
創建docker工作目錄,如果/data/docker已經存在,則可以跳過此步驟,直接復制文件:
mkdir /data/docker
遷移數據:
cp -rf /var/lib/docker/* /data/docker/
3.修改Docker的工作目錄
Docker的啟動配置文件位置在:
/etc/systemd/system/docker.service.d/docker.conf
無此文件可手動創建。打開此文件,在其后面增加-g /data/docker,如果已經有-g選項,則直接修改后面的目錄即可。修改后的結果如下:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --storage-driver=devicemapper --insecure-registry 0.0.0.0/0 --registry-mirror http://dockerhub.yonyou.com –g /data/docker/
4、啟動Docker服務
systemctl daemon-reload && systemctl start docker
5、刪除源文件
rm -rf /var/lib/docker/*
以上就是Docker儲存的優化方案,希望對您能夠有所幫助,更好的使用Docker容器技術。
