目录
- 一、Cgroup
- 二、Namespace
一、Cgroup
Cgroup(Control Group),它用于 linux 系统资源分配、限制,前面提到的 Docker 资源分配与限制就是使用的 linux 底层技术来实现。
- CPU:/sys/fs/cgroup/cpu/docker
- 内存:/sys/fs/cgroup/memory/docker
- 磁盘 IO:/sys/fs/cgroup/blkio/docker
当运行一个容器时,linux系统(宿主机)就会为这个容器创建一个 cgroup 目录,并以容器长 ID 命名,如下图:
该长 ID 目录下就有一个 cpu.shares 文件,其值为默认值或是你在运行容器时指定的值,如下图:
内存、磁盘 IO 类似。
二、Namespace
抛开宿主机后,你会发现每个容器都已自己独立的一套完整资源,如网卡设备、文件系统等,而实现这一技术的正是 namespace
,namespace 管理 Host 中全局唯一资源,并可以让每个容器都觉得只有自己在使用它。其实也就是 namespace 实现了容器间资源的隔离。你也可以类比 k8s 的 namespace,在 k8s 中,namespace 可实现权限划分、资源访问等。
Linux 使用了 6 种 namespace,分别是:Mount、UTS、IPC、PID、Network 和 User。
1、Mount
该 namespace 可让容器拥有自己独立的文件系统,比如容器有自己的 / 目录,可实现相关的挂载操作(当然这些操作并不会影响我们的宿主机及其他容器)
2、UTS
该 namespace 可让容器拥有自己独立的 hostname,比如我们在运行容器时通过 -h 指定 hostname。
docker run -it -h rab ...
# 其中rab就是该容器的主机名
3、IPC
该 namespace 让容器拥有自己的共享内存和信号量,来实现进程间的通信,而不会与宿主机(Host)及其他容器混在一起。
4、PID
该 namespace 让容器拥有自己独立一套的 PID,每个容器都是以进程的形式在宿主机(Host)中运行,如图下运行了三个容器及其在 Host 中对应的 PID。
可看到,所有容器进程都挂到了 docker 容器引擎进程 /usr/bin/containerd
下。
注意:每个容器拥有自己独立一套的 PID,但容器中为 1 的 PID 并不是 Host 的 init 进程,因为容器与 Host 的 PID 是完全隔离且完整独立的。
5、Network
该 namespace 让容器拥有自己独立网卡设备、路由等资源,同样与 Host 的 Network 是完全隔离且完整独立的。
6、User
该 namespace 让容器拥有自己独立的用户空间,同样与 Host 的 User 是完全隔离且完整独立的。