引申的问题
1.怎么样保证每个容器都有不同的文件系统并且 能互不影响?
2.一个docker主进程内的各个容器都是其子进 程,那么实现同一个主进程下不同类型的子进 程?各个进程间通信能相互访问(内存数据)吗?
3.每个容器怎么解决IP及端口分配的问题?
4.多个容器的主机名能一样吗?
5.每个容器都要不要有root用户?怎么解决账户 重名问题?
NameSpace技术
MNT Namespace(磁盘挂载点和文件系统的隔离)
每个容器都要有独立的根文件 系统有独立的用户空间
使用chroot技术把 容器的根运行环境(容器根目录) 锁定到一个指定的目录
IPC Namespace(进程间通信的隔离)
IPC namespce隔离进程间通 信资源(同一个IPC namespace的进程可实现内 存等资源共享,但是不同的 IPC namespace则严格隔离)
UTS Namespace(主机名隔离)
UTS namespace(UNIX Timesharing System包含了运行 内核的名称、版本、底层体系结 构类型等信息)用于系统标识, 其中包含了hostname 和域名 domainname ,它使得一个容 器拥有属于自己hostname标 识,这个主机名标识独立于宿主 机系统和其上的其他容器
PID Namespace(进程隔离)
Linux系统中,有一个PID为1的进 程(init/systemd)是其他所有进程 的父进程,那么在每个容器内也 要有一个父进程来管理其下属的 子进程,那么多个容器的进程通 PID namespace进程隔离(比如 PID编号重复、器内的主进程生成 与回收子进程等)
Net Namespace(网络隔离)
每一个容器都类似于虚拟机一 样有自己的网卡、监听端口、 TCP/IP协议栈等,docker使用 network namespace启动一 个vethX接口,这样你的容器 将拥有它自己的桥接ip地址, 通常是docker0,而docker0 实质就是Linux的虚拟网桥,网 桥是在OSI七层模型的数据链 路层的网络设备,通过mac地 址对网络进行划分,并且在不 同网络直接传递数据。
User Namespace(用户隔离)
供用户隔离:
-
各个容器内可能会出现重名的用户 和用户组名称,或重复的用户UID 或者GID,那么怎么隔离各个容器 内的用户空间呢?
-
User Namespace允许在各个宿 主机的各个容器空间内创建相同的 用户名以及相同的用户UID和 GID,只是会把用户的作用范围限 制在每个容器内,即A容器和B容 器可以有相同的用户名称和ID的账 户,但是此用户的有效范围仅是当 前容器内,不能访问另外一个容器 内的文件系统,即相互隔离、互不 影响
linux cgroups技术(Linux Control Groups)
背景:
在一个容器,如果不对其做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完
限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。还能够对进程进行优先级设置,以及将进程挂起和恢复等操作。