设为首页 收藏本站
查看: 1026|回复: 0

[经验分享] 如何优化Docker储存

[复制链接]

尚未签到

发表于 2019-2-20 09:29:25 | 显示全部楼层 |阅读模式
  大家在使用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容器技术。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-674693-1-1.html 上篇帖子: docker 实践(三)容器管理 下篇帖子: Docker 安全检测Docker Bench
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表