当前位置:  首页>> 技术小册>> 深入学习Docker

2.1. Chroot
如果需要在一个宿主机上运行多个容器,且容器之间相互个离,那么第一个就需要系统库文件的依赖,对于一个容器而言,需要将其需要的系统文件单独复制出来一份,放到指定目录,并且需要让进程认为这就是根目录,而不是去调用宿主机系统上的库文件。Chroot就是一个切换根目录的方式。

2.2. NameSpaces
为了让多个容器以沙盒的方式在宿主机上运行,就需要提前定义好各个容器能看到的边界。由于各个容器都是直接运行在宿主机系统上,因此需要内核对各个容器的上下文进行修改,让他们看上去是一个独立的操作系统。比如,指定PID为1的进程,指定网卡设备,指定文件系统挂载,指定用户等等。
Linux操作系统内核从底层实现了为各个进程创建独立用户空间的功能,不同用户空间似于一个个独立的虚拟机系统,用户空间内部进程不能感知到其它用户空间中的进程状态。内核提供了六种Namespaces:

2.3. Cgroups
Namespaceses通过障眼法实现了用户空间的隔离,但是没办法对硬件资源进行限制,当一个容器进行CPU密集型操作时,会消耗掉整个宿主机的CPU资源,进而影响了其它容器的正常运行。
因此在Namespaceses之上,还需要对各个容器实现硬件资源限制,比如CPU,Memory,diskio等等。
Cgroups技术针对进程而言的,在centos7系统上,可以通过以下方式来实现对进程的资源限制:

  1. [root@centos-82 ~]# while :;do :;done &
  2. [1] 2136
  3. [root@centos-82 ~]# pidstat -u -p 2136 2 ## 未加cgroups限制下,跑满单个CPU核心
  4. 11:09:54 AM UID PID %usr %system %guest %CPU CPU Command
  5. 11:09:56 AM 0 2136 99.50 0.00 0.00 99.50 4 bash
  6. 11:09:58 AM 0 2136 100.00 0.00 0.00 100.00 4 bash
  7. 11:10:00 AM 0 2136 100.00 0.00 0.00 100.00 4 bash
  8. [root@centos-82 ~]# mount -t cgroup ## 查看当前cgroups路径
  9. cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
  10. cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
  11. cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
  12. cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
  13. cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
  14. cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
  15. cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
  16. cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
  17. cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
  18. cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
  19. cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
  20. [root@centos-82 ~]# mkdir /sys/fs/cgroup/cpu/loop
  21. [root@centos-82 ~]# cat /sys/fs/cgroup/cpu/loop/cpu.cfs_quota_us
  22. -1
  23. [root@centos-82 ~]# cat /sys/fs/cgroup/cpu/loop/cpu.cfs_period_us
  24. 100000
  25. [root@centos-82 ~]# echo 10000 >/sys/fs/cgroup/cpu/loop/cpu.cfs_quota_us ## CPU时间片限制在10%
  26. [root@centos-82 ~]# echo 2136 > /sys/fs/cgroup/cpu/loop/tasks ## 指定限制的进程PID
  27. [root@centos-82 ~]# pidstat -u -p 2136 2
  28. Linux 3.10.0-862.el7.x86_64 (centos-82) 03/02/2019 _x86_64_ (8 CPU)
  29. 11:16:37 AM UID PID %usr %system %guest %CPU CPU Command
  30. 11:16:39 AM 0 2136 10.50 0.00 0.00 10.50 4 bash
  31. 11:16:41 AM 0 2136 10.00 0.00 0.00 10.00 4 bash
  32. 11:16:43 AM 0 2136 9.50 0.00 0.00 9.50 4 bash
  33. 11:16:45 AM 0 2136 9.95 0.00 0.00 9.95 4 bash

该分类下的相关小册推荐: