前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >水火交融-Windows上的Linux容器

水火交融-Windows上的Linux容器

作者头像
盆盆
发布2019-04-24 14:08:56
2.2K0
发布2019-04-24 14:08:56
举报
文章被收录于专栏:华来四Azure混合云

在上周刚刚过去的微软技术暨生态大会,盆盆分享了有关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,都有商业化保障!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 华来四Azure混合云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档