如何优化Docker储存

60次阅读

共计 5359 个字符,预计需要花费 14 分钟才能阅读完成。

各位同学,大家在使用 Docker 的过程中,有没有想过,Docker 在本地存储镜像时把文件存储在哪里了呢?有没有对文件的总大小做一定的限制呢?能不能调整本地存储的位置及总限制大小呢?今天,我们就从这些问题入手,来讨论一下 Docker 的存储优化方案。一、Docker 的默认存储策略 Docker 提供了查看配置信息的命令,即 docker info 命令,通过该命令可以查看 Docker 的各种系统层面的信息,如当前运行的容器数、镜像数、Docker 版本等信息,其中就包括了存储信息。我们输入 docker info 命令后,可得到类似如下的内容:Storage Driver: devicemapperPool Name: docker-253:2-923803-poolPool Blocksize: 65.54 kBBase Device Size: 10.74 GBBacking Filesystem: xfsData file: /dev/loop0Metadata file: /dev/loop1Data Space Used: 12.9 GBData Space Total: 107.4 GBData Space Available: 19.75 GBMetadata Space Used: 21.77 MBMetadata Space Total: 2.147 GBMetadata Space Available: 2.126 GBThin Pool Minimum Free Space: 10.74 GBUdev Sync Supported: trueDeferred Removal Enabled: falseDeferred Deletion Enabled: falseDeferred Deleted Device Count: 0Data loop file: /var/lib/docker/devicemapper/devicemapper/dataWARNING: Usage of loopback devices is strongly discouraged for production use. Use `–storage-optdm.thinpooldev` to specify a custom block storage device.Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadataLibrary 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 docker2、修改配置文件在 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=200G3、重启 docker 服务重启 docker 的命令如下。systemctl daemon-reload && systemctl start docker 重启之后,查看 Docker 的最大储存空间:…Data Space Used: 1.09 GBData Space Total: 214.7 GBData Space Available: 22.36 GBMetadata Space Used: 1.753 MBMetadata Space Total: 2.147 GBMetadata 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 docker2、修改配置文件在 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=50G3、删除 Docker 的工作目录请再次注意,清空 Docker 的工作目录会导致所有数据丢失,包括在本地保存的所有 Docker 镜像。rm -rf /data/docker4、重启 docker 服务 systemctl daemon-reload && systemctl start docker 重启之后,查看 Docker 的最大储存空间:Data Space Used: 11.8 MBData Space Total: 53.69 GBData Space Available: 23.44 GB 可以看到,docker 的存储空间已缩小至 50G 左右。那么我们可以思考一下,如果 Docker 的储存空间过小,会对我们使用 Docker 产生什么样的影响呢?储存空间过小的影响为了测试 Docker 的最大储存空间过小对 Docker 的影响,将 Docker 的最大储存空间设置为 2G。下载四个镜像,分别为:REPOSITORY TAG IMAGE ID CREATED SIZEalpine latest 053cde6e8953 4 days ago 3.96 MBapps latest 67ea7f76e6db 5 days ago 687 MBjenkins latest ec714cdad606 3 months ago 975 MBdclb latest 483ca54282f0 4 months ago 44 MB 使用 docker info 查看 Docker 存储空间的使用情况:Data Space Used: 1.935 GBData Space Total: 2.147 GBData 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 docker2、迁移工作目录的数据创建 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 docker5、删除源文件 rm -rf /var/lib/docker/* 以上就是 Docker 储存的优化方案,希望对您能够有所帮助,更好的使用 Docker 容器技术。

正文完
 0