各位同窗,你们在使用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