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

时间:2014-06-24 16:21:50

标签: docker

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

在浏览完官方文档并在互联网上搜索之后,我仍然无法找到一种方法来为容器分配指定大小的磁盘和网络带宽。

我认为直接在Docker中可能无法实现,也许我们需要绕过Docker。这是否意味着我们应该使用"底层",例如LXC或Cgroup?谁能提出一些建议?


编辑:

@Mbarthelemy,您的建议似乎有效但我仍然有一些关于磁盘的问题:

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,你怎么看? ?

4 个答案:

答案 0 :(得分:24)

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

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

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

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

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

    然后,使用自定义LXC指令创建容器,将它们放入流量类

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

    检查official documentation有关如何对此课程应用带宽限制的问题。 我自己从未尝试过这种方法(我的设置使用自定义的OpenVswitch网桥和VLAN进行网络连接,因此带宽限制不同而且更容易一些),但我认为您必须创建和配置不同的类。

    < / LI>

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:3)

如果您可以访问容器,则可以使用tc进行带宽控制。

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

带宽为240kbps,突发300kbps和50毫秒延迟。 如果不以root用户身份运行容器,还需要将--cap-add = NET_ADMIN传递给docker run命令。

答案 3 :(得分:0)

  

1)是否可以为每个容器分配其他尺寸(例如20G,30G等)?你说它在Docker中是硬编码的,所以似乎不可能。

要回答此问题,请参阅Resizing Docker containers with the Device Mapper plugin