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 | 设备访问控制 |

浙公网安备 33010602011771号