« 上一篇下一篇 »

Docker Desktop for Windows(以wsl2为后端) 简要分析

前置知识1: linux启动过程是内核+boot文件系统先启动,等内核加载好后,卸载boot文件系统,加载根文件系统(包含各种发行版套件)

前置知识2: linux内核和linux操作系统其实是有区别的,对于一个完整的linux操作系统来说,其实是由linux内核+发行版套件构成

前置知识3: 一般来说,虚拟机分成核心和管理软件两部分,管理软件可以管理虚拟硬件,镜像等等

前置知识4:
wsl1: 是在应用层模拟了POSIX API行为,在应用层看上去像是linux,实际不是真的linux
wsl2: (用的Hyper-V核心,和微软定制的linux内核),是真的linux


常规的虚拟机模式:
windows -> VirtualBox/vmware/Hyper-V --> (linux内核+boot文件系统+linux根文件系统)
常规情况下,你在虚拟机上安装系统,比如通过iso镜像安装系统,这个iso镜像里面就包括了(linux内核+boot文件系统+linux根文件系统)

wsl2模式:
windows -> (Hyper-V核心+微软定制linux内核+微软定制boot文件系统) --> linux根文件系统(微软定制,包含各种发行套件)
可以将wsl2看成是微软高度优化过的一种linux专用虚拟机,wsl2是(Hyper-V核心+微软定制linux内核+微软定制boot文件系统)组合构成,在wsl2上安装系统,比如安装Ubuntu,其实只是安装包含Ubuntu套件的根文件系统而已,如下:
windows -> wsl2(Hyper-V核心+微软定制linux内核+微软定制boot文件系统) -> linux根文件系统(包含ubuntu套件)

可以用如下命令查询发行版的版本:
cat /etc/issue
Ubuntu 22.04.1 LTS \n \l


Docker Desktop for Windows:
windows -> wsl2(Hyper-V核心+微软定制linux内核+微软定制boot文件系统) -> linux根文件系统(包含基于LinuxKit构建的Docker套件)

可以用如下命令查询发行版的版本:
cat /etc/issue

Welcome to LinuxKit

## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
{ / ===-
\______ O __/
\ \ __/
\____\_______/



可以看到,上面两个例子中的linux操作系统是共享一个内核的,也就是wsl2中微软定制的linux内核,可以分别在两个系统的命令行中用命令查看,都是同样的输出:
cat /proc/version
Linux version 5.15.90.1-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220) #1 SMP Fri Jan 27 02:56:13 UTC 2023


总结:
1.安装wsl2,本质是启用Hyper-V核心和安装微软定制的linux内核和boot文件系统
2.在wsl2上安装Ubuntu,本质是下载安装包含Ubuntu发行版内容的linux根文件系统
3.安装Docker Desktop for Windows,本质是安装包含LinuxKit定制的docker容器套件的linux根文件系统

当你在windows下运行容器:
windows(真机) -> wsl2(Hyper-V核心+微软定制linux内核+微软定制boot文件系统) -> linux根文件系统(基于LinuxKit构建的Docker套件) -> 各种容器应用

当你在windows下运行Ubuntu,并在Ubuntu下管理容器:
windows(真机) -> wsl2(Hyper-V核心+微软定制linux内核+微软定制boot文件系统) -> linux根文件系统(包含ubuntu套件) -> docker客户端 -> 虚拟机间通讯

此时,你的windows系统上实际至少跑了2台虚拟机!