Docker容器如何判断其内存是否有限?

Docker容器如何判断其内存是否有限?,docker,cgroups,Docker,Cgroups,我正在Docker容器中使用cgget-n--values only--variable memory.limit_in_bytes/,以查看根据Docker run--memory=X允许使用多少内存。但是,我需要知道内存是否受到限制,上面的命令没有回答这个问题,因为在这种情况下,它只会给我一个很大的数字(9223372036854771712) 那么,有没有办法判断记忆是否受到了限制?我正在寻找不需要以特殊方式运行docker run的解决方案,比如从主机装载文件(例如,/var/…)或传递

我正在Docker容器中使用
cgget-n--values only--variable memory.limit_in_bytes/
,以查看根据
Docker run--memory=X允许使用多少内存。但是,我需要知道内存是否受到限制,上面的命令没有回答这个问题,因为在这种情况下,它只会给我一个很大的数字(
9223372036854771712


那么,有没有办法判断记忆是否受到了限制?我正在寻找不需要以特殊方式运行
docker run
的解决方案,比如从主机装载文件(例如,
/var/…
)或传递环境变量。

您可以将可用的总物理内存与
cgget
提供的数字进行比较。如果
cgget
给出的数字小于总物理内存,那么您肯定知道cgroup用于限制内存的位置

例如,如果我在具有2G物理内存的计算机上运行一个将内存限制为100M的容器,
cgget
将报告
104857600
,而
free
命令报告
2098950144
字节:

在docker主机上:

# free -b
             total       used       free     shared    buffers     cached
Mem:    2098950144  585707520 1513242624     712704   60579840  367644672
-/+ buffers/cache:  157483008 1941467136
Swap:   3137335296          0 3137335296    
启动一个限制在100米以内的集装箱

docker run --rm -it --memory=100M <any-image-with-cgget-available> bash -l
请注意,
free
命令将在docker主机上报告与容器中相同的值

最后,下面的bash脚本定义了一个函数
is\u memory\u limited
,可以在测试中使用它来检查cgroup是否用于限制内存

#/bin/bash
set-eu
功能受内存限制{
键入free>/dev/null 2>&1 |{echo>&2“未安装'free'命令。正在中止。”退出1;}
键入cgget>/dev/null 2>&1 |{echo>&2“未安装'cgget'命令。正在中止。”退出1;}
键入awk>/dev/null 2>&1 |{echo>&2“未安装'awk'命令。正在中止。”退出1;}
本地-ir物理_MEM=$(免费-m | awk'NR==2{print$2}')
local-ir CGROUP_MEM=$(cgget-n--仅限值--变量memory.limit_,单位为字节/| awk'{printf“%d”,$1/1024/1024})

如果($CGROUP_MEM只是我的2美分,而不是安装任何第三方工具,您只需使用docker stats检查有限的内存即可

docker container run --name mytestserver -m 200M -dt nginx
在本例中,我将内存量限制为200M,现在验证它

docker stats <container id>

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
3afb4a8cfeb7        mytestserver        0.00%               **1.387MiB / 200MiB**   0.69%               8.48MB / 24.8kB     39.2MB / 8.25MB     2
docker统计数据
容器ID名称CPU%MEM使用率/限制MEM%NET I/O块I/O PIDS
3afb4a8cfeb7 mytestserver 0.00%**1.387MB/200MB**0.69%8.48MB/24.8kB 39.2MB/8.25MB 2

在我的Ubuntu16上,读取的是
cgget命令未找到
;尝试安装
apt-get-install-cgget也失败了。请帮助!如果有人搜索:可以在
cgroup-bin中找到它们
package@johanvdw到20年前,它是
cgroup工具
。当我运行
cgget-n--values only--variable mem时ory.limit_in_bytes/
在我的容器中(运行在macOS Docker Desktop 2.3.0.4上的Ubuntu 20.04,内存=1536m
)我得到了
ULONG_MAX
92233720368547712
)。请看这里:
docker stats <container id>

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
3afb4a8cfeb7        mytestserver        0.00%               **1.387MiB / 200MiB**   0.69%               8.48MB / 24.8kB     39.2MB / 8.25MB     2