Docker 和虚拟机比较 - 转载

警告
本文最后更新于 2023-12-17,文中内容可能已过时。

Docker 和虚拟机比较 - 转载

Docker

概述

官网:Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

下图显示了 Docker 和 VM 之间的差别:

  • 虚拟机携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker 是不携带操作系统的,所以 Docker 的应用就非常的轻巧。

  • 也因为 Docker 没有 OS,因此 Windows 的 Docker 镜像是不能在 Linux 上跑的。arm 的镜像也不能在 X86 上跑。但是不同的 Linux 发行版由于内核是兼容的,是可以运行的(除非应用依赖了一些发行版相关的东西)。

在线安装 Docker:

1
sudo apt install docker docker.io

离线安装 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 容器管理器。

官网:Linux Containers - LXD - Has been moved to Canonical

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 之类的没用过,现在估计也没什么人用了吧。

现在主要是以下三个选择:

  1. VMware。商业收费软件。有免费版本的 VMware Player,但该版本不可创建虚拟机,只可使用别人已经建好的虚拟机。

  2. VirtualBox。开源免费软件。

  3. Qemu。Qemu 的易用性不佳,作为使用的话,能不用就不用了。但其不仅开源,而且支持的架构也很多,有的时候往往是唯一之选。作为研究学习来说,这个是首选。

这里主要讨论前两者的选择。

关于 KVM 虚拟化的操作,请看《Linux 虚拟化技术 - KVM》

VMware 由于是收费软件之故,因此用户的软件升级是个大问题。(土豪除外,有钱的话,这个就不是事了。)而旧的软件,往往对新的 Linux 发行版的支持较差。很多情况下,VMware Tool 因为这个原因总是无法完美运行。严重影响了软件的易用性。

反之,VirtualBox 就没有这些问题。虽然比较同期的 VMware 来说,VirtualBox 的性能略逊。但是一般来说,科技行业里领先半年就已经是巨大的优势了。我相信现在的 VirtualBox,无论如何也不会弱于两年前的 VMware。

0%