如何優化Docker儲存

各位同窗,你們在使用Docker的過程當中,有沒有想過,Docker在本地存儲鏡像時把文件存儲在哪裏了呢?有沒有對文件的總大小作必定的限制呢?能不能調整本地存儲的位置及總限制大小呢?今天,咱們就從這些問題入手,來討論一下Docker的存儲優化方案。
1、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的影響,以及相關的建議。
2、修改存儲位置及儲存空間
通常狀況下,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,則具體的方法爲:
一、中止docker服務
中止docker服務的命令以下。
systemctl stop docker
二、修改配置文件
在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
三、重啓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,具體的方法爲:
一、中止docker服務
一樣的,先使用命令中止docker服務。
systemctl stop docker
二、修改配置文件
在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
三、刪除Docker的工做目錄
請再次注意,清空Docker的工做目錄會致使全部數據丟失,包括在本地保存的全部Docker鏡像。
rm -rf /data/docker
四、重啓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容器。
3、優化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目錄下,遷移的方法爲:
一、暫停Docker服務
systemctl stop docker
二、遷移工做目錄的數據
建立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/
四、啓動Docker服務
systemctl daemon-reload && systemctl start docker
五、刪除源文件
rm -rf /var/lib/docker/*
以上就是Docker儲存的優化方案,但願對您可以有所幫助,更好的使用Docker容器技術。docker

相關文章
相關標籤/搜索