原本因为容器是共享操做系统内核的,因此在Windows系统上是不能运行Linux容器的,反之亦然。如今主流的docker编排工具基本上都能支持Windows和Linux混合部署。例如Kubernetes,下图所示Kubernetes群集就有Windows节点。
docker
若是是在Windows环境里运行Windows容器,则能够看到若干运行在同一个会话里的进程,这些就是共享同一个容器的进程。下图所示的进程都运行在会话25。json
Windows的容器联合挂载文件系统,相似Linux容器的AUFS等,采用分层的镜像层(Image Layer),最顶层的Layer可读可写,叫作sandbox layer,是一个sandbox.vhdx文件。多层的Base Image和sandbox.vhdx,在容器内部看来,是一个统一的、联合的文件系统ubuntu
而在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.exeide
而后确保选择Enabe Linux container on Windows。根据屏幕提示完成必须的步骤便可。工具
当运行如下命令时,便可在Windows 10里建立Linux容器:ui
docker run -it ubuntu
spa
前面说过,这里的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以及相关的演示视频上传到网上,您能够点击下方的阅读原文,就能下载。