docker核心技术

支持docker虚拟化技术的核心技术:

docker隔离:

名字空间做环境隔离

cgroup做资源隔离

存储驱动:


1、名字空间(namespace)

名字空间是Linux为我们提供的用于分离进程树,网络接口,挂载点等资源的机制。

Linux的名字空间机制提供了七种不同的命名空间:

CLONE_NEWCGROUP

CLONE_NEWIPC

CLONE_NEWNET

CLONE_NEWNS

CLONE_NEWPID

CLONE_NEWUSER

CLONE_NEWUTS

通过这七个选项能在新进程中设置哪些资源上与宿主机器进行隔离。

进程名字空间:

docker核心技术

init和kthreadd进程都是上帝进程idle创建出来的

init进程负责执行内核的一部分初始化工作和系统配置

kthreadd负责管理和调度其他的内核进程

在docker容器内执行 ps -ef 命令看到的只有简单的我们三个进程,宿主机器上的进程是看不见的。

具体实现是在执行clone(2)创建新进程时传入CLONE_NEWPID实现的,也就是使用Linux的命名空间实现进程的隔离。

docker容器内部所有进程都对宿主机器的进程一无所知。

docker核心技术

网络:

每一个使用docker run启动的容器其实都具有单独的网络命名空间,docker提供了四种不同的网络模式:

host:

container:

none:

bridge:

当docker容器需要将服务暴露给宿主机器,就会为容器分配一个IP地址,同时在iptables中追加一条新的规则。

docker通过名字空间实现了网络隔离,又通过iptabls进行数据包的转发,让docker容器能够优雅的为宿主机器或外部机器提供服务。

文件目录隔离:隔离各个容器对文件系统的访问隔离

2、cgroups隔离:cgroup可以针对物理资源进行隔离,如CPU,内存,磁盘IO和网络带宽。

3、UnionFS:

名字空间解决网络,进程,网络,文件系统隔离。

cgroup解决cpu,内存,网络带宽等资源隔离。

docker还有一个重要问题,镜像。

docker的镜像本质上就是一个文件压缩包。

容器与镜像的区别就在于,所有的镜像都是只读的,而每一个容器其实就是等于镜像加上一个可读写的层,所有对于运行时容器的修改其实都是对这个容器读写层的修改。

且同一个镜像可以对应多个容器。