如何搞懂容器的核心技术点?
作者 | 阿文
责编 | 郭芮
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 3556258649b2 3 weeks ago 64.2MB
busybox latest db8ee88ad75f 4 weeks ago 1.22MB
docker exec -it docker 进程 /bin/bash
进入到 docker 容器中,得到一个和宿主机一样的 shell 终端,和我们连接虚拟机得到的终端几乎没什么不同,我们还可以在终端中执行例如:
apt-get update
亦或是安装各种命令。
等等,这似乎这就是一台虚拟机嘛。可是事实上真的是这样吗?
# docker run -it busybox /bin/sh
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/sh
6 root 0:00 ps
/ #
# ps aux | grep docker
root 3490 0.0 5.7 843208 58032 ? Ssl Aug14 0:22 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 14669 0.0 6.3 709900 63612 pts/0 Sl+ 14:36 0:00 docker run -it busybox /bin/sh
可以看到进程 14669 正在执行`docker run -it busybox /bin/sh`,事实上这个 14669 才是这个 Docker 容器的真正 PID。
ps aux | grep systemd
root 1 0.0 0.7 225308 7828 ? Ss Jun20 3:12 /lib/systemd/systemd --system --deserialize 39
cpu 子系统,主要限制进程的 CPU 使用率。
cpuacct 子系统,可以统计 Cgroups 中的进程的 CPU 使用报告。
cpuset 子系统,可以为 Cgroups 中的进程分配单独的 CPU 节点或者内存节点。
memory 子系统,可以限制进程的 memory 使用量。
blkio 子系统,可以限制进程的块设备 IO。
devices 子系统,可以控制进程能够访问某些设备。
net_cls 子系统,可以标记 Cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
freezer 子系统,可以挂起或者恢复 Cgroups 中的进程。
ns 子系统,可以使不同 Cgroups 下面的进程使用不同的 Namespace。
# mount -t cgroup
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cd /sys/fs/cgroup/cpu
/sys/fs/cgroup/cpu# ls
cgroup.clone_children cpuacct.stat cpuacct.usage_percpu_sys cpu.cfs_period_us docker tasks
cgroup.procs cpuacct.usage cpuacct.usage_percpu_user cpu.cfs_quota_us notify_on_release user.slice
cgroup.sane_behavior cpuacct.usage_all cpuacct.usage_sys cpu.shares release_agent
container cpuacct.usage_percpu cpuacct.usage_user cpu.stat system.slice
例如 cpu.cfs_period_us cpu.cfs_quota_us 这样的文件,它们就是用来限制 CPU 在一定时间内只能分配总量是多少的 CPU 时间。
while : ; do : ; done &
[1] 10108
top - 11:28:29 up 57 days, 1:47, 2 users, load average: 0.23, 0.23, 0.21
Tasks: 99 total, 3 running, 63 sleeping, 0 stopped, 0 zombie
%Cpu(s): 98.7 us, 1.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1006788 total, 185284 free, 458532 used, 362972 buff/cache
KiB Swap: 969964 total, 928280 free, 41684 used. 355496 avail Mem
我们接下来在 CPU 的 Cgroup 中创建一个 demo 的文件:
/sys/fs/cgroup/cpu# mkdir demo
/sys/fs/cgroup/cpu# cd demo/
/sys/fs/cgroup/cpu/demo# ls
cgroup.clone_children cpuacct.usage cpuacct.usage_percpu_sys cpuacct.usage_user cpu.shares tasks
cgroup.procs cpuacct.usage_all cpuacct.usage_percpu_user cpu.cfs_period_us cpu.stat
cpuacct.stat cpuacct.usage_percpu cpuacct.usage_sys cpu.cfs_quota_us notify_on_release
查看cfs_quota_us 和 cfs_period_us 的默认值,cfs_period_us 默认是 100ms(100000us):
# cat cpu.cfs_quota_us
-1
/sys/fs/cgroup/cpu/demo# cat cpu.cfs_period_us
100000
# echo 10000 > cpu.cfs_quota_us
/sys/fs/cgroup/cpu/demo# cat cpu.cfs_quota_us
10000
然后我们将进程 ID 写入 task:
/sys/fs/cgroup/cpu/demo# echo 10108 > tasks
此时我们再次执行 top 就可以发现 CPU 利用率瞬间降到了 30%以下,其他限制进程的资源使用的方法也类似。
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
它们的挂载方式都是只读的(ro+wh,即 readonly+whiteout 的方式挂载。
【END】
热 文 推 荐