序言
整理了一下Docker关于namespace的6种隔离的系统调用,据说面试常问,要学习起来了。
Docker 的三大理念是 build(构建)、 ship(运输)、run(运行)
通过namespace实现资源隔离,通过cgroup实现安全保障 linux内核提拱了6种namespace隔离的系统调用
1.MNT Namespace
提供磁盘挂载点和文件系统的隔离能力
比如一个宿主机是 ubuntu 的服务器, 可以在里面启动一个 centos 运行环境的容器并且在容器里面启动一个 Nginx 服务, 此 Nginx 运行时使用的运行环境就是 centos 系统目录的运行环境, 但是在容器里面是不能访问宿主机的资源, 宿主机是使用了 chroot 技术把容器锁定到一个指定的运行目录里面
2.IPC Namespace
提供进程间通信的隔离能力
同一个容器内的进程间通信相互可见,不同容器则不可见(不能跨容器访问)
3.UTS Namespace
提供主机名隔离能力
UTS提供主机名与域名的隔离,让每个docker拥有的主机名和域名,并独立于宿主机系统和其上的其他容器
docker中,每个镜像基本都以自身所提供的服务名称来命名镜像的hostname,且不会对宿主机产生任何影响
4.PID Namespace
提供进程隔离能力
pid 进程运行时系统随机分配的代号,程序终止后被回收,可能分配给其他程序,在linux系统中,多个容器的进程通过 PID namespace 进程隔离
对进程PID重新标号,即两个不同namespace下的进程可以有相同的PID。每个PID namespace都有自己的计数程序
5.Net Namespace
提供网络隔离能力
提供了关于网络资源的隔离,包括网络设备、IPv4和IPv6协议栈、IP路由表、防火墙,创建的时候添加CLONE_NEWNET标识符位,Docker 使用 network namespace 启动一个 vethX 接口, 这样你的容器将拥有它自己的桥接 ip 地址, 通常是 docker0, 而 docker0 实质就是 Linux 的虚拟网桥,网桥是在 OSI 七层模型的数据链路层的网络设备, 通过 mac 地址对网络进行划分, 并且在不同网络直接传递数据
6.User Namespace
提供用户隔离能力
主要隔离了安全相关的标识符和属性
允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户 UID 和 GID,把用户的作用范围限制在每个容器内,包括用户ID、用户组ID、root目录、key以及特殊权限