本篇笔记比较关注概念的辨析,大量参考了AI输出的内容,细节之处可能有些许错误
模拟一个完整的操作系统(也就是虚拟机)
要实现虚拟机,首先需要硬件支持虚拟化
内存虚拟化、IO设备虚拟化、网络虚拟化等,也要同步进行
KVM(Linux 内核)、Microsoft Hyper-V、VMware ESXi
[硬件]
└─ Linux 内核 (含 KVM)
└─ QEMU/管理层进程
└─ 来宾OS(各虚拟机)
[硬件]
└─ Hyper-V hypervisor
├─ 父分区(Windows,用来管理)
└─ 子分区(各虚拟机)
[硬件]
└─ ESXi (VMkernel)
└─ 各虚拟机(集中管理通常用 vCenter)
# Type-1(裸金属)示意: [硬件] ── Hypervisor ── [VM1][VM2][VM3] (每台VM里都有各自的内核/OS) # Type-2(托管型)示意: [硬件] ── 宿主OS ──(应用形式的) Hypervisor ── [VM1][VM2]
容器化实际上不需要硬件支持虚拟化,容器必须共享宿主机的“同一种内核”。
因为:容器实际上只是一个特殊进程,容器共享内核,本质是“进程级隔离”,而不是硬件虚拟化。
一般来说,我们跑的都是基于Linux的容器,所以一般需要一个Linux内核(也就是说,宿主机需要是Linux)。
OCI(Open Container Initiative):一种容器的标准
几乎是容器化的标准,非常常见和有名。
Docker是如何运行容器的?AI:不虚拟硬件。靠 namespaces 隔离视图(PID/网络/挂载等),cgroups 管资源,LSM/seccomp 做系统调用限制,overlayfs 管镜像分层;containerd→runc 用 clone/unshare/chroot 在同一个 宿主内核 下创建受限进程。
Docker是分为「客户端」和「服务器」两个部分的,服务器就是Docker的守护进程Docker Daemon。
docker CLI > Docker Daemon (dockerd) > containerd > runc(OCI 运行时)
Podman 是一个开源的容器引擎,用来运行、管理和构建容器与容器镜像。它的全称是 Pod Manager,由 Red Hat 维护,设计理念和 Docker 类似。但是无守护进程,直接通过 libpod 调用 runc/crun。
# 本地用 Podman Podman CLI > libpod > conmon > runc/crun # 在 Kubernetes 里 kubelet > CRI-O > conmon > runc/crun
CRI (Container Runtime Interface) 是 Kubernetes 定义的一套 容器运行时标准接口。
Kubernetes(调度/服务发现/扩缩容/滚更)几乎就等于行业标准。
Docker 和 Podman 都能与 Kubernetes(K8s)一起使用(或者说它们的底层都和 K8s 兼容,而不是直接兼容)。
K8s 标准化后,要求运行时符合 CRI(Container Runtime Interface),而 Docker 本身并不是原生 CRI 实现。于是Kubernetes 不再直接支持 Docker 作为运行时。(如果还想在 K8s 上用 Docker,需要借助 cri-dockerd 这个兼容层。)在生产环境中,更常见的是使用 containerd(Docker的底层)或 CRI-O(Podman的底层)作为 K8s 运行时。
AI:
devcontainer(全名 Development Container)是一套“可复现的开发环境”规范与配置。你把项目需要的系统依赖、语言运行时、工具链、编辑器设置等都写进一个配置里(通常放在仓库根目录的 .devcontainer/),支持的工具(VS Code Dev Containers、GitHub Codespaces 等)就能据此构建并启动一个容器,然后把你的编辑器“接入”到这个容器里进行开发。
Dockerfile 只描述“容器里装什么”;devcontainer 还描述“开发体验”:编辑器扩展与设置、端口转发、工作区挂载、首次初始化命令、非 root 用户、预置特性(Features)等。
起源在微软/VS Code 团队,并由微软主导开源维护(规范与站点、代码仓库都在微软版权或旗下组织名下,许可证为 CC-BY 与 MIT)。同时它是开放的,并被多方实现/支持(如 GitHub Codespaces、Visual Studio、IntelliJ 早期支持、Gitpod、CodeSandbox、DevPod 等)。
在Windows上跑 Linux 容器(最常见),你需要一个真正的 Linux 内核,而 Windows 自己不是 Linux 内核,所以在 Windows 上跑“Linux 容器”就得先弄来一个 Linux 内核,这一步通常就要借助 Hyper-V(或基于 Hyper-V 的 WSL2)。Docker Desktop 早年用 LinuxKit 小虚机(Hyper-V),现在主流是 WSL2 后端。WSL2 自己就是在 Hyper-V 虚拟化平台上跑的一个轻量 VM,里面有 Linux 内核。于是:Windows →(Hyper-V 平台)→ WSL2/Linux 内核 → Docker 守护进程 → Linux 容器进程。
容器仍是“进程”,只是这些进程运行在 Linux 内核(虚机里) 上,而不是直接在 Windows 内核上。