名校课程推荐 | MIT《CS 实用工具课程》-虚拟机和容器

虚拟机和容器

虚拟机

虚拟机是对计算机进行模拟。你可以为客户虚拟机配置某个操作系统和配置,并在不影响主机环境的情况下使用它。  

在本课程中,你可以使用虚拟机来试验操作系统、软件和配置,而不会有任何风险,不会影响用户的主要开发环境。  

总体来说,虚拟机有很多用途。通常在特定操作系统上使用虚拟机来运行特定的软件(例如,在Linux上使用Windows虚拟机来运行Windows特定的软件)。虚拟机也经常被用来试验潜在的恶意软件。

有用特性

  • 隔离:虚拟机监视器(Hypervisor)将客户机和宿主机隔离开来,这样你就可以相对安全地使用虚拟机运行有bug或不受信的软件。
  • 快照:你可以获取虚拟机的“快照”,捕获整个机器状态(磁盘、内存等),对机器进行改动,然后恢复到之前的状态。 这对于测试潜在的破坏性行为非常有用。

劣势

虚拟机通常比在计算机上直接运行速度要慢,所以对于某些应用来说虚拟机可能并不合适。

设置

  • 资源:和宿主机资源共享;在分配物理资源时要关注到这点。
  • 联网:有多个选项,默认NAT在大多数情况下应该都适用。
  • 客户插件:许多虚拟机监视器可以在客户机上安装软件,以支持与主机系统更好进行集成。如果可以,你可以使用此设置。

资源

  • 虚拟机监视器(Hypervisor)
- [VirtualBox](https://www.virtualbox.org/)(开源)


- [Virt-manager](https://virt-manager.org/) (开源, 管理 KVM虚拟机和LXC容器)


- [VMWare](https://www.vmware.com/)(商用, [MIT学生](https://ist.mit.edu/vmware-fusion)可以从IS&T免费使用)

如果你对主流的VMM/VM已经有所了解,那你可能想要了解更多关于如何通过命令行友好的方式实现这一点。一种选择是libvirt工具包,它允许你管理多个不同的VMM。

练习

  1. 下载并安装一个VMM;
  1. 创建一个新的虚拟机并安装一个Linux发行版 (如Debian);
  1. 尝试快照。尝试你想进行的操作,比如运行sudo rm -rf --no-preserve-root /,看是否能轻松恢复;
  1. 读取fork-bomb(:(){:|:&};:),并在VM上运行它,看看资源隔离(CPU,内存)是否有效。
  1. 安装客户插件,尝试不同的窗口模式、文件共享和其他功能。

容器(Container)

虚拟机相对来说是重型的,如果你想以自动化的方式启动机器,要怎么做?这就要用到容器(Container)。

  • Amazon Firecracker
  • Docker
  • rkt
  • lxc

容器主要汇编了各种Linux安全特性,如虚拟文件系统、虚拟网络接口、chroot、虚拟内存技术等,它们一起构成了虚拟化技术。

在安全或隔离方面容器不如虚拟机,但相当接近,而且越来越好。通常性能更高,启动速度更快,但并非总是这样。

性能的提升是因为:与运行操作系统的完整副本的虚拟机不同,容器与主机共享linux内核。但是注意,如果你要在Windows/macOS上运行linux容器,那么linux虚拟机将需要作为两者之间的中间层活动。

Containers-and-VMs

Docker容器vs虚拟机(来源:blog.docker.com)

如果你想在一个标准化的设置中运行自动化任务,容器就很方便:

  • 构建系统
  • 开发环境
  • 预包装的服务器
  • 运行不受信的程序
- 学生提交评分


- (部分)云计算
  • 持续集成
- Travis CI


- GitHub Actions

此外,像Docker这样的容器软件也被广泛用作依赖地狱(dependency hell)的解决方案。如果一台机器需要运行多个有冲突依赖关系的服务,可以使用容器将它们隔离开来。

通常,你要编写一个文件定义如何构建你的容器。首先使用一个最小的基础image(如Alpine Linux),然后运行一系列命令来设置所需环境(安装包、复制文件、构建、编写配置文件等)。通常,也有一种方法来指定可用的任何外部端口,以及指定在容器启动时应该运行什么命令的入口点(比如分级脚本)。

类似于GitHub这类代码存储库网站,也有一些容器存储库网站(如DockerHub),其中许多软件服务都有可以轻松部署的预构建image。

练习

  1. 选择一个容器软件(Docker,LXC等)并安装一个简单的Linux image。尝试通过SSHing进入。
  1. 搜索并下载一个主流web服务器(nginx,apache等)的预构建容器image
客服