Docker 容器中可用的实际内存是多少?

What is the real memory available in Docker container?

我已经 运行 mongodb 服务通过 docker-这样写:

version: '2'
services:
  mongo:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    mem_limit: 4GB

如果我 运行 docker 统计数据,我可以看到分配了 4 GB:

CONTAINER ID   NAME                     CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O    PIDS
cf3ccbd17464   michal_mongo_1           0.64%     165.2MiB / 4GiB       4.03%     10.9kB / 4.35kB   0B / 483kB   35

但是我 运行 这个命令从我的笔记本电脑中获取了 32 GB 的 RAM:

~$ docker exec michal_mongo_1 free -g
              total        used        free      shared  buff/cache   available
Mem:             31           4          17           0           9          24
Swap:             1           0           1

那么mem_limit如何影响内存大小呢?

free(以及 top 等其他实用程序)不会在 memory-constraint 容器内报告正确的数字,因为它从未命名空间的 /proc/meminfo 收集信息。

如果您想要实际限制,您必须使用 /sys/fs/cgroup 下的 cgroup pseudo-filesystem 填充的条目。

例如:

docker run --rm -i --memory=128m busybox cat /sys/fs/cgroup/memory/memory.limit_in_bytes

real-time 使用信息可在 /sys/fs/cgroup/memory/memory.stat 下找到。

您可能需要 resident-set-size (rss),例如(在容器内):

grep -E -e '^rss\s+' /sys/fs/cgroup/memory/memory.stat

更多 in-depth 解释,另请参阅 this article