一、容器
基于Linux 内核的 Cgroup, Namespace,以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
1.1 容器主要特性
- 安全性
- 隔离性
- 便携性
- 可配额
二、Namespace
·Linux Namespace 是一种 Linux Kernel 提供的资源隔离方案:
- 系统可以为进程分配不同的 Namespace;
- 并保证不同的Namespace资源独立分配、进程彼此隔离,即 不同的Namespace下的进程互不干扰。
2.1 Namespace类型
2.2 隔离性
-
pid namespace
- 不同的用户进程就是通过pid namespace隔离开的,且不同不同namesapce中可以有相同的pid,但是这些pid都能映射到主机上的不同pid,本质还是主机上起的进程。
- 有了pid namespace,每个namespace的pid能够相互隔离。
-
net namespace
- 网络隔离是通过net namespace 实现的,每个 net namespace 有独立的 network devices, IP addresses, IP routing tables。
- Docker默认采用veth 的方式将 container 中的虚拟网卡同host上的一个docker bridge:docker0连接在一起。
-
mnt namespace
- mnt namespace 允许不同 namespace 的进程看到的文件结构不同,这样每个namespace中的进程所看到的文件目录就被隔离开了。
-
uts namespace
- UTS("UNIX Time-sharing System”) namespace允许每个 container 拥有独立的 hostname 和 domain name,使其在网络上可以被视作一个独立的节点而非Host上的一个进程。
-
user namespace
- 每个container 可以有不同的user和group id,也就是说可以在 container 内部用 container 内部的用户执行程序而非Host 上的用户。
三、Namespace示例
创建新的network namespace,并执行 sleep 指令:
unshare -fn sleep 100
查看进程信息:
查看网络namespace:
进入该进程所在Namespace 查看网络配置,与主机不一致: