docker和虚拟机的区别

docker与虚拟机的区别

  • 运行一个应用程序,比如一个网站

1、虚拟机的场景

  • 购买了一个物理服务器(空地)

  • 在这个空地上建立一个管理层(hypervisor),这个管理层,负责后面的建设

  • 管理层建设了几个独立的房子(虚拟机),每个房子都有自己的地基(也就是cpu,内存,操作系统的内核等)

  • 在每一个房子装置了家具,水电(安装应用依赖,配置环境),最后运行你的应用程序,就是安装了很多除了这个应用程序之外的其他东西很多

  • 优点:隔离性强,一个房子着火了(系统崩溃了),不会影响到其他的房子

  • 缺点:建设的过程慢,每个房子都占用了大量的空间(资源)

2、docker容器的场景

  • 你有一个搭建好的大楼(主机的操作系统)

  • 大楼里面有一个物业管理中心(docker 引擎)

  • 每个租户都有一个独立的公寓(容器),所有公寓都是共享大楼的地基和主体结构(共享主机内核),每个公寓之间都有锁(容器进程之间是隔离的)

  • 就是只安装这个应用程序依赖的环境,就运行这个网站

  • 优点:轻量,快速,高效,不需要为每一个租户重建一栋楼(安装操作系统等),都是共享一个物理主机内核就行了

  • 缺点:隔离性不如虚拟机,如果这个大楼(虚拟机)内核出现了问题,所有的公寓(容器)都会受到影响

3、生产环境中;

  • 在物理服务器上运行少量的虚拟机,然后在每个虚拟机内部运行大量的docker容器,既能利用虚拟机的强隔离性,又能享受到容器带来的轻量与高效
# a虚拟机运行了一个nginx服务,我还想在运行httpd服务,就需要创建一个虚拟机,麻烦

# 因此我用容器运行一个httpd服务即可,共享了虚拟机的内核资源

4、2者区别

特性 Docker容器 虚拟机(VM)
虚拟化级别 操作系统(每一个容器都相当于是一个独立的操作系统,但是这个系统又是一个比较的简单,只安装了环境需要的包)级,共享宿主机的内核 硬件级,cpu,内存等
隔离单位 隔离的是进程 隔离的是整个操作系统
架构组成 App → Docker引擎 → 主机OS → 物理服务器 App → 客户机OS → Hypervisor → 主机OS → 物理服务器
Guest OS 不需要,所有容器共享主机OS内核 需要,每个VM都有自己的完整OS(包括内核)
性能 高,几乎没有额外开销,直接调用主机内核 较低,需要通过Hypervisor虚拟化硬件,有性能损耗
启动速度 极快(秒级甚至毫秒级) 慢(分钟级)
磁盘占用 极小(通常为MB级别) 巨大(通常为GB级别)
系统资源 占用少,多个容器可共享资源 占用多,每个VM需要分配固定的资源
隔离性 进程级隔离,安全性较弱 完全隔离,安全性非常高,完全的物理隔离
可移植性 强,镜像包含了应用所有依赖,一致性极好 一般,镜像庞大,迁移较慢
部署与扩展 快速、轻松,适合微服务和DevOps 较慢、笨重,更适合传统单体应用

容器和虚拟机的细节

1、容器共享主机内核的体现

  • 查看主机内核
[root@docker docker]# uname -r 
4.18.0-553.6.1.el8.x86_64

  • 查看容器内核,发现是一样的,
[root@f4f7ee74817c /]# uname -r 
4.18.0-553.6.1.el8.x86_64

  • 系统调用流程,所有容器进程的系统调用都是直接由宿主机内核处理的
容器进程 → 系统调用 → 宿主内核 → 返回结果 → 容器进程

2、容器与容器和虚拟机之间的区别

1、进程隔离(namespace)

-容器之间的进程是隔离的,与宿主机进程也是隔离的

  • 宿主机允许一个nginx进程,pid是1000

  • 容器运行一个nginx进程,pid是2000

  • 同一个进程在不同的命名空间下面有不同的pid

  • 隔离pid


2、网络隔离(network namesapce)

  • 容器与容器之间的网络接口不同

  • 每个容器之间都有自己的独立的ip地址(容器之间网络隔离)

  • 每个容器都是自己的网络设备列表,端口等等(虚拟出来的)

  • 容器之间通信通过这个docker的虚拟网桥

  • 因此每一个容器的创建都可以比喻为一个小的操作系统,因此创建2个nginx容器,主机分别映射到8081,8082,容器里面都是映射到80端口,虽然都是80端口,但是在不同的名称空间下面,不受到影响

3、资源限制(cgroups)

  • 也就是为容器设置使用cpu和内存的额度

4、还有很多其他的

  • 文件系统隔离

  • 用户隔离

  • 主机名隔离

  • 设备隔离

5、隔离的总结

资源类型 隔离技术 具体表现
进程 PID Namespace 每个容器有独立的 PID 编号空间
网络 Network Namespace 每个容器有独立的网络设备、IP、端口
文件系统 Mount Namespace 每个容器有独立的文件系统视图
用户 User Namespace 用户ID可以重新映射
主机名 UTS Namespace 每个容器可以有自己的主机名
IPC IPC Namespace 进程间通信隔离
CPU/内存 cgroups 资源使用限制
设备 Device Namespace 设备访问控制
posted @ 2025-11-13 22:44  乔的港口  阅读(8)  评论(0)    收藏  举报