限制Docker容器的磁盘大小和带宽

我有一台运行Ubuntu 14.04的物理主机。 它具有100G的磁盘和100M的networking带宽。 我安装了Docker并启动了10个容器。 我想限制每个容器最多10G的磁盘和10M的networking带宽。

在通过官方文档并在互联网上search之后,我仍然无法find一种方法来为容器分配指定大小的磁盘和networking带宽。

我认为这可能不会直接在Docker中,也许我们需要绕过Docker。 这是否意味着我们应该使用“基础”的东西,比如LXC或者Cgroup? 任何人都可以给一些build议?


编辑:

@Mbarthelemy,你的build议似乎工作,但我仍然有一些关于磁盘的问题:

1)是否可以为每个容器分配其他大小(如20G,30G等)? 你说它在Docker中是硬编码的,所以看起来不可能。

2)我使用下面的命令启动Docker守护进程和容器:

docker -d -s devicemapper docker run -i -t training/webapp /bin/bash 

那么我使用df -h来查看磁盘使用情况,它会给出以下输出:

 Filesystem Size Used Avail Use% Mounted on /dev/mapper/docker-longid 9.8G 276M 9.0G 3% / /dev/mapper/Chris--vg-root 27G 5.5G 20G 22% /etc/hosts 

从上面我想一个容器可以使用的最大磁盘仍然大于10G,你觉得呢?

我不认为现在可以使用Docker默认设置。 这是我会尝试的。

  • 关于磁盘使用情况:您可以告诉Docker使用DeviceMapper存储后端而不是AuFS。 这样每个容器将运行在一个块设备(Devicemapper dm-thin target)上,限制为10GB(这是一个Docker的默认设置,幸运的是它符合你的要求!)。

    根据这个链接 ,看起来最新版本的Docker现在接受高级存储后端选项。 使用devicemapper后端, 现在可以使用--storage-opt dm.basesize=20G (将应用于任何新创build的容器)更改默认容器rootfs大小选项

    要更改存储后端:使用--storage-driver=devicemapper Docker选项。 请注意,在更改之后,以前的容器不会再被Docker看到。

  • 关于networking带宽:您可以告诉Docker使用LXC:使用-e lxc选项。

    然后,用一个自定义的LXC指令创build你的容器,把它们放到一个stream量类中

    docker run --lxc-conf="lxc.cgroup.net_cls.classid = 0x00100001" your/image /bin/stuff

    查看有关如何将带宽限制应用于此课程的官方文档 。 我从来没有尝试过这个(我的设置使用自定义的OpenVswitch网桥和VLAN进行networking连接,所以带宽限制是不同的,而且更容易一些),但是我认为你必须创build和configuration一个不同的类。

注意:– --storage-driver=devicemapper-e lxc选项适用于Docker 守护程序 ,不适用于运行docker run .......时使用的Docker客户端docker run .......

新版本的版本有–device-read-bps和–device-write-bps。

你可以使用docker run –device-read-bps = / dev / sda:10mb

更多信息: https : //blog.docker.com/2016/02/docker-1-10/

如果你有权访问容器,你可以使用tc来控制它们的带宽。

例如:在你的入口点脚本你可以添加: tc qdisc add dev eth0 root tbf rate 240kbit burst 300kbit latency 50ms

具有240kbps的带宽,突发300kbps和50ms的延迟。 如果没有以root身份运行容器,则还需要将–cap-add = NET_ADMIN传递给docker docker run命令。

1)是否可以为每个容器分配其他大小(如20G,30G等)? 你说它在Docker中是硬编码的,所以看起来不可能。

要回答这个问题,请参阅使用Device Mapper插件调整Docker容器的大小