FROM ubuntu:latest
RUN apt-get update &&
apt-get install stress创建镜像的命令为:
$ docker build -t u-stress:latest .限制内存使用上限
在进入繁琐的设置细节之前我们先完成一个简单的用例:限制容器可以使用的最大内存为 300M。
-m(–memory=) 选项可以完成这样的配置:
$ docker run -it -m 300M --memory-swap -1 --name con1 u-stress /bin/bash下面的 stress 命令会创建一个进程并通过 malloc 函数分配内存:
# stress --vm 1 --vm-bytes 500M通过 docker stats 命令查看实际情况:

上面的 docker run 命令中通过 -m 选项限制容器使用的内存上限为 300M。同时设置 memory-swap 值为 -1,它表示容器程序使用内存的受限,而可以使用的 swap 空间使用不受限制(宿主机有多少 swap 容器就可以使用多少)。
下面我们通过 top 命令来查看 stress 进程内存的实际情况:

上面的截图中先通过 pgrep 命令查询 stress 命令相关的进程,进程号比较大的那个是用来消耗内存的进程,我们就查看它的内存信息。VIRT 是进程虚拟内存的大小,所以它应该是 500M。RES 为实际分配的物理内存数量,我们看到这个值就在 300M 上下浮动。看样子我们已经成功的限制了容器能够使用的物理内存数量。
限制可用的 swap 大小
强调一下 –memory-swap 是必须要与 –memory 一起使用的。
正常情况下, –memory-swap 的值包含容器可用内存和可用 swap。所以 –memory=”300m” –memory-swap=”1g” 的含义为:
容器可以使用 300M 的物理内存,并且可以使用 700M(1G -330M) 的 swap。–memory-swap 居然是容器可以使用的物理内存和可以使用的 swap 之和!
把 –memory-swap 设置为 0 和不设置是一样的,此时如果设置了 –memory,容器可以使用的 swap 大小为 –memory 值的两倍。
如果 –memory-swap 的值和 –memory 相同,则容器不能使用 swap。下面的 demo 演示了在没有 swap 可用的情况下向系统申请大量内存的场景:
$ docker run -it --rm -m 300M --memory-swap=300M u-stress /bin/bash
# stress --vm 1 --vm-bytes 500M
demo 中容器的物理内存被限制在 300M,但是进程却希望申请到 500M 的物理内存。在没有 swap 可用的情况下,进程直接被 OOM kill 了。如果有足够的 swap,程序至少还可以正常的运行。










