为什么 Docker 虚拟化比 VM 更快

Mis*_*r_L 2 virtual-machine docker

据我了解,VM 使用硬件虚拟化,而 docker 使用软件虚拟化,因此具有更好的性能(例如,我在 Windows 机器上运行 Dockerized Linux)。但操作系统虚拟化比硬件虚拟化更快的原因究竟是什么?

Ric*_*nco 7

Docker 不做虚拟化。它使用内核命名空间来实现类似 chroot 的效果,不仅针对根文件系统,还针对进程信息(PID 命名空间)、挂载点、网络、IPC(共享内存)、UTS 信息(主机名)和用户 ID。

容器与主机共享内核。为了安全,Docker 使用 AppArmor/SELinux、Linux 功能seccomp来过滤系统调用。控制组(称为cgroups)用于进程记帐和对资源施加限制。

  • 您说容器与主机共享内核,但是如果 docker 映像包含与主机不同的操作系统,它们如何共享内核?(例如 Windows 主机上的 Dockerized Linux) (2认同)
  • @Mister_L 如果您在 Debian 系统上运行 CentOS 容器,它运行的是 CentOS 二进制文件(和库),而不是 CentOS 提供的内核。Debian 系统上的任何容器都将使用该系统上安装的内核。 (2认同)

tgo*_*gos 7

Docker 与虚拟化无关。这是关于容器化(如何在隔离环境中运行进程)。

这意味着如果不使用某种虚拟化(Virtualbox、Hyper-v...),您就无法在 Windows 上运行 Linux 容器,也无法在 Linux 上运行Windows 容器。在开发时在笔记本电脑上执行此操作是可以的,但在生产中您会为您的容器选择合适的架构。

什么是容器?

来自系统管理员容器指南

传统的 Linux 容器实际上只是Linux 系统上的普通进程。这些进程组使用资源限制与其他进程组隔离:

  • (对照组 [ cgroups ]),
  • Linux 安全约束(Unix 权限、功能、SELinux、AppArmor、seccomp 等),以及
  • 命名空间(PID、网络、挂载等)。

docker ...使用 linux 命令手动设置所有这些(网络命名空间、iptable-rules 等)会很棘手,所以当你键入命令并且事情在幕后发生时,docker-daemon 的工作就是完成这些...

关于速度...

首先,由于引入了复杂性,容器的速度可能不如直接在主机网络堆栈上运行进程快。例如,请参阅:在 docker 容器中运行 nginx 的性能问题

但是,他们会为您提供速度。如何?:

  • 容器不是完整的操作系统(基础镜像尺寸较小
  • 容器遵循微服务的理念,“做一件事,把它做好”。这意味着您不必像使用虚拟机那样将所有内容放入容器中。这称为关注点分离,它会产生更轻量级的应用程序组件。它还为开发人员提供了速度,因为不同的团队可以使用不同的编程语言和框架分别处理他们的组件(其他人也将其称为开发人员速度)。
  • 图像层:docker 有一种将图像分割为层的内部方法,当您构建新图像时,可以重用层。这为您提供了良好的部署速度(考虑一下这在回滚的情况下有多么有用)

关于 Windows 容器

容器是“linux”的东西,但容器化浪潮也对 Windows 领域产生了影响。一开始docker-toolbox是使用 Virtualbox 在 Linux 虚拟机上运行容器。后来docker-for-windows引入并提供了直接在主机或hyper-v. 如果您访问Windows 容器类型,您可以找到更多信息。