虚拟机和docker的区别
宿主如果和容器系统不同的话,那不是和虚拟机一样,一层层的调用,那么Docker和虚拟机还有什么差别?要把 Windows 和 Linux 分清楚,更要把内核(kernel)和用户空间(userland)分清楚。
容器内的进程是直接运行于宿主内核的,这点和宿主进程一致,只是容器的userland不同,容器的userland由容器镜像提供,也就是说镜像提供了 rootfs。
假设宿主是 Ubuntu,容器是 CentOS。CentOS 容器中的进程会直接向 Ubuntu 宿主内核发送 syscall,而不会直接或间接的使用任何 Ubuntu 的userland的库。
这点和虚拟机有本质的不同,虚拟机是虚拟环境,在现有系统上虚拟一套物理设备,然后在虚拟环境内运行一个虚拟环境的操作系统内核,在内核之上再跑完整系统,并在里面调用进程。
还以上面的例子去考虑,虚拟机中,CentOS 的进程发送 syscall 内核调用,该请求会被虚拟机内的 CentOS 的内核接到,然后 CentOS 内核访问虚拟硬件时,由虚拟机的服务软件截获,并使用宿主系统,也就是 Ubuntu 的内核及userland的库去执行。
而且,Linux 和 Windows 在这点上非常不同。Linux 的进程是直接发 syscall 的,而 Windows 则把 syscall 隐藏于一层层的 DLL 服务之后,因此 Windows 的任何一个进程如果要执行,不仅仅需要 Windows 内核,还需要一群服务来支撑,所以如果 Windows 要实现类似的机制,容器内将不会像 Linux 这样轻量级,而是非常臃肿。看一下微软移植的 Docker 就非常清楚了。
所以不要把 Docker 和虚拟机弄混,Docker容器只是一个进程而已,只不过利用镜像提供的rootfs提供了调用所需的userland库支持,使得进程可以在受控环境下运行而已,它并没有虚拟出一个机器出来。
参考:
https://www.docker.com/what-docker
原文链接:http://twang2218.coding.me/post/docker-2016-07-14-faq.html#%E5%AE%BF%E4%B8%BB%E5%A6%82%E6%9E%9C%E5%92%8C%E5%AE%B9%E5%99%A8%E7%B3%BB%E7%BB%9F%E4%B8%8D%E5%90%8C%E7%9A%84%E8%AF%9D%E9%82%A3%E4%B8%8D%E6%98%AF%E5%92%8C%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%80%E6%A0%B7%E4%B8%80%E5%B1%82%E5%B1%82%E7%9A%84%E8%B0%83%E7%94%A8%E9%82%A3%E4%B9%88docker%E5%92%8C%E8%99%9A%E6%8B%9F%E6%9C%BA%E8%BF%98%E6%9C%89%E4%BB%80%E4%B9%88%E5%B7%AE%E5%88%AB
页:
[1]