物理机、虚拟机、容器的比较(二)

本文介绍了容器技术,特别是Docker的工作原理。Docker利用Linux内核特性实现进程隔离,提供轻量级虚拟化解决方案。文章详细阐述了Docker镜像、仓库及容器的概念,并对比了容器与传统虚拟机的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一章,介绍了虚拟化技术的优点,下面介绍容器技术。

(一)容器

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器

(二)容器的概念

一般来说,虚拟机都会有自己的kernel,自己的硬件,这样虚拟机启动的时候需要先做开机自检,启动kernel,启动用户进程等一系列行为,虽然现在电脑运行速度挺快,但是这一系列检查做下来,也要几十秒,也就是虚拟机需要几十秒来启动。
重新来理解虚拟机的概念,计算机科学家发现其实我们创建虚拟机也不一定需要模拟硬件的输入和输出,假如宿主机和虚拟机他们的kernel是一致的,就不用做硬件输入输出的搬运工了,只需要做kernel输入输出的搬运工即可,为了有别于硬件层面的虚拟机,这种虚拟机被命名为 操作系统层虚拟化:Operating-system-level virtualization也被叫做容器

让我们来回顾虚拟机的概念,在虚拟机的系统中,虚拟机认为自己有独立的文件系统,进程系统,内存系统,等等一系列,所以为了让容器接近虚拟机,也需要有独立的文件系统,进程系统,内存系统,等等一系列,为了达成这一目的,主机系统采用的办法是:只要隔离容器不让它看到主机的文件系统,进程系统,内存系统,等等一系列,那么容器系统就是一个接近虚拟机的玩意了

(三)容器框架

Docker使用一个客户端服务器架构。Docker客户端和Docker守护进程交流,Docker守护进程做非常重要的工作,构建,运行和分发你的Docker容器。Docker客户端和守护进程可以运行在同样的系统上,或者是你可以连接一个Docker客户端到一个远程Docker守护进程中。Docker客户端和守护进程通过sockets或通过RESTful API进行沟通交流。


图1 容器架构

(四)容器内部

要理解 Docker 内部构建,需要理解以下三种部件:
Docker 镜像 - Docker images
Docker 仓库 - Docker registeries
Docker 容器 - Docker containers
1.Docker 镜像

Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新 的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。
2.Docker 仓库
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。
3.Docker 容器

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。

(五)为什么使用容器

1.更高效的利用系统资源
2.更快速的启动时间
3.一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现这类问题。
4.持续交付和部署
5.更轻松的迁移

6.更轻松的维护和扩展

(六)容器与传统虚拟机比较

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

图2 传统虚拟机


图3 容器


图4 传统虚拟机与容器对比


### 使用 VirtualBox 将物理机转换为虚拟机 #### 物理机虚拟机(P2V)的概念 物理机虚拟机 (P2V, Physical-to-Virtual) 是指将现有的物理计算机上的操作系统及其应用程序迁移到虚拟环境中运行的过程。此过程允许保留原始系统的全部功能,但在虚拟化平台上执行。 #### 准备工作 为了成功完成 P2V 转换,在开始之前需准备如下事项: - 安装有 Oracle VM VirtualBox 的目标机器[^1]。 - 确认有足够的磁盘空间来容纳新创建的虚拟硬盘文件。 - 获取并准备好要迁移的操作系统映像或备份工具。 #### 方法一:通过第三方软件辅助迁移 一种常见的方式是利用专门设计用于此类任务的应用程序来进行迁移操作。这些应用可以简化整个流程,并提供额外的功能如自定义分区布局等。然而这种方法通常涉及商业产品,可能不适合所有人。 另一种更为经济实惠的选择是从零重新部署一个新的虚拟环境然后手动复制数据过去;虽然耗时较长但也更加灵活可控。 #### 方法:基于克隆技术的手动迁移 对于熟悉 Linux 命令行界面和技术细节较高的用户来说,可以直接采用命令行方式借助 `dd` 工具配合 SSH 或者其他远程连接手段实现跨平台的数据镜像转移。这种方式要求源端和目的端都能够正常启动进入最小化的 shell 接口以便于执行必要的指令集。 具体步骤包括但不限于: 1. 创建新的 VDI 文件作为未来虚拟机的基础存储介质; 2. 利用网络传输机制(例如 SCP/SFTP),把实际硬件驱动器的内容逐位读取并通过管道传递给远端等待写入的新容器内; 3. 修改引导加载程序配置使得能够在模拟环境下顺利开机; 4. 配置网络接口参数确保内外部通信畅通无阻[^2]。 需要注意的是上述两种方案都存在一定的风险性和复杂度,建议仅当具备充分的技术背景知识后再尝试实施。此外还应该提前做好完整的系统快照或者定期增量备份以防意外情况发生造成不可逆损失。 ```bash # 示例代码片段展示如何使用 dd 和 ssh 进行低级磁盘拷贝 ssh user@source-machine "sudo dd if=/dev/sda bs=64K | gzip -1 -" | gunzip - | sudo dd of=/path/to/new.vdi bs=64K ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值