一、CPU资源限制

(1)创建一个交互式容器,并限制其CPU使用量不超过20%

docker run -it --rm --cpu-period 100000 --cpu-quota 20000 ubuntu

root@433a1612a171:/# dd if=/dev/zero of=/dev/null &
在这里插入图片描述
(2)在Linux 系统中,通过 cgroup 查看 Docker 容器 CPU 资源限制
①docker ps 查看运行中的容器

docker ps

②进入容器对应的cgroup CPU目录

 cd /sys/fs/cgroup/cpu/docker/f7aca6e597f378f8efa722a133788f91d5c85ffab1317f813f06031c8c1dd90/

③ls查看cgroup CPU子系统的配置文件

ls

④查看CPU配额

cat cpu.cfs_quota_us

在这里插入图片描述
结果解读:
这个容器的CPU配额时是20000微妙(20ms),也就是说这个Ubuntu 容器,最多只能使用20% 的单个 CPU 核心的算力,哪怕宿主机 CPU 空闲,也不能超过这个限制

二、CPU优先级

1.实验准备

一台CentOS虚拟机开三个MobaXter终端
①终端一:宿主机(监控者)
作用:盯着CPU使用率
②终端二:容器A(权重1024)
作用:占用绝大部分CPU
③终端三:容器B(权重100)
作用:主动争抢,证明优先级差距

2.实验步骤

(1)关闭多余CPU核心(只留1核)

echo 0 > /sys/devices/system/cpu1/online

在这里插入图片描述
我这里提前查找了开启的CPU然后依次关闭
(2)启动第一个容器(默认值1024)

docker run -it --rm ubuntu
dd if=/dev/zero of=/dev/null &

在这里插入图片描述

(3)启动第二个容器(权重100)

docker run -it --rm --cpu-shares 100 ubuntu
dd if=/dev/zero of=/dev/null &

在这里插入图片描述

(4)宿主机查看

docker stats

在这里插入图片描述

三、lxcfs隔离

  lxcfs 是一个轻量级的用户态文件系统(FUSE 类型),主要用于改善容器内的资源可见性,解决容器中查看系统资源(如 CPU、内存、负载等)时显示宿主机资源信息的问题,让容器内的资源视图更符合实际分配的限制。
(1)安装LXCFS
作用:让容器内看到的 CPU、内存等资源,是 Docker 限制后的数值,而非宿主机的

yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm

在这里插入图片描述
在这里插入图片描述
(2)启动LXCFS服务

systemctl start lxcfs

在这里插入图片描述
(3)运行带资源限制+LXCFS挂载的Docker容器

  • -m 200m:限制容器最大使用内存 200MB
  • 一系列 -v 挂载:
    把 LXCFS 生成的虚拟 proc 文件,覆盖容器内的真实 /proc 文件
    让容器内读取到的是被限制后的资源信息
docker run  -it -m 200m \
       -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

验证效果

free -h

在这里插入图片描述
在这里插入图片描述

四、容器特权

权限模式特点运维用途风险
默认(普通)权限极低,uid=0 也是假 root运行普通业务(Nginx/Java/MySQL)最低(安全)
–privileged 特权拥有宿主机完整 root 权限紧急排障、调试硬件 /内核极高(禁止生产常规使用)
–cap-add 白名单只给需要的单个权限需特殊能力的业务(网络 / 存储)低(生产推荐)

1.默认容器:假root,权限被严格锁死

docker run -it --rm busybox

①你看到 uid=0(root),但这是 “假管理员”!
②内核做了权限裁剪,禁止操作网络、磁盘、内核等
③执行 ip link set down eth0、fdisk -l 直接报错:Operation not permitted
④运维作用:防止容器被入侵后,黑客控制整个宿主机,是容器隔离安全的基石
在这里插入图片描述

2.–privileged:完全特权(危险模式)

docker run -it --rm --privileged busybox

加上 --privileged 后:
①容器直接获得宿主机 root 全部权限
②能操作磁盘 fdisk -l、修改网卡、挂载设备、读写任意文件
③等同于直接登录宿主机 root
在这里插入图片描述

3.–cap-add=NET_ADMIN:最小权限白名单(生产最佳实践)

docker run -it --rm --cap-add=NET_ADMIN busybox

①不给全部权限,只开放需要的 “能力”
②NET_ADMIN = 允许管理网络(修改 IP、启停网卡)
③但依然不能操作磁盘、内核,权限可控

在这里插入图片描述

更多推荐