水火交融-Windows上的Linux容器

在上周刚刚过去的微软技术暨生态大会,盆盆分享了有关Azure Stack和容器的话题。其中介绍的一门微软最新的黑科技,获得了大家的广泛兴趣,这就是直接可以在Windows里运行的Linux容器!接下来盆盆就用这篇小文章来聊聊这个技术吧!

本来由于容器是共享操作系统内核的,所以在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,都有商业化保障!

本文分享自微信公众号 - 华来四Azure混合云(sysinternal)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-11-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

docker安装mongodb并备份

官方镜像地址: https://hub.docker.com/_/mongo?tab=description

22340
来自专栏cmazxiaoma的架构师之路

Docker环境搭建集成tomcat

创建一个新的容器并启动tomcat,这里深究一下docker create,docker start,docker run

15930
来自专栏运维

全链路监控工具Pinpoint1.8.2部署

简介 Pinpoint是一款全链路分析工具,提供了无侵入式的调用链监控、方法执行详情查看、应用状态信息监控等功能。基于GoogleDapper论文进行的实现,与...

34520
来自专栏finleyMa

Jenkins Free Style 结合 Github 实现持续集成

Github 提交代码 -> 触发WebHook -> 触发Jenkins 执行 build

9720
来自专栏张善友的专栏

结合使用 Draft 与 Tencent Kubernetes Engine (TKE)

Draft 是一种开源工具,有助于在 Kubernetes 群集中打包和部署应用程序容器,让你专注于开发周期 - 专注开发的“内部循环”。 在开发代码期间,但尚...

9K70
来自专栏面朝大海春暖花开

在docker中运行mysql实例

Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。下图是容器跟虚拟机的对比

11410
来自专栏magicodes

Docker最全教程之使用 Visual Studio Code玩转Docker(二十)

VS Code是一个年轻的编辑器,但是确实是非常犀利。通过本篇,老司机带你使用VS Code玩转Docker——相信阅读本篇之后,无论是初学者还是老手,都可以非...

30520
来自专栏cmazxiaoma的架构师之路

Jenkins+Docker实现CI/CD

看到这一张图,我们就知道践行持续集成(CI)、持续部署(CD),可以简化工作流程,提高工作效率。

36340
来自专栏阿dai_linux

Docker容器虚拟化(一)—安装与镜像管理 原

Docker就是一个Container的管理工具,Container就是一个更轻量级的虚拟机,但是这个虚拟机没有操作系统和设备(操作系统是共享的)。

17740
来自专栏Ryan Miao

Docker构建Yapi镜像并部署

YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi ...

57020

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励