一,指定内存大小的参数:

[root@localhost liuhongdi]# docker run -idt --name kafka2 --hostname kafka2 -m 200M --memory-swap 230M --privileged kafka:0.1 /usr/sbin/init
5286d44361bfffcb334044f02b7ebe2399a7949aa5d139b1f226e7813a1b3e35

参数:

-m 或 --memory:设置内存的使用限额,例如 100M, 2G

–memory-swap:设置 内存+swap 的使用限额

注意:

1,默认情况下,memory和memory-swap参数的值为 -1,即对容器内存和 swap 的使用没有限制。

2,如果在启动容器时只指定 -m 而不指定 --memory-swap,

   那么 --memory-swap 默认为 -m 的两倍,比如:

docker run -it -m 200M ubuntu

   容器最多使用 200M 物理内存和 200M swap

 


         对应的源码可以访问这里获取: https://github.com/liuhongdi/

 说明:作者:刘宏缔

 

二,从docker inspect中可以看到设置值:

1,docker inspect查看memory

[root@localhost liuhongdi]# docker inspect kafka2 | grep -i memory
            "Memory": 209715200,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 241172480,
            "MemorySwappiness": null,

 

2,docker inspect查看memory+swap

[root@localhost liuhongdi]# docker inspect kafka2 | grep -i memoryswap
            "MemorySwap": 241172480,
            "MemorySwappiness": null,

 

三,用docker stats中查看内存限额:

[root@localhost liuhongdi]# docker stats kafka2 --no-stream
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
5286d44361bf        kafka2              0.02%               57.62MiB / 200MiB   28.81%              12.5MB / 222kB      19.7MB / 1.15MB     5

LIMIT一项是我们指定的内存限额数量

 

四,在容器中测试内存占用的限额是否起作用?

1,

在容器中安装stress

[root@kafka2 source]# wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/s/stress-1.0.4-16.el7.x86_64.rpm
[root@kafka2 source]# rpm -ivh stress-1.0.4-16.el7.x86_64.rpm

 

2,执行测试:

[root@kafka2 source]# stress --vm 1 --vm-bytes 280M
stress: info: [261] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [261] (415) <-- worker 262 got signal 9
stress: WARN: [261] (417) now reaping child worker processes
stress: FAIL: [261] (451) failed run completed in 6s
[root@localhost liuhongdi]#

线程报错,容器退出了

因为280M超出最大200M的限额

 

3, stress命令两个参数的含义:

-m --vm n 产生n个进程,每个进程不断调用内存分配malloc和内存释放free函数

   --vm-bytes B 指定malloc时内存的字节数 (默认256MB)

   --vm-hang N 指示每个消耗内存的进程在分配到内存后转入休眠状态,与正常的无限分配和释放内存的处理相反,

                      这有利于模拟只有少量内存的机器

 

4,用docker ps -a查看

[root@localhost liuhongdi]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
5286d44361bf        kafka:0.1           "/usr/sbin/init"    16 minutes ago      Exited (137) 4 minutes ago                       kafka2

状态成了 :Exited

 

5,说明:生产环境中,对docker进行内存限额非常重要,

否则很容易出现容器给整个主机造成oom

 

五,查看docker的版本:

[root@localhost liuhongdi]# docker --version
Docker version 19.03.8, build afacb8b