容器的安全性问题的根源在于容器和宿主机共享内核。如果容器里的应用导致Linux内核崩溃,那么整个系统可能都会崩溃。与虚拟机是不同的,虚拟机并没有与主机共享内核,虚拟机崩溃一般不会导致宿主机崩溃。
Docker 容器与虚拟机的区别
1、隔离与共享
虚拟机通过添加 Hypervisor 层(虚拟化中间层),虚拟出网卡、内存、CPU 等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核。 而Docker容器则是通过隔离的方式,将文件系统、进程、设备、网络等资源进行隔离,再对权限、CPU 资源等进行控制,最终让容器之间互不影响,容器无法影响宿主机。 容器与宿主机共享内核、文件系统、硬件等资源。
2、性能与损耗
与虚拟机相比,容器资源损耗要少。同样的宿主机下,能够建立容器的数量要比虚拟机多。 但是,虚拟机的安全性要比容器稍好,要从虚拟机攻破到宿主机或其他虚拟机,需要先攻破 Hypervisor 层,这是极其困难的。 而 docker 容器与宿主机共享内核、文件系统等资源,更有可能对其他容器、宿主机产生影响。
3、其他区别
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 相当于宿主机的进程,几乎无损耗 | 需要通过虚拟机管理程序对宿主机资源虚拟访问,损耗 20-50%左右 |
性能 | 接近原生 | 弱于物理机 |
系统支持单机容量 | 上千个容器 | 几十个虚拟机 |
隔离性 | 通过namespace实现资源隔离,通过cgroup实 |