支持docker虚拟化技术的核心技术:
docker隔离:
名字空间做环境隔离
cgroup做资源隔离
存储驱动:
1、名字空间(namespace)
名字空间是Linux为我们提供的用于分离进程树,网络接口,挂载点等资源的机制。
Linux的名字空间机制提供了七种不同的命名空间:
CLONE_NEWCGROUP
CLONE_NEWIPC
CLONE_NEWNET
CLONE_NEWNS
CLONE_NEWPID
CLONE_NEWUSER
CLONE_NEWUTS
通过这七个选项能在新进程中设置哪些资源上与宿主机器进行隔离。
进程名字空间:
init和kthreadd进程都是上帝进程idle创建出来的
init进程负责执行内核的一部分初始化工作和系统配置
kthreadd负责管理和调度其他的内核进程
在docker容器内执行 ps -ef 命令看到的只有简单的我们三个进程,宿主机器上的进程是看不见的。
具体实现是在执行clone(2)创建新进程时传入CLONE_NEWPID实现的,也就是使用Linux的命名空间实现进程的隔离。
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的镜像本质上就是一个文件压缩包。
容器与镜像的区别就在于,所有的镜像都是只读的,而每一个容器其实就是等于镜像加上一个可读写的层,所有对于运行时容器的修改其实都是对这个容器读写层的修改。
且同一个镜像可以对应多个容器。