4.namespace

命名空间( namespace)是 Linux 内核的一个强大特性,为容器虚拟化的实现带来极大便 利。 利用这一特性,每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在 独立的操作系统环境中一样。 命名空间机制保证了容器之间彼此互不影响。 在操作系统中,包括内核、文件系统、网络、进程号( Process ID, PID)、用户号( User ID, UID)、 进程间通信( Inter Process Communication, IPC)等资源,所有的资源都是应用进 程直接共享的。 要想实现虚拟化,除了要实现对内存、 CPU、网络 IO、硬盘 IO、存储空间 等的限制外,还要实现文件系统、网络、 PID、 UID、 IPC 等的相互隔离。 前者相对容易实现一些,后者则需要宿主主机系统的深入支持。 随着 Linux 系统对于命名空间功能的逐步完善,现在已经可以实现这些需求,让进 程在彼此隔离的命名空间中运行。 虽然这些进程仍在共用同一个内核和某些运行时环境 (runtime,例如一些系统命令和系统库),但是彼此是不可见的,并且认为自己是独占系统的。

1.进程命名空间

[root@master ~]# ps -ef |grep nginx
root : ? :: nginx: master process nginx -g daemon off;
: ? :: nginx: worker process
root : pts/ :: grep --color=auto nginx
root 3月05 ? :: nginx: master process nginx -g daemon off;
3月05 ? :: nginx: worker process
root 3月05 ? :: nginx: master process nginx -g daemon off;
3月05 ? :: nginx: worker process
[root@master ~]# ps -ef |grep
root : ? :: containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/cdac05a904db952bca89c487ea12f9f58ce4599428e769e6faeaaf1091d8610c -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root : ? :: nginx: master process nginx -g daemon off;
root : pts/ :: grep --color=auto
[root@master ~]# ps -ef |grep
root 2月19 ? :: /usr/bin/containerd

2.IPC命名空间

容器中的进程交互还是采用了 Linux 常见的 进程间交互方法( Interprocess Communication, IPC),包括信号量、消息队列和共享内存等方式。 PID 命名空间和 IPC 命名空间可以组合起来一起 使用,同一个 IPC 命名空间内的进程可以彼此可 见,允许进行交互;不同空间的进程则无法交互。

3.网络命名空间

有了进程命名空间后,不同命名空间中的进程号可以相互隔离,但是网络端口还是共享本地 系统的端口 。 通过网络命名空间,可以实现网络隔离。一个网 络命名空间为进程提供了一个完全独立的网络协议校 的视图。 包括网络设备接口 、 IPv4 和 IPv6 协议、 IP 路由表、 防火墙规则、 sockets 等, 这样每个容器的网 络就能隔离开来。 Docker 采用虚拟网络设备(Virtual Network Device, VND)的方式,将不同命名空间的网络设备连接到一 起。 默认情况下, Docker 在宿主机上创建多个虚机网 桥(如默认的网桥 dockerO ),容器中的虚拟网卡通过网 桥进行连接。

4.挂载命名空间
类似于 chroot, 挂载 ( Mount, MNT) 命名空间可以将一个进程的根文件系统限制到一 个特定的目录下。 挂载命名空间允许不同命名空间的进程看到的本地文件位于宿主机中不同路径下,每 个命名空间中的进程所看到的文件目 录彼此是隔离的。 例如, 不同命名空间中的进程, 都认 为自己独占了一个完整的根文件系统( rootfs), 但实际上,不同命名空间中的文件彼此隔离, 不会造成相互影响 ,同时也无法影响宿主机文件系统中的其他路径。

5. UTS 命名空间 UTS (UNIX Tim e-sharing System) 命名空间允许每个容器拥有独立的主机名和域名 ,从 而可以虚拟出一个有独立主机名和网络空间的环境, 就跟网络上一*立的主机一样。 如果没有于动指定主机名称, Docker 容器的主机名就是返回的容器 ID 的前 6 字节前缀, 否则为指定的用户名:

6. 用户命名空间 每个容器可以有不同的用户和组 id, 也就是说, 可以在容器内使用特定的内部用户执行 程序,而非本地系统上存在的用户 。 每个容器内部都可以有最高权限的 root 帐号,但跟宿主主机不在一个命名空间。 通过使 用隔离的用户命名空间, 可以提高安全性,避免容器内的进程获取到额外的权限;同时通过使用不同用户也可以进一步在容器内控制权限.

上一篇:攻城狮在路上(叁)Linux(十二)--- Linux的目录与路径


下一篇:Python自动发送邮件提示:smtplib.SMTPServerDisconnected: please run connect() first