目录

  • 一、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 命名,如下图:

docker 底层使用lxc有啥影响 docker使用了哪些底层技术?_容器

该长 ID 目录下就有一个 cpu.shares 文件,其值为默认值或是你在运行容器时指定的值,如下图:

docker 底层使用lxc有啥影响 docker使用了哪些底层技术?_docker_02

内存、磁盘 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 底层使用lxc有啥影响 docker使用了哪些底层技术?_容器_03

docker 底层使用lxc有啥影响 docker使用了哪些底层技术?_容器_04

可看到,所有容器进程都挂到了 docker 容器引擎进程 /usr/bin/containerd 下。

注意:每个容器拥有自己独立一套的 PID,但容器中为 1 的 PID 并不是 Host 的 init 进程,因为容器与 Host 的 PID 是完全隔离且完整独立的。

5、Network

该 namespace 让容器拥有自己独立网卡设备、路由等资源,同样与 Host 的 Network 是完全隔离且完整独立的。

docker 底层使用lxc有啥影响 docker使用了哪些底层技术?_docker_05

6、User

该 namespace 让容器拥有自己独立的用户空间,同样与 Host 的 User 是完全隔离且完整独立的。