本来由于容器是共享操作系统内核的,所以在Windows系统上是不能运行Linux容器的,反之亦然。现在主流的docker编排工具基本上都能支持Windows和Linux混合部署。例如Kubernetes,下图所示Kubernetes群集就有Windows节点。
如果是在Windows环境里运行Windows容器,则可以看到若干运行在同一个会话里的进程,这些就是共享同一个容器的进程。下图所示的进程都运行在会话25。
Windows的容器联合挂载文件系统,类似Linux容器的AUFS等,采用分层的镜像层(Image Layer),最顶层的Layer可读可写,叫做sandbox layer,是一个sandbox.vhdx文件。多层的Base Image和sandbox.vhdx,在容器内部看来,是一个统一的、联合的文件系统
而在Windows里运行Linux容器,则采用Hyper-V容器的功能,这样每个容器都有自己的独立内核(采用docker的LinuxKit),Hyper-V容器的安全性会更高,因为这是Hypervisor级别的隔离。
要在Windows 10里启用这个,最简单的方法(请确保更新到Build 17205或者以后版本),就是到以下地址下载安装最新的docker for Windows(请到网上搜索,并选择下载edge分支)。
https://download.docker.com/win/edge/Docker%20for%20Windows%20Installer.exe
然后确保选择Enabe Linux container on Windows。根据屏幕提示完成必须的步骤即可。
当运行以下命令时,即可在Windows 10里创建Linux容器:
docker run -it ubuntu
前面说过,这里的Linux容器是Hyper-V容器,其实质是启动了一个最小化的Linux虚拟机,其内核和引导文件位于C:\Program Files\Linux Containers,其下有两个文件,bootx64.efi和initrd。
然后到本地的镜像缓存里尝试获取ubuntu镜像(没有的话就到docker hub里pull下来),并且自动创建Linux容器,就Windows容器一样,其顶层的可读可写镜像层也叫做sandbox.vhdx。
如果在Bash命令行提示符下输入cat /etc/issue,即可看到Linux容器的OS版本号为Ubuntu 16.04.3 LTS。
如果用Process Explorer查看,这个Hyper-V容器在宿主机上的进程是vmwp.exe,这就是Hyper-V虚拟机的进程。容器里的进程都运行在这个最小化的Hyper-V虚拟机里,在宿主机上,我们看不到这个Ubuntu容器里的进程。
查看该vmwp进程的打开句柄,可以看到类似以下的复杂路径,如下图所示:
\device\STORVSP\GUID\{ guid}\C:\programdata\Docker\lcow\lcow\aaa5f623879acf5818bffbeca7d88b62d4f262e957d2c4de99591c3b04144df1\sandbox.vhdx"
其中的sandbox.vhdx(底部的红色方框),就是Ubuntu容器的顶层可读可写的镜像层,所有修改的内容都会保存在这个层里(通过commit即可固化下来),以实现代码的快速迭代。从图中可以看出,该sandbox.vhdx是通过Hyper-V虚拟机的VMBus上的SMB共享来访问的!
而绿色方框的部分,就是Ubuntu镜像的多个Base Image层,这些Base Image由不同的layer.vhd文件组成。这些Base Image和顶层的sandbox.vhdx,会通过联合挂载文件系统,在容器内部表现为单一的完整文件系统。
如果进入sandbox.vhdx的父目录,也就是以下
C:\programdata\Docker\lcow\lcow\aaa5f623879acf5818bffbeca7d88b62d4f262e957d2c4de99591c3b04144df1\
其中的aaa5f623879acf5818bffbeca7d88b62d4f262e957d2c4de99591c3b04144df1就是该ubuntu容器的容器ID。
该父目录下有个layerchain.json文件,内容如下:
["C:\\ProgramData\\Docker\\lcow\\lcow\\64852ed176c71c1c978edeca7c3a2d36dd3469fd885562757fbb8d415f091aa2","C:\\ProgramData\\Docker\\lcow\\lcow\\0ad7e65e29f70df2d5061c134fdc705df4ac5a8f53707d0b5982994b5e5da234","C:\\ProgramData\\Docker\\lcow\\lcow\\346fdaa754a283a20b177d0e80f5a57e876cd5ab300cdc30ba46e65d98985313","C:\\ProgramData\\Docker\\lcow\\lcow\\edacd457ab8cae69dc2b6afb30a71be6aabc4d68ea5d6c25abcea4b4487db19f","C:\\ProgramData\\Docker\\lcow\\lcow\\46851d43fee26a5d13ab3fa5262b3a2600ff71677ce3f14645e09b4f72cc4b6a"]
该layerchain.json文件显示的就是sandbox.vhdx文件所依赖的容器Base Image的路径,一共有5个文件,正好和前面截图的绿色方框的5个文件相匹配。
而这就是Windows的威力,今后可以设想一下,底层的容器群集可以都是Windows Server 2016系统,既可以运行Windows容器,又是Linux容器,而且还支持docker的商业版,从操作系统到docker,都有商业化保障!
没有参加大会的朋友,不用担心,盆盆已经把原版的PPT以及相关的演示视频上传到网上,您可以点击下方的阅读原文,就能下载。