Docker指定容器使用内存

如果是还没有生成的容器,你可以从指定镜像生成容器时特意加上run -m 256m--memory-swap=512m来限制。
-m操作指定的是物理内存,还有虚拟交换分区默认也会生成同样的大小,而--memory-swap的值则等于两者的总和大小。

如果是已在运行中的容器,可以通过docker update命令来实现:

docker update --help可查看到用法,如上图所见。

-m --memory为设置内存最大值;默认单位为byte,可以使用K、G、M等带单位的字符串。

--memory-reservation 是弹性控制内存大小,防止损失性能,建议要开。当宿主机资源充足时,允许容器尽量多地使用内存,当检测到内存竞争或者低内存时,强制将容器的内存降低到memory-reservation所指定的内存大小。按照官方说法,不设置此选项时,有可能出现某些容器长时间占用大量内存,导致性能上的损失。

–-memory-swap:等于内存和swap分区大小的总和,设置为-1时,表示swap分区的大小是无限的。默认单位为byte,可以使用K、G、M等带单位的字符串。如果–memory-swap的设置值小于–-memory的值,则使用默认值,为–-memory-swap值的两倍。

默认情况下,容器可以使用主机上的所有空闲内存。

docker会自动为容器在目录/sys/fs/cgroup/memory/docker/<容器的完整长ID>中创建相应cgroup配置文件,所以在宿主机内查看容器使用的内存配额可以通过查看相应的配置文件得知:

好比如上图
在cgroups的配置文件中,查看到容器的内存大小为256MB (256×1024×1024=268435456B),内存和swap加起来大小为512MB(512x1024x1024=536870912)。


注:我实际查看线上的容器时没有限制内存和swap的大小,后来自行敲了docker update --memory-swap=512 容器ID 的命令重新再看才变成512MB了。

例:

core@tielemao /data/mysql_wp_db/mysql $ docker update -m 256m d17d6
d17d6
core@tielemao /data/mysql_wp_db/mysql $ docker update --memory-swap 512m d17d6
d17d6
core@tielemao /data/mysql_wp_db/mysql $ docker stats d17d6

CONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O               BLOCK I/O             PIDS
d17d6               0.04%               252.6 MiB / 256 MiB   98.65%              668.7 kB / 13.53 MB   43.38 MB / 14.91 MB   30

docker stats 容器ID 可查看容器实际使用中的资源配额,以上例子中的容器是做mysql用的,可见挺耗内存的。而wordpress博客的容器使用中的内存才122MB左右。256M也足够了。
现在怀疑之前容器隔一周两周就自动退出也是因为没做限制倒致宿主机oom将其kill。
目前free -h观测宿主机没有不停增长使用的内存了,估计就是这个原因所致。

by:铁乐与猫

2017年9月

end

发表评论

电子邮件地址不会被公开。 必填项已用*标注