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

限制Docker容器的磁盘大小和带宽,docker,Docker,我有一台运行Ubuntu 14.04的物理主机。它拥有100G磁盘和100M网络带宽。我安装了Docker并启动了10个容器。我想将每个容器的最大容量限制为10G磁盘和10M网络带宽 在浏览了官方文件并在互联网上搜索之后,我仍然找不到一种方法来为一个容器分配指定大小的磁盘和网络带宽 我认为这可能不可能直接在Docker中实现,也许我们需要绕过Docker。这是否意味着我们应该使用一些“底层”的东西,比如LXC或Cgroup?有人能给点建议吗 编辑: @mbarthelmy,您的建议似乎有效,但

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

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

我认为这可能不可能直接在Docker中实现,也许我们需要绕过Docker。这是否意味着我们应该使用一些“底层”的东西,比如LXC或Cgroup?有人能给点建议吗


编辑:

@mbarthelmy,您的建议似乎有效,但我对磁盘仍有一些问题:

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。这样,每个容器将在限制为10GB的块设备(Devicemapper dm thin target)上运行(这是Docker的默认值,幸运的是它符合您的要求!)

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

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

  • 关于网络带宽:您可以告诉Docker在机罩下使用LXC:使用
    -eLXC
    选项

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

    docker run--lxc conf=“lxc.cgroup.net_cls.classid=0x00100001”您的/image/bin/stuff

    检查有关如何对此类应用带宽限制的信息。 我自己从来没有尝试过(我的设置使用自定义OpenVswitch网桥和VLAN进行网络连接,因此带宽限制不同,而且更容易),但我认为您必须创建和配置不同的类

注意:
--storage driver=deviceapper
-e lxc
选项适用于Docker守护进程,而不适用于运行
Docker run时使用的Docker客户端……

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


要回答此问题,请参阅新发布的版本有
--设备读取bps
--设备写入bps

您可以使用:

docker run --device-read-bps=/dev/sda:10mb
更多信息请点击此处:


如果您有权访问这些容器,您可以使用tc控制其中的带宽

例如:在入口点脚本中,您可以添加:
tc qdisc add dev eth0 root tbf速率240kbit突发300kbit延迟50ms

带宽为240kbps,突发带宽为300kbps,延迟为50ms


如果您不是以root用户身份运行容器,您还需要将
--cap add=NET_ADMIN
传递给
docker run
命令。

mbarthelmy,我补充一下我关于磁盘的问题,您能帮我查看一下吗?您的root FS卷是第一个(
| 9.8G | 276M | 9.0G | 3%|/
)。正如预期的那样,大小为10GB。另一行是bind-mount。您的建议是限制磁盘大小的好方法。但我认为还有另一种方法来实现这一点。我决定将另一个用户添加到容器中的指定组中,然后在Linux中使用“配额”限制该组的磁盘大小。关于带宽,这对我来说太复杂了,我仍在尝试,也许以后会问你一些问题。@mbarthelmy你能给我一些关于如何让OpenVswitch网桥和VLAN与Docker一起工作的细节吗?我对Docker与SDN的合作非常感兴趣。非常感谢!正式文件已更改为
https://www.kernel.org/doc/Documentation/cgroup-v1/net_cls.txt
应注意,这仅适用于块设备。接口流量尚未添加。仍然开放