Docker 和虚拟机的区别是什么?
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 66w+ 字,讲解图 2896+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2300+ 小伙伴加入学习 ,欢迎点击围观
上小节中,我们了解到 Docker 是一种虚拟化技术,那么,相对于传统的虚拟机,两者之间有什么区别呢?为什么大厂流行用 Docker 呢?
虚拟机
虚拟机(Virtual Machine,简称 VM)的发展,减轻了企业对硬件资源的依赖,它将一台物理设备虚拟为多个逻辑设备,每个逻辑设备可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高设备的工作效率。
然而,传统 VM 需要安装操作系统才能执行应用程序,占用系统资源过多。多数情况下,用户只需要运行简单的应用程序,采用 VM 技术操作繁琐且造成资源浪费。倘若需要迁移应用服务程序,则需迁移整个 VM,因此企业迫切需要轻量级的虚拟化技术。
Docker
Docker 是一种轻量级的虚拟化技术,目的和虚拟机一样,都是为了创造“隔离环境”。但是它不像 VM 采用操作系统级的资源隔离,容器采用的是进程级的系统隔离。
Docker 作为创建容器的主流工具,近年来迅速发展,它的优势在于可以让开发者将企业需要的各种应用及应用依赖文件封装在 Docker 镜像文件中,然后在任何物理设备(Linux 设备或 Window 设备等)上安装运行实现虚拟化,让应用程序彻底脱离底层设备,可以在物理机之间灵活迁移部署,使运维工程师摆脱了繁琐的环境部署,极大的提高了工作效率,同时减少了部署过程中的潜在风险。
Docker 容器具有以下三大特点:
- 轻量化:一台主机上运行的多个 Docker 容器可以共享主机操作系统内核;启动迅速,只需占用很少的计算和内存资源。
- 标准开放:Docker 容器基于开放式标准,能够在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸机服务器和云在内的任何基础设施上运行。
- 安全可靠:Docker 赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台主机。
Docker VS 虚拟机 (VM)
Docker 容器和传统 VM 虚拟化技术,在技术实现上有所不同。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
下图是 VM 与 Docker 容器的逻辑组成对比:
- VM:使用 Hypervisor 提供虚拟机的运行平台,管理每个 VM 中操作系统的运行。每个 VM 都要有自己的操作系统、应用程序和必要的依赖文件等。
- Docker 容器:使用 Docker 引擎进行调度和隔离,提高了资源利用率,在相同硬件能力下可以运行更多的容器实例;每个容器拥有自己的隔离化用户空间。
Docker 的优势
优势1:能够更高效的利用系统源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker
对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
优势2:更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker
容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
优势3:一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker
的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
优势4:持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker
可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile
使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
优势5:更轻松的迁移
由于 Docker
确保了执行环境的一致性,使得应用的迁移更加容易。Docker
可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
优势6:更轻松的维护和扩展
Docker
使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker
团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
表格对比更直观
以下表格可直观了解 Docker 容器与传统 VM 方式的区别:
对比项 | Docker 容器 | 虚拟机 |
---|---|---|
隔离性 | 较弱的隔离 | 强隔离 |
启动速度 | 秒级 | 分钟级 |
镜像大小 | 一般为 MB | 一般为 GB |
运行性能(与直接部署在机器上比较) | 接近原生(损耗小于 2%) | 损耗小于 15% |
镜像可移植性 | 平台无关 | 平台相关 |
系统支持量 | 单机上支持上千个容器 | 一般几十个 |
安全性 | 1. 容器内的用户从普通用户权限提升为 root 权限,就直接具备了宿主机的 root 权限。2. 容器中没有硬件隔离,使得容器容易受到攻击。 | 1. 虚拟机租户 root 权限和主机的 root 虚拟机权限是分离的。2. 硬件隔离技术:防止虚拟机突破和宿主机交互。 |