本系列文章将介绍Docker的有关知识:

(1)Docker 安装及基本用法

(2)Docker 镜像

(3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境

(4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源

(5)Docker 网络

上一篇文章将到 Docker 容器使用 linux namespace 来隔离其运行环境,使得容器中的进程看起来就像爱一个独立环境中运行一样。但是,光有运行环境隔离还不够,因为这些进程还是可以不受限制地使用系统资源,比如网络、磁盘、CPU以及内存 等。关于其目的,一方面,是为了防止它占用了太多的资源而影响到其它进程;另一方面,在系统资源耗尽的时候,linux 内核会触发 OOM,这会让一些被杀掉的进程成了无辜的替死鬼。因此,为了让容器中的进程更加可控,Docker 使用 Linux cgroups 来限制容器中的进程允许使用的系统资源。

1. 基础知识:Linux control groups

1.1 概念

Linux Cgroup 可​​​让​​​您​​​为​​​系​​​统​​​中​​​所​​​运​​​行​​​任​​​务​​​(进​​​程​​​)的​​​用​​​户​​​定​​​义​​​组​​​群​​​分​​​配​​​资​​​源​​​ — 比​​​如​​​ CPU 时​​​间​​​、​​​系​​​统​​​内​​​存​​​、​​​网​​​络​​​带​​​宽​​​或​​​者​​​这​​​些​​​资​​​源​​​的​​​组​​​合​​​。​​​您​​​可​​​以​​​监​​​控​​​您​​​配​​​置​​​的​​​ cgroup,拒​​​绝​​​ cgroup 访​​​问​​​某​​​些​​​资​​​源​​​,甚​​​至​​​在​​​运​​​行​​​的​​​系​​​统​​​中​​​动​​​态​​​配​​​置​​​您​​​的​​​ cgroup。所以,可以将 controll groups 理解为 controller (system resource) (for) (process)groups,也就是是说它以一组进程为目标进行系统资源分配和控制。

它主要提供了如下功能:

  • Resource limitation: 限制资源使用,比如内存使用上限以及文件系统的缓存限制。
  • Prioritization: 优先级控制,比如:CPU利用和磁盘IO吞吐。
  • Accounting: 一些审计或一些统计,主要目的是为了计费。
  • Control: 挂起进程,恢复执行进程。

使​​​用​​​ cgroup,系​​​统​​​管​​​理​​​员​​​可​​​更​​​具​​​体​​​地​​​控​​​制​​​对​​​系​​​统​​​资​​​源​​​的​​​分​​​配​​​、​​​优​​​先​​​顺​​​序​​​、​​​拒​​​绝​​​、​​​管​​​理​​​和​​​监​​​控​​​。​​​可​​​更​​​好​​​地​​​根​​​据​​​任​​​务​​​和​​​用​​​户​​​分​​​配​​​硬​​​件​​​资​​​源​​​,提​​​高​​​总​​​体​​​效​​​率​​​。

在实践中,系统管理员一般会利用CGroup做下面这些事(有点像为某个虚拟机分配资源似的):

  • 隔离一个进程集合(比如:nginx的所有进程),并限制他们所消费的资源,比如绑定CPU的核。
  • 为这组进程分配其足够使用的内存
  • 为这组进程分配相应的网络带宽和磁盘存储限制
  • 限制访问某些设备(通过设置设备的白名单)

查看 linux 内核中是否启用了 cgroup:

  1. [root@node1 ]# uname -r
  2. 3.10.-514.2..el7.x86_64
  3. [root@node1 ]# cat /boot/config-3.10.-514.2..el7.x86_64 | grep CGROUP
  4. CONFIG_CGROUPS=y
  5. # CONFIG_CGROUP_DEBUG is not set
  6. CONFIG_CGROUP_FREEZER=y
  7. CONFIG_CGROUP_PIDS=y
  8. CONFIG_CGROUP_DEVICE=y
  9. CONFIG_CGROUP_CPUACCT=y
  10. CONFIG_CGROUP_HUGETLB=y
  11. CONFIG_CGROUP_PERF=y
  12. CONFIG_CGROUP_SCHED=y
  13. CONFIG_BLK_CGROUP=y
  14. # CONFIG_DEBUG_BLK_CGROUP is not set
  15. CONFIG_NETFILTER_XT_MATCH_CGROUP=m
  16. CONFIG_NET_CLS_CGROUP=y
  17. CONFIG_NETPRIO_CGROUP=y

对应的 cgroup 的配置值如果是 'y',则表示已经被启用了。

Linux 系统中,一切皆文件。Linux 也将 cgroups 实现成了文件系统,方便用户使用。在我的 Ubuntu 14.04 测试环境中:

  1. root@devstack:/home/sammy# mount -t cgroup
  2. cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,relatime,cpuset)
  3. cgroup on /sys/fs/cgroup/cpu type cgroup (rw,relatime,cpu)
  4. systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd)
  5. root@devstack:/home/sammy# lssubsys -m
  6. cpuset /sys/fs/cgroup/cpuset
  7. cpu /sys/fs/cgroup/cpu
  8. cpuacct /sys/fs/cgroup/cpuacct
  9. memory /sys/fs/cgroup/memory
  10. devices /sys/fs/cgroup/devices
  11. freezer /sys/fs/cgroup/freezer
  12. blkio /sys/fs/cgroup/blkio
  13. perf_event /sys/fs/cgroup/perf_event
  14. hugetlb /sys/fs/cgroup/hugetlb
  15. root@devstack:/home/sammy# ls /sys/fs/cgroup/ -l
  16. total
  17. drwxr-xr-x root root Sep : blkio
  18. drwxr-xr-x root root Sep : cpu
  19. drwxr-xr-x root root Sep : cpuacct
  20. drwxr-xr-x root root Sep : cpuset
  21. drwxr-xr-x root root Sep : devices
  22. drwxr-xr-x root root Sep : freezer
  23. drwxr-xr-x root root Sep : hugetlb
  24. drwxr-xr-x root root Sep : memory
  25. drwxr-xr-x root root Sep : perf_event
  26. drwxr-xr-x root root Sep : systemd

我们看到 /sys/fs/cgroup 目录中有若干个子目录,我们可以认为这些都是受 cgroups 控制的资源以及这些资源的信息。

  • blkio — 这​​​个​​​子​​​系​​​统​​​为​​​块​​​设​​​备​​​设​​​定​​​输​​​入​​​/输​​​出​​​限​​​制​​​,比​​​如​​​物​​​理​​​设​​​备​​​(磁​​​盘​​​,固​​​态​​​硬​​​盘​​​,USB 等​​​等​​​)。
  • cpu — 这​​​个​​​子​​​系​​​统​​​使​​​用​​​调​​​度​​​程​​​序​​​提​​​供​​​对​​​ CPU 的​​​ cgroup 任​​​务​​​访​​​问​​​。​​​
  • cpuacct — 这​​​个​​​子​​​系​​​统​​​自​​​动​​​生​​​成​​​ cgroup 中​​​任​​​务​​​所​​​使​​​用​​​的​​​ CPU 报​​​告​​​。​​​
  • cpuset — 这​​​个​​​子​​​系​​​统​​​为​​​ cgroup 中​​​的​​​任​​​务​​​分​​​配​​​独​​​立​​​ CPU(在​​​多​​​核​​​系​​​统​​​)和​​​内​​​存​​​节​​​点​​​。​​​
  • devices — 这​​​个​​​子​​​系​​​统​​​可​​​允​​​许​​​或​​​者​​​拒​​​绝​​​ cgroup 中​​​的​​​任​​​务​​​访​​​问​​​设​​​备​​​。​​​
  • freezer — 这​​​个​​​子​​​系​​​统​​​挂​​​起​​​或​​​者​​​恢​​​复​​​ cgroup 中​​​的​​​任​​​务​​​。​​​
  • memory — 这​​​个​​​子​​​系​​​统​​​设​​​定​​​ cgroup 中​​​任​​​务​​​使​​​用​​​的​​​内​​​存​​​限​​​制​​​,并​​​自​​​动​​​生​​​成​​​​​内​​​存​​​资​​​源使用​​​报​​​告​​​。​​​
  • net_cls — 这​​​个​​​子​​​系​​​统​​​使​​​用​​​等​​​级​​​识​​​别​​​符​​​(classid)标​​​记​​​网​​​络​​​数​​​据​​​包​​​,可​​​允​​​许​​​ Linux 流​​​量​​​控​​​制​​​程​​​序​​​(tc)识​​​别​​​从​​​具​​​体​​​ cgroup 中​​​生​​​成​​​的​​​数​​​据​​​包​​​。​​​
  • net_prio — 这个子系统用来设计网络流量的优先级
  • hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。

默认的话,在 Ubuntu 系统中,你可能看不到 net_cls 和 net_prio 目录,它们需要你手工做 mount:

  1. root@devstack:/sys/fs/cgroup# modprobe cls_cgroup
  2. root@devstack:/sys/fs/cgroup# mkdir net_cls
  3. root@devstack:/sys/fs/cgroup# mount -t cgroup -o net_cls none net_cls
  4.  
  5. root@devstack:/sys/fs/cgroup# modprobe netprio_cgroup
  6. root@devstack:/sys/fs/cgroup# mkdir net_prio
  7. root@devstack:/sys/fs/cgroup# mount -t cgroup -o net_prio none net_prio
  8.  
  9. root@devstack:/sys/fs/cgroup# ls net_prio/cgroup.clone_children cgroup.procs net_prio.ifpriomap notify_on_release tasks
  10. cgroup.event_control cgroup.sane_behavior net_prio.prioidx release_agent
  11. root@devstack:/sys/fs/cgroup# ls net_cls/
  12. cgroup.clone_children cgroup.event_control cgroup.procs cgroup.sane_behavior net_cls.classid notify_on_release release_agent tasks

1.2 实验

1.2.1 通过 cgroups 限制进程的 CPU

写一段最简单的 C 程序:

  1. int main(void)
  2. {
  3. int i = ;
  4. for(;;) i++;
  5. return ;
  6. }

编译,运行,发现它占用的 CPU 几乎到了 100%:

  1. top - :: up :, users, load average: 0.24, 0.06, 0.06 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  2. root R 99.6 0.0 :11.77 hello

接下来我们做如下操作:

  1. root@devstack:/home/sammy/c# mkdir /sys/fs/cgroup/cpu/hello
  2. root@devstack:/home/sammy/c# cd /sys/fs/cgroup/cpu/hello
  3. root@devstack:/sys/fs/cgroup/cpu/hello# ls
  4. cgroup.clone_children cgroup.procs cpu.cfs_quota_us cpu.stat tasks
  5. cgroup.event_control cpu.cfs_period_us cpu.shares notify_on_release
  6. root@devstack:/sys/fs/cgroup/cpu/hello# cat cpu.cfs_quota_us
  7. -
  8. root@devstack:/sys/fs/cgroup/cpu/hello# echo > cpu.cfs_quota_us
  9. root@devstack:/sys/fs/cgroup/cpu/hello# cat cpu.cfs_quota_us
  10.  
  11. root@devstack:/sys/fs/cgroup/cpu/hello# echo > tasks

然后再来看看这个进程的 CPU 占用情况:

  1. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  2. root R 19.9 0.0 :46.03 hello

它占用的 CPU 几乎就是 20%,也就是我们预设的阈值。这说明我们通过上面的步骤,成功地将这个进程运行所占用的 CPU 资源限制在某个阈值之内了。

如果此时再启动另一个 hello 进程并将其 id 加入 tasks 文件,则两个进程会共享设定的 CPU 限制:

  1. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  2. root R 10.0 0.0 :39.54 hello
  3. root R 10.0 0.0 :25.09 hello

1.2.2 通过 cgroups 限制进程的 Memory

同样地,我们针对它占用的内存做如下操作:

  1. root@devstack:/sys/fs/cgroup/memory# mkdir hello
  2. root@devstack:/sys/fs/cgroup/memory# cd hello/
  3. root@devstack:/sys/fs/cgroup/memory/hello# cat memory.limit_in_bytes
  4.  
  5. root@devstack:/sys/fs/cgroup/memory/hello# echo 64k > memory.limit_in_bytes
  6. root@devstack:/sys/fs/cgroup/memory/hello# echo > tasks
  7. root@devstack:/sys/fs/cgroup/memory/hello#

上面的步骤会把进程 2428 说占用的内存阈值设置为 64K。超过的话,它会被杀掉。

1.2.3 限制进程的 I/O

运行命令:

  1. sudo dd if=/dev/sda1 of=/dev/null

通过 iotop 命令看 IO (此时磁盘在快速转动),此时其写速度为 242M/s:

  1. TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
  2. be/ root 242.60 M/s 0.00 B/s 0.00 % 61.66 % dd if=/dev/sda1 of=/dev/null

接着做下面的操作:

  1. root@devstack:/home/sammy# mkdir /sys/fs/cgroup/blkio/io
  2. root@devstack:/home/sammy# cd /sys/fs/cgroup/blkio/io
  3. root@devstack:/sys/fs/cgroup/blkio/io# ls -l /dev/sda1
  4. brw-rw---- root disk , Sep : /dev/sda1
  5. root@devstack:/sys/fs/cgroup/blkio/io# echo '8:0 1048576' > /sys/fs/cgroup/blkio/io/blkio.throttle.read_bps_device
  6. root@devstack:/sys/fs/cgroup/blkio/io# echo > /sys/fs/cgroup/blkio/io/tasks

结果,这个进程的IO 速度就被限制在 1Mb/s 之内了:

  1. TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
  2. be/ root 990.44 K/s 0.00 B/s 0.00 % 96.29 % dd if=/dev/sda1 of=/dev/null

1.3 术语

cgroups 的术语包括:

  • 任务(Tasks):就是系统的一个进程。
  • 控制组(Control Group):一组按照某种标准划分的进程,比如官方文档中的Professor和Student,或是WWW和System之类的,其表示了某进程组。Cgroups中的资源控制都是以控制组为单位实现。一个进程可以加入到某个控制组。而资源的限制是定义在这个组上,就像上面示例中我用的 hello 一样。简单点说,cgroup的呈现就是一个目录带一系列的可配置文件。
  • 层级(Hierarchy):控制组可以组织成hierarchical的形式,既一颗控制组的树(目录结构)。控制组树上的子节点继承父结点的属性。简单点说,hierarchy就是在一个或多个子系统上的cgroups目录树。
  • 子系统(Subsystem):一个子系统就是一个资源控制器,比如CPU子系统就是控制CPU时间分配的一个控制器。子系统必须附加到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。Cgroup的子系统可以有很多,也在不断增加中。

2. Docker 对 cgroups 的使用

2.1 默认情况

默认情况下,Docker 启动一个容器后,会在 /sys/fs/cgroup 目录下的各个资源目录下生成以容器 ID 为名字的目录(group),比如:

  1. /sys/fs/cgroup/cpu/docker/03dd196f415276375f754d51ce29b418b170bd92d88c5e420d6901c32f93dc14

此时 cpu.cfs_quota_us 的内容为 -1,表示默认情况下并没有限制容器的 CPU 使用。在容器被 stopped 后,该目录被删除。

运行命令 docker run -d --name web41 --cpu-quota 25000 --cpu-period 100 --cpu-shares 30 training/webapp python app.py 启动一个新的容器,结果:

  1. root@devstack:/sys/fs/cgroup/cpu/docker/06bd180cd340f8288c18e8f0e01ade66d066058dd053ef46161eb682ab69ec24# cat cpu.cfs_quota_us
  2.  
  3. root@devstack:/sys/fs/cgroup/cpu/docker/06bd180cd340f8288c18e8f0e01ade66d066058dd053ef46161eb682ab69ec24# cat tasks
  4.  
  5. root@devstack:/sys/fs/cgroup/cpu/docker/06bd180cd340f8288c18e8f0e01ade66d066058dd053ef46161eb682ab69ec24# cat cpu.cfs_period_us

Docker 会将容器中的进程的 ID 加入到各个资源对应的 tasks 文件中。表示 Docker 也是以上面的机制来使用 cgroups 对容器的 CPU 使用进行限制。

相似地,可以通过 docker run 中 mem 相关的参数对容器的内存使用进行限制:

  1. --cpuset-mems string MEMs in which to allow execution (-, ,)
  2. --kernel-memory string Kernel memory limit
  3. -m, --memory string Memory limit
  4. --memory-reservation string Memory soft limit
  5. --memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap
  6. --memory-swappiness int Tune container memory swappiness ( to ) (default -)

比如  docker run -d --name web42 --blkio-weight 100 --memory 10M --cpu-quota 25000 --cpu-period 2000 --cpu-shares 30 training/webapp python app.py:

  1. root@devstack:/sys/fs/cgroup/memory/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410# cat memory.limit_in_bytes
  2. 10485760

root@devstack:/sys/fs/cgroup/blkio/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410# cat blkio.weight
  100

目前 docker 已经几乎支持了所有的 cgroups 资源,可以限制容器对包括 network,device,cpu 和 memory 在内的资源的使用,比如:

  1. root@devstack:/sys/fs/cgroup# find -iname ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  2. ./net_prio/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  3. ./net_cls/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  4. ./systemd/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  5. ./hugetlb/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  6. ./perf_event/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  7. ./blkio/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  8. ./freezer/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  9. ./devices/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  10. ./memory/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  11. ./cpuacct/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  12. ./cpu/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410
  13. ./cpuset/docker/ec8d850ebbabaf24df572cb5acd89a6e7a953fe5aa5d3c6a69c4532f92b57410

2.2 net_cls

net_cls 和 tc 一起使用可用于限制进程发出的网络包所使用的网络带宽。当使用 cgroups network controll net_cls 后,指定进程发出的所有网络包都会被加一个 tag,然后就可以使用其他工具比如 iptables 或者 traffic controller (TC)来根据网络包上的 tag 进行流量控制。关于 TC 的文档,网上很多,这里不再赘述,只是用一个简单的例子来加以说明。

关于 classid,它的格式是 0xAAAABBBB,其中,AAAA 是十六进制的主ID(major number),BBBB 是十六进制的次ID(minor number)。因此,0X10001 表示 10:1,而 0x00010001 表示 1:!。

(1)首先在host 的网卡 eth0 上做如下设置:

tc qdisc del dev eth0 root                                        #删除已有的规则
tc qdisc add dev eth0 root handle 10: htb default 12              
tc class add dev eth0 parent 10: classid 10:1 htb rate 1500kbit ceil 1500kbit burst 10k         #限速
tc filter add dev eth0 protocol ip parent 10:0 prio 1 u32 match ip protocol 1 0xff flowid 10:1  #只处理 ping 参数的网络包

其结果是:

  • 在网卡 eth0 上创建了一个 HTB root 队列,hangle 10: 表示队列句柄也就是major number 为 10
  • 创建一个分类 10:1,限制它的出发网络带宽为 80 kbit (千比特每秒)
  • 创建一个分类器,将 eth0 上 IP IMCP 协议 的 major ID 为 10 的 prio 为 1 的网络流量都分类到 10:1 类别

(2)启动容器

容器启动后,其 init 进程在host 上的 PID 就被加入到 tasks 文件中了:

  1. root@devstack:/sys/fs/cgroup/net_cls/docker/ff8d9715b7e11a5a69446ff1e3fde3770078e32a7d8f7c1cb35d51c75768fe33# ps -ef | grep
  2. : ? :: python app.py

设置 net_cls classid:

  1. echo 0x100001 > net_cls.classid

再在容器启动一个 ping 进程,其 ID 也被加入到 tasks 文件中了。

(3)查看tc 情况: tc -s -d class show dev eth0

Every 2.0s: tc -s class ls dev eth0 Wed Sep 21 04:07:56 2016

class htb 10:1 root prio 0 rate 1500Kbit ceil 1500Kbit burst 10Kb cburst 1599b
Sent 17836 bytes 182 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 182 borrowed: 0 giants: 0
tokens: 845161 ctokens: 125161

我们可以看到 tc 已经在处理 ping 进程产生的数据包了。再来看一下 net_cls 和 ts 合作的限速效果:

  1. bytes from 192.168.1.1: icmp_seq= ttl= time=12.7 ms
  2. bytes from 192.168.1.1: icmp_seq= ttl= time=15.2 ms
  3. bytes from 192.168.1.1: icmp_seq= ttl= time= ms
  4. bytes from 192.168.1.1: icmp_seq= ttl= time= ms

其中:

  • 后两条说使用的 tc class 规则是 tc class add dev eth0 parent 10: classid 10:1 htb rate 1500kbit ceil 15kbit burst 10k
  • 前两条所使用的 tc class 规则是 tc class add dev eth0 parent 10: classid 10:1 htb rate 1500kbit ceil 10Mbit burst 10k

3. Docker run 命令中 cgroups 相关命令

  1. block IO:
  2. --blkio-weight value Block IO (relative weight), between and
  3. --blkio-weight-device value Block IO weight (relative device weight) (default [])
  4. --cgroup-parent string Optional parent cgroup for the container
  5. CPU:
  6. --cpu-percent int CPU percent (Windows only)
  7. --cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
  8. --cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
  9. -c, --cpu-shares int CPU shares (relative weight)
  10. --cpuset-cpus string CPUs in which to allow execution (-, ,)
  11. --cpuset-mems string MEMs in which to allow execution (-, ,)
  12. Device:
  13. --device value Add a host device to the container (default [])
  14. --device-read-bps value Limit read rate (bytes per second) from a device (default [])
  15. --device-read-iops value Limit read rate (IO per second) from a device (default [])
  16. --device-write-bps value Limit write rate (bytes per second) to a device (default [])
  17. --device-write-iops value Limit write rate (IO per second) to a device (default [])
  18. Memory:
  19. --kernel-memory string Kernel memory limit
  20. -m, --memory string Memory limit
  21. --memory-reservation string Memory soft limit
  22. --memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap
  23. --memory-swappiness int Tune container memory swappiness ( to ) (default -)

一些说明:

1. cgroup 只能限制 CPU 的使用,而不能保证CPU的使用。也就是说, 使用 cpuset-cpus,可以让容器在指定的CPU或者核上运行,但是不能确保它独占这些CPU;cpu-shares 是个相对值,只有在CPU不够用的时候才其作用。也就是说,当CPU够用的时候,每个容器会分到足够的CPU;不够用的时候,会按照指定的比重在多个容器之间分配CPU。

2. 对内存来说,cgroups 可以限制容器最多使用的内存。使用 -m 参数可以设置最多可以使用的内存。

参考链接:

理解Docker(4):Docker 容器使用 cgroups 限制资源使用的更多相关文章

  1. docker入门(二)容器与镜像的理解

    10张图带你深入理解Docker容器和镜像 申明:此篇文章是转载的(原文地址http://dockone.io/article/783),今天意外发现已经有人转载了(复制了),希望大家关注原创 原本打 ...

  2. Docker——理解好镜像和容器的关系

    关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料.  镜像也是 docker 的核心组件之一,镜像时容器运行的基础,容器是镜像运行后的形态.前面我们介绍了 ...

  3. Docker背后的容器管理——Libcontainer深度解析

    Libcontainer 是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces.cgroups.capabilities以及文件系统来进行容器控制.你可以使用Libcon ...

  4. docker镜像与容器概念

    本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(containe ...

  5. docker入门(二)容器与镜像的关系

    [编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(co ...

  6. [转帖]Docker容器CPU、memory资源限制

    Docker容器CPU.memory资源限制 https://www.cnblogs.com/zhuochong/p/9728383.html 处理事项内容等 这一块内容感觉 不清楚.. 背景 在使用 ...

  7. Docker镜像、容器剖析

    我们通常所说的docker是什么? 在这里英文本意为“搬运工”这里指的的docker搬运点的是集装箱,集装箱装的是够任意类型的APP,开发者通过Docker可以将app变成一种标准化,可移植的.自管理 ...

  8. Docker(二十)-Docker容器CPU、memory资源限制

    背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不 ...

  9. Docker背后的内核知识——cgroups资源限制(转)

    时间 2015-04-20 21:10:00 InfoQ 原文  http://www.infoq.com/cn/articles/docker-kernel-knowledge-cgroups-re ...

随机推荐

  1. CRL快速开发框架系列教程四(删除数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. CSS知识总结(三)

    CSS的常用样式 1.字体样式 1)字体名称(font-family) font-family  :  <family-name> 设置文字名称,可以使用多个名称,或者使用逗号分隔,浏览器 ...

  3. 基于轻量型Web服务器Raspkate的RESTful API的实现

    在上一篇文章中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkate实现简单的RESTful API. 模块 首先让我们了解一下"模块&quo ...

  4. C# webform上传图片并生成缩略图

    其实里面写的很乱,包括修改文件名什么的都没有仔细去写,主要是想记录下缩略图生成的几种方式 ,大家明白就好! void UpImgs() { if (FileUpload1.HasFile) { str ...

  5. 『.NET Core CLI工具文档』(二).NET Core 工具遥测(应用信息收集)

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:.NET Core Tools Telemetry 翻译:.NET Core 工具遥测(应用信息收集) .NET Cor ...

  6. IL初步了解

    一.概述: 近来也是在看AOP方面的东西,了解到Emit可以实现.之前对Emit的了解也就是停留在Reflector针对方法反编译出来的部分指令.就用这次机会学习下Emit也用这篇随笔记录下学习的过程 ...

  7. js正则表达式校验非负浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 如何实现一个php框架系列文章【2】实现类的自动加载

    根据前一篇文章的设计原则,我们暂时把php文件分为3类,类名和文件名都遵守如下约定.   类名 文件名 路径 模型类m {$app}Mod  {$app}.mod.php {$app}/model   ...

  9. 禁止backspace键(退格键),但输入文本框时不禁止(兼容IE)

    Ext实现方式: Ext.getDoc().on('keydown',function(e){      if(e.getKey() == 8 && e.getTarget().typ ...

  10. 基于rem的移动端自适应解决方案

    代码有更新,最好直接查看github: https://github.com/finance-sh/adaptive adaptivejs原理: 利用rem布局,根据公式 html元素字体大小 = d ...