他们都很不一样。Docker是轻量级的,使用LXC/libcontainer(它依赖于内核名称空间和cGroup),并且没有机器/硬件仿真,比如hypervisor、KVM。它们很重。
Docker和LXC更多用于沙箱、集装箱化和资源隔离。它使用主机操作系统(目前只有Linux内核)的克隆API,为IPC、NS(装载)、网络、PID、UTS等提供名称空间。
内存、I/O、CPU等呢。?这是使用cgroups控制的,在cgroups中,您可以创建具有特定资源(CPU、内存等)规格/限制的组,并将您的进程放在其中。在LXC之上,Docker提供了一个存储后端(
http://www.projectatomic.io/docs/filesystems/
)例如,union mount filesystem,您可以在其中添加层,并在不同的装载命名空间之间共享层。
这是一个强大的功能,基本图像通常是只读的,只有当容器修改层中的内容时,它才会将内容写入读写分区(也称为写时复制)。它还提供了许多其他包装,比如注册和图像版本控制。
对于普通的LXC,您需要附带一些rootfs或共享rootfs,当共享时,这些更改会反映在其他容器上。由于这些新增功能,Docker比LXC更受欢迎。LXC在嵌入式环境中很受欢迎,用于围绕暴露于网络和UI等外部实体的进程实现安全性。Docker在云多租户环境中很受欢迎,因为在云多租户环境中,需要一致的生产环境。
普通虚拟机(例如VirtualBox和VMware)使用虚拟机监控程序,相关技术要么具有专用固件,成为第一个操作系统(主机操作系统或来宾操作系统0)的第一层,要么具有在主机操作系统上运行的软件,以向来宾操作系统提供CPU、USB/附件、内存、网络等硬件仿真。VM(截至2015年)在高安全性多租户环境中仍然很流行。
Docker/LXC几乎可以在任何便宜的硬件上运行(只要有更新的内核,内存小于1GB也可以),而普通虚拟机至少需要2GB的内存等,才能用它做任何有意义的事情。但在Windows(截至2014年11月)等操作系统中,主机操作系统上的Docker支持不可用,在Windows、Linux和Mac上可能会运行多种类型的虚拟机。
这是docker/rightscale的一张照片: