Docker 是用Go语言编写的,它使用了Linux内核中的一些功能,具体就是:
NameSpace
Docker的Container 使用NameSpace 来实现隔离,在运行容器的过程中,Docker为该容器创建一组NameSpace。
这些NameSpace提供了隔离层,例如,进程,网络等,它们都运行在一个独立的NameSpace,访问也只限于NameSpace。
Linux 内核从版本 2.4.19 开始陆续引入了 namespace 的概念。其目的是将某个特定的全局系统资源通过抽象方法使得namespace 中的进程看起来拥有它们自己的隔离的全局系统资源实例,namepsace包括:
-
pid NameSpace:进程隔离(pid:进程ID)。
每个 PID namespace 中的进程可以有其独立的 PID; 每个容器可以有其 PID 为 1 的root 进程;也使得容器可以在不同的 host 之间迁移,因为 namespace 中的进程 ID 和 host 无关了。这也使得容器中的每个进程有两个PID:容器中的 PID 和 host 上的 PID。 -
net NameSpace:管理网络接口(net: Networking)。
每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号等等。这也使得一个 host 上多个容器内的同一个应用都绑定到各自容器的 80 端口上。 -
ipc NameSpace:管理对ipc资源的访问(ipc:进程间通信)。
每个容器有其自己的 System V IPC 和 POSIX 消息队列文件系统,因此,只有在同一个 IPC namespace 的进程之间才能互相通信 -
mnt NameSpace:管理文件系统挂载点(mnt: mount)。
每个容器能看到不同的文件系统层次结构。 -
uts NameSpace:隔离内核和版本标识符。Unix分时系统。
每个容器可以有自己的 hostname 和 domainame。 -
User NameSpace :用户和组 ID name space。
在 user namespace 中的进程的用户和组 ID 可以和在 host 上不同; 每个 container 可以有不同的 user 和 group id;一个 host 上的非特权用户可以成为 user namespace 中的特权用户;
Control Groups.
Docker使用CGroups技术来限制特定的资源。 使用CGroups, Docker 引擎可以向容器共享可用的硬件资源。比如限定特定内存给特定的容器使用。
Linux 中的Cgroup 可为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。
它主要提供了如下功能:
- Resource limitation: 限制资源使用,比如内存使用上限以及文件系统的缓存限制。
- Prioritization: 优先级控制,比如:CPU利用和磁盘IO吞吐。
- Accounting: 一些审计或一些统计,主要目的是为了计费。
- Control: 挂起进程,恢复执行进程。
使用 cgroup,系统管理员可更具体地控制对系统资源的分配、优先顺序、拒绝、管理和监控。可更好地根据任务和用户分配硬件资源,提高总体效率。
Union 文件系统
UnionFS是通过创建层来操作的文件系统。非常的轻量级,而且快。
Docker使用UnionFS来为容器创建构建块。
容器格式
Docker将name space, cGroups, unionFS 组合到一个称为容器格式的包装器中。默认的容器格式是libcontainer。
所以,Docker是一种基于Linux内核的一个容器引擎,通过其背后的技术,我们其实也可以得到以下几点:
- Docker基于Linux,隔离性主要是通过Namespace来隔离,相对简单。
- Docker对Disk管理也比较有限。
当然,Docker也毋庸置疑是一个很好的,非常成功的产品。