Docker是使用LXC来实现(LXC为Linux Container的简写:可以提供轻量级的虚拟化,以便隔离进程和资源,LXC将linux进程沙箱化,使得进程之间相互隔离),因为|Docker使用LXC来实现,所以Docker其实就是利用Linux中的核心分离机制Cgroups和Namespace来创建独立的容器,Docker就是利用Namespace做资源隔离(进程、网络、挂载点、进程间通信等隔离),用Cgroup做资源的限制(cpu、内存、磁盘io和网络宽带隔离),利用Union FS做容器文件系统的轻量级虚拟化技术,docker其实就是个进程,是个轻量级的虚拟化技术,所以了解docker原理就要先理解Linux的namespace和cgroup。
1.namespace(命名空间)
1).namespace 是Linux 提供的一种内核级别环境隔离的方法,用于分离进程、网络、挂载点等隔离。 Docker 其实就通过 Linux 的 Namespaces 对不同的容器实现了隔离。
2).在centos中执行ps -ef会看到pid为1和2的两个进程,1进程进行内核初始化和系统配置工作,2进程负责管理和调度其他内核进程。
3).当执行docker run命令的时候其实就是在setNamespaces中通过clone命令创建一个命名空间 Spec用于进程隔离,同时也会创建其他用户名、网络等命名空间。
进入docker后通过ps -ef 看到了pid=1的进程,每个docker容器中都有pid=1的进程,它与宿主机的进程进行隔离
4).在docker服务器在启动后都会创建虚拟网桥docker0(默认是网桥模式),docker0用于本服务器所有docker容器的网络通讯工作。在执行docker run命令,启动容器后,会创建两个虚拟网卡,一个放在本容器,一个放在docker0。docker0为每个容器分配一个ip地址,当有请求过来后,所有请求都会通过iptables通过docker0路由到对应的容器。
2.Cgroup
1).namespace实现了进程的隔离,但是对于CPU、内存、磁盘 I/O 和网络带宽等还是各个容器进行共享的,这样会导致各个容器相互争夺资源、性能受到限制。Cgroups( Control Groups)实现了资源控制Cgroups,最主要的作用是限制一个进程组能够使用的资源上限,比如CPU、内存、磁盘io和宽带等。
2).当docker容器启动后,系统会为docker创建一个标识相同的Cgroup,此Cgroup和宿主机是上下级关系。在此Cgroup中会对资源做限制。
3.UnionFS(文件系统)
1).docker容器里有一套自己的文件系统,和宿主机的文件系统是隔离的(可以通过-V进行挂载)。UnionFS可以将将容器镜像里面的多层文件内容融合到统一的rootfs(根文件系统),在容器内部可以在根目录一层一层查看这些文件内容。