Docker 和虚拟机比较 - 转载
Docker 和虚拟机比较 - 转载
Docker
概述
官网:Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
下图显示了 Docker 和 VM 之间的差别:
-
虚拟机携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker 是不携带操作系统的,所以 Docker 的应用就非常的轻巧。
-
也因为 Docker 没有 OS,因此 Windows 的 Docker 镜像是不能在 Linux 上跑的。arm 的镜像也不能在 X86 上跑。但是不同的 Linux 发行版由于内核是兼容的,是可以运行的(除非应用依赖了一些发行版相关的东西)。
在线安装 Docker:
|
|
离线安装 Docker:安装包
VM 的分类
Type I:
Type II:
-
Type I: 直接凌驾于硬件之上,构建出多个隔离的操作系统环境
-
Type II: 依赖于宿主操作系统,在其上构建出多个隔离的操作系统环境
我们熟知的 VMware 事实上有两个产品线,一个是VMware ESXI,直接安装在裸金属(bare metal)之上,不需要额外的操作系统,属于第一类虚拟化。另一个是我们普通用户更加熟知的VMware WorkStation,属于第二类虚拟化。
让虚拟机中包含操作系统在内的程序统一运行在低权限的 Ring3 状态下,一旦虚拟机中的操作系统进行内存管理、I/O 通信、中断等操作时,执行特权指令,从而触发异常,物理机将异常派遣给 VMM,由 VMM 进行对应的模拟执行。
然而,x86 架构的 CPU 指令集中有那么一部分指令,它不是特权指令,Ring3 状态下也能够执行,但这些指令对于虚拟机来说却是敏感的,不能让它们直接执行。一旦执行,没法触发异常,VMM 也就无法介入。
VMware是将原始 CPU 指令序列翻译成经过处理后的 CPU 指令序列来执行。这被称作全虚拟化。
而QEMU则是完全模拟执行整个 CPU 指令集,更像是“解释执行”。
如果把操作系统中所有执行敏感指令的地方都改掉,改成一个接口调用(HyperCall),接口的提供方 VMM 实现对应处理,省去了捕获和模拟硬件流程等一大段工作,性能将获得大幅度提升。这就是半虚拟化,这项技术的代表就是Xen。
硬件辅助虚拟化:Intel 的 VT 系列技术和 AMD 的 AMD-v 系列技术。
VMware 是独立的第三方软件,而KVM作为一项虚拟化技术已经集成到 Linux 内核之中。KVM 技术常常搭配 QEMU 一起使用,称为KVM-QEMU架构。
不同于虚拟化技术要完整虚拟化一台计算机,容器技术更像是操作系统层面的虚拟化,它只需要虚拟出一个操作系统环境。
LXC技术就是这种方案的一个典型代表,全称是 LinuX Container,通过 Linux 内核的 Cgroups 技术和 namespace 技术的支撑,隔离操作系统文件、网络等资源,在原生操作系统上隔离出一个单独的空间,将应用程序置于其中运行,这个空间的形态上类似于一个容器将应用程序包含在其中,故取名容器技术。
LXD 是一个提供了 REST API 的 LXC 容器管理器。
Docker在 LXC 的基础上更进一步,将执行执行环境中的各个组件和依赖打包封装成独立的对象,更便于移植和部署。
超轻虚拟化将虚拟化技术的强隔离性和容器技术的轻量性进行融合,提出了一个 microVM 的概念,底层通过 KVM 虚拟化技术实现各个 microVM 的强隔离,而隔离的虚拟机中运行的是一个个精简版的微型操作系统,砍掉了大量无用的功能,专为容器设计的微型 OS。
除此虚拟 PC 之外,还有虚拟网卡(如 virtio)和虚拟交换机(如 ovs)。
有一对很知名的项目:Blue Pill 和 Red Pill (后来还有个 New Red Pill),其中蓝色药片着重于使用虚拟化技术对操作系统,安全软件,反外挂,反调试系统进行欺骗,来进行一些底层操作,而红色药片着重于识别当前是否处于被虚拟化的环境中,一些小众的分支还会尝试对虚拟化环境进行攻击,他一般常见于各种反外挂程序中。
使用
1.镜像和容器的关系,类似于类和对象的关系,它们有各自不同的 ID。
保存/加载镜像:docker save/load
保存/加载容器:docker export/import
启动镜像:docker run --name <container name> -it <image_name> /bin/bash
启动容器:docker start -i <container id>
进入已启动容器:docker attach <container id>
2.
列出镜像:docker images -a
操作镜像:docker image
列出容器:docker ps -a
3.
容器和宿主机的文件交换
从容器往宿主机 copy:
docker cp 容器id:/path_in_container /path_on_host
从宿主机往容器 copy:
docker cp /path_on_host 容器id:/path_in_container
4.
退出
exit
:退出后,会 stop 容器。
Ctrl+p Ctrl+q:退出后,容器仍然运行。
5.
映射文件夹
docker run -it -v <host path>:<docker path> <image_name> /bin/bash
查看映射 docker 容器的路径:
docker inspect container_name | grep Mounts -A 20
虚拟机比较和选择
早期如 Bochs 之类的没用过,现在估计也没什么人用了吧。
现在主要是以下三个选择:
-
VMware。商业收费软件。有免费版本的 VMware Player,但该版本不可创建虚拟机,只可使用别人已经建好的虚拟机。
-
VirtualBox。开源免费软件。
-
Qemu。Qemu 的易用性不佳,作为使用的话,能不用就不用了。但其不仅开源,而且支持的架构也很多,有的时候往往是唯一之选。作为研究学习来说,这个是首选。
这里主要讨论前两者的选择。
关于 KVM 虚拟化的操作,请看《Linux 虚拟化技术 - KVM》
VMware 由于是收费软件之故,因此用户的软件升级是个大问题。(土豪除外,有钱的话,这个就不是事了。)而旧的软件,往往对新的 Linux 发行版的支持较差。很多情况下,VMware Tool 因为这个原因总是无法完美运行。严重影响了软件的易用性。
反之,VirtualBox 就没有这些问题。虽然比较同期的 VMware 来说,VirtualBox 的性能略逊。但是一般来说,科技行业里领先半年就已经是巨大的优势了。我相信现在的 VirtualBox,无论如何也不会弱于两年前的 VMware。