如何優化Docker儲存


大家在使用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容器技術。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM