Docker 存储池扩容

Docker 存储池扩容 如果在 CentOS 、 REHL 、 Fedor 或者其他默认没有 AUFS 支持的 Linux 发行版上使用 Docker ,你可能需要用到 Device Mapper 的存储插件。将这个插件设置为默认,它会把你所有的容器存储到一个 100G 的简短文件中,并且限制每个容器最大为 10GB 。这篇文章将展示如何突破这个限制,并且把容器的存储移动到一个指定的分区或者 LVM 卷中。
它的工作原理 要真正理解我们要做的事情,首先来了解 Device Mapper 插件的工作原理。
它是基于 Device Mapper 的―精简目标的特性。它实际上是目标块设备的快照,之所以被称为―精简是因为它允许精简配置。精简配置意味着你有一个(希望很大)可用存储块的池,接着你可以从那个池中创建任意大小的块设备(虚拟磁盘,如有需要);在你实际读写后,这些存储块将会被标记为已使用(或者从池中拿走)。 这意味着你是可以超额使用这个池,比如在一个 100GB 的池里面创建几千个 10GB 的卷,甚至可能是一个 100TB 的卷在一个 1GB 的池里面。只要你的实际读写的块的容量不大于池的大小,你怎么做都 OK 。 除此之外,精简目标的方式是可以做快照的。这表明无论何时,你都可以创建一个存在的卷的浅拷贝。在用户看来,就像你有两个一样的卷,它们可以独立地各自修改。即使你做了一个完整的拷贝,除了在时间上它是瞬间发生的(即使是很大的卷),它们不会两次重复使用存储。额外的存储只有当其中任何一卷有变化的时候才会发生,然后精简目标会从池里面分配一个存储快。 从本质上来看,―精简目标‖实际上使用了两个存储设备:一个(大)的是存储块池自己,还有一个小的存储了一些元数据。这些元数据中包括了卷、快照、以及每个卷的块或者快照同存储池中块的映射信息。 当 Docker 使用 Device Mapper 存储插件的时候,它会在 /var/lib/docker/devicemapper/devicemapper/data 和/var/lib/docker/devicemapper/devicemapper/metadata 下创建两个文件(如果它们不存在)来存储对应的存储池和相关的元数据。这非常方便,你不需要做任何安装部署的工作(你不需要额外的分区来存储 Docker 容器,或者建立 LVM 或其他类似的东西)。然而它也有两个缺点: - 存储池会有一个默认 100GB 的容量 - 它将会被稀疏文件所支持。从磁盘的使用效率的观点来看,这还不错的(就像在精简池中的卷,它一开始是小的,只有当实际需要写的时候才会使用磁盘的存储块)。但是从性能的角度来看就不那么好了,因为 VFS 增加了一些额外的负担,特别是"第一次写的时候"。 在了解如何调整容器的大小之前,我们来试试看如何给池增加更多空间。
我们需要一个更大的池 警告 : 下面的操作会删除你所有的容器和镜像,确保你已经把之前的数据做了备份! 记住上面说过的,当数据和元类信息文件不存在的时候 Docker 会创建它们,所以解决方案非常简单:在启动它们之前,在 Docker 里创建这些文件!
? 停止 Docker 守护进程,因为我们将要重新设置我们的存储插件,如果我们在运行的时候移除文件,那么糟糕的事情就将发生。

? 擦去 /var/lib/docker 。 警告:正如前面提到的,这个操作会把你所有的容器和镜像都删除掉。 
? 创建存储目录: mkdir -p /var/lib/docker/devicemapper/devicemapper 
? 创建你的池: dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=250 ,创建一个 250G 的稀疏文件。如果你指定 bs=1G count=250(不使用 seek 选项),那么它会创建一个普通文件(而不是一个稀疏文件)。
? 重启 Docker 守护进程。提示:在默认情况下,如果你有 AUFS 的支持, Docker 会使用它;所以如果你要强制使用 Device Mapper 的插件,需要在启动 Docker 的命令中增加 -s devicemapper 的选项。 
? 使用 docker info 来检查 Data Space Total 的值是否正确。
我们需要一个更快的池 警告 :下面的操作也会删除你所有的容器和镜像。确保把你重要的镜像保存在 registry 中,保存你容器里面的重要数据。 要获得一个更快速的池,最简单的办法就是使用一个真实的设备而不是一个基于文件的循环设备。过程几乎一样。假设你有一个完全空的硬盘,/dev/sdb ,你想把它完全用于容器的存储,你可以这样做:
? 停止 Docker 守护进程 ? 移除 /var/lib/docker (似曾相识,对么?) 
? 创建一个存储目录: mkdir -p /var/lib/docker/devicemapper/devicemapper 
? 在目录下创建一个数据软链接,指向设备: ln -s /dev/sdb
/var/lib/docker/devicemapper/devicemapper/data
? 重启 Docker 
? 使用 docker info 来检查 Data Space Total 的值是否正确

使用 RAID 和 LVM 如果你希望合并多块相似的磁盘,可以使用 RADID10 软件,这个会通过链接到 /dev/md 而实现。另外一个非常好的选择是把你的磁盘(或者RAID磁盘阵列)放到 LVM 的物理卷中,并且创建两个逻辑卷:一个是数据,一个是元数据。对于元数据池的最佳的大小我没有什么特别的建议,不过占数据池的 1% 看起来不错。 就像前面一样,停止 Docker ,移除它的数据目录,然后创建一个指向 /dev/mapper 设备的符号链接,然后重启 Docker 。

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

关注超人学院java免费学习交流群:

时间: 2024-10-09 18:02:43

Docker 存储池扩容的相关文章

docker停机扩容pool空间

我这里使用docker的容器做测试机给开发使用,使用都没问题,但随着项目增加,有的项目需要更大的硬盘,我通过(http://dl528888.blog.51cto.com/2382721/1606170)来动态扩展容器的空间,满足使用需求,但我当前设置的docker pool却不足了(默认pool是100g,每个容器给予10g空间),如果pool满了就无法新创建容器,并且无法删除数据来清理(我使用dd来测试),所以为了解决此问题,我准备: 1.备份当前容器与images: 2.停止docker服

docker硬盘扩容脚本

#!/bin/bash#This script is dynamic modify docker container disk if [ -z $1 ] || [ -z $2 ]; thenecho "Usage: container_name increase_capacity"echo "Example: I want increase 11G to test"echo "The command is: sh basename $0 test 11&q

docker最佳实践-----美团点评的分享

美团点评容器平台简介 本文介绍美团点评的Docker容器集群管理平台(以下简称"容器平台").该平台始于2015年,是基于美团云的基础架构和组件而开发的Docker容器集群管理平台.目前该平台为美团点评的外卖.酒店.到店.猫眼等十几个事业部提供容器计算服务,承载线上业务数百个,日均线上请求超过45亿次,业务类型涵盖Web.数据库.缓存.消息队列等. 为什么要开发容器管理平台 作为国内大型的O2O互联网公司,美团点评业务发展极为迅速,每天线上发生海量的搜索.推广和在线交易.在容器平台实施

FlashRAID技术白皮书

1 概述 FlashRAID是面向NVMe SSD设计的一套软件定义存储系统,在设计之初考虑了新型存储介质的特性以及存在的问题.在系统设计过程中,充分利用了新型介质的特性,并且通过技术革新解决了高性能存储介质的数据保护.性能聚合.资源管理.性能导出以及易于维护管理等方面的问题.FlashRAID在物理资源管理.逻辑资源管理.增强数据保护.性能聚合.数据导出以及存储管理平台方面进行了技术创新,相关技术申请了发明专利.本技术白皮书对这些创新技术进行一一说明. 2 物理资源管理技术 2.1 底层资源池

Docker容器学习梳理-容器硬盘热扩容

docker容器默认的空间是10G,如果想指定默认容器的大小,可以在docker配置文件里自定义,比如配置成--storage-opt dm.basesize=20G,即容器设置成20G:也可以在启动容器的时候指定:# docker -d --storage-opt dm.basesize=20G 在实际生产环境下,对docker容器进行热扩容(动态扩容)是非常重要的一个需求,但是上面的方法需要修改后需要重启docker,无法做到动态给运行容器指定大小. Docker容器动态扩展的优点: 1)不

在centos6.x和centos7.x环境下停机扩容docker的pool空间

一.首先介绍一下docker的存储驱动Device Mapper插件的工作原理 如果在CentOS .REHL .Fedor或者其他默认没有 AUFS支持的Linux发行版上使用Docker,你需要用到Device Mapper的存储插件.将这个插件设置为默认,它会把你所有的容器存储到一个100G的简短文件中,并且限制每个容器最大为10GB.最初Docker仅能在支持Aufs文件系统的Linux发行版上运行,但是由于Aufs未能加入Linux内核,为了寻求兼容性.扩展性,Docker在内部通过g

Docker虚拟化技术系列之-磁盘扩容

Docker在启动容器的时候,需要创建文件系统,为rootfs提供挂载点.最初Docker仅能在支持Aufs文件系统的Linux发行版上运行,但是由于Aufs未能加入Linux内核,为了寻求兼容性.扩展性,Docker在内部通过graphdriver机制这种可扩展的方式来实现对不同文件系统的支持. 目前,Docker支持Aufs,Devicemapper,Btrfs和Vfs四种文件系统,docker容器默认的空间是10G,如果想指定默认容器的大小(在启动容器的时候指定),可以有如下两种方法: 建

docker容器端口IP规划及端口动态扩容

docker容器一旦启动,参数就无法改变,生产环境中最常变的就是端口映射,为了解决这个问题,那么首先就要规划好,本文列出了两种端口规划方案,如果后续维护中出现了要增加端口映射的场景,本文也给出了动态端口映射扩容方案. 1.单IP多容器映射规划方案 此种环境适用只有单个IP环境下,如云主机等. 1.1 端口映射规划表格:     规划不同的端口段,映射到容器从而对外提供服务. 主机名称 ssh映射 mysql映射 nginx映射 redis映射 redis-test 51000 22 51001

Docker容器硬盘动态扩容

扩容容器 docker容器默认的空间是10G,如果想指定默认容器的大小(在启动容器的时候指定),可以在docker配置文件里通过dm.basesize参数指定,比如 1 docker -d --storage-opt dm.basesize=20G 是指定默认的大小为20G,具体参数可以参考https://github.com/docker/docker/tree/master/daemon/graphdriver/devmapper 上面方法只是真的生成容器的时候进行的,并且修改后需要重启do