Docker使用Linux Cgroups限制容器对CPU、内存等资源的使用,防止由于某个容器对资源的过度使用而导致主机上其他容器无法正常运行。 Cgroup是control group的简称,是Linux内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用,包括CPU、内存、block I/O、网络带宽。

1.CPU限制

在CPU限制上可以限制一个容器对CPU使用的相对权重。

1docker run --rm -it -c 512 alpine sh
  • 通过-c, --cpu-shares=0 CPU shares (relative weight)指定
  • 容器默认的CPU权重为1024,如果一个容器设置权重为512,另一个设置为1024,则前者只能或者后者一半的CPU资源

限制容器对CPU资源的使用上限:

1docker run --rm -it --cpu-period=1000000 --cpu-quota=500000 alpine sh
  • 上面命令启动的容器在1秒内最多只能运行0.5秒

限制容器运行在特定的CPU上:

1docker run --rm -it --cpuset-cpus=0,1,2 alpine sh
  • 通过--cpuset-cpus="" CPUs in which to allow execution (0-3, 0,1)指定
  • 上面命令启动的容器将被限制运行在0, 1, 2号CPU上

限制CPU数量:

1docker run --rm -it --cpus=0.5
  • 通过--cpus=0.000 Number of CPUs. Number is a fractional number. 0.000 means no limit.指定

2.内存限制

限制内存的使用量:

1docker run --rm -it -m 500m alpine sh
  • 通过-m, --memory=""指定,单位可以是b, k, m, g,最小4m
  • 上面的命令是将容器的可以使用的内存现在在500MB,但实际上在系统发现内存不足时会将部分内存交换到swap分区内, 因此应该通过--memory-swap参数限制容器对内存和swap的使用。如果不用--memory-swap加以限制, 实际上面命令创建容器的虚拟内存的大小将会是指定内存的两倍,即1000MB。
  • --memory-swap Total memory limit (memory + swap, format: []). Number is a positive integer. 单位可以是b, k, m, g。
  • --memory-swappiness une a container’s memory swappiness behavior. Accepts an integer between 0 and 100。 --memory-swappiness=0表示将禁用容器的swap功能。

参考