1、使用docker的–memory参数限制容器最大可用内存失败

docker容器支持在创建一个容器时,手动指定容器内存最大使用量,如下:

docker run --rm --name unlimited-pod -ti --memory 256m ubuntu:latest /bin/bash

但是在容器中,我们查看一下内存的限制,发现并没有生效,总内存还是宿主机的内存,并没有变成我们限制的256m
在这里插入图片描述

2、内存限制失败的原因

这是因为docker使用Cgroups对容器能够使用的资源进行限制,但是/proc系统不知道用户使用Cgroups对容器进行了限制,所以容器的/proc系统还是会使用宿主机的配置。

3、lxcfs技术解决限制失败

如何能/proc系统获取到正确的容器限制呢?
这里,我们可以使用lxcfs解决这个问题,lxcfs通过文件挂载的方式,将用户设置的Cgroups限制信息读取出来,通过docker的volume机制将Cgroups的限制信息设置到容器内的/proc系统中,从而实现在容器中获取到正确的资源限制信息。
下面是一张lxcfs工作的原理图,图片借鉴自:lxcfs工作原理
在这里插入图片描述
下面我们用一台ubuntu的裸机实操一下。
先安装docker,然后安装lxcfs

4、限制docker容器的可用内存验证

4.1、安装社区版docker

1)、更新apt包

sudo apt-get update

2)、安装必要依赖

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

3)、添加Docker的官方GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4)、添加Docker仓库到系统中

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

5)、再次更新apt包

sudo apt-get update

6)、安装docker社区版

sudo apt-get install docker-ce docker-ce-cli containerd.io

7)、验证

#这一步如果正常的话,可以看到docker官方返回的hello from docker的提示
sudo docker run hello-world

4.2、安装lxcfs

我用的是ubuntu 22.04 LTS版本,docker用的是最新的社区版本,28.0.4。
这个版本,可以直接使用apt install命令安装lxcfs,如下:

apt-get install lxcfs

然后使用service方式启动lxcfs

#启动lxcfs
service lxcfs start
#查看lxcfs状态
service lxcfs status

4.3、使用ubuntu镜像验证

1)、下载ubuntu镜像

docker pull ubuntu:latest

2)、增加内存限制参数创建容器

docker run --rm --name unlimited-pod -ti --memory 256m ubuntu:latest /bin/bash

查看容器的内存,发现还是宿主机的内存
在这里插入图片描述
3)、创建容器时,使用volume挂载lxvfs的文件

docker run -it -m 256m  \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
ubuntu:latest /bin/bash

再次查看容器的内存,此时发现容器的最大可用内存已经被限制成了256m
在这里插入图片描述

5、错误解决

5.1、docker和lxcfs版本不兼容导致lxcfs限制容器内存失败

我在操作时,主要遇到的就是这个兼容性的问题,后来把docker和lxcfs的版本都换成最新版本后,解决了问题

6、参考资料

https://cloud.tencent.com/developer/article/2368982

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐