part 1 docker官方给的docker for windows
Getting Started with Docker for Windows介绍了如何在windows上使用docker。
首先环境需要64bit Windows 10 Pro,然后需要开启HyperV服务。
然后下载安装包就可以了。
安装过程还是相当顺利。一路下一步就OK。
然后就可以开始体验我们的windows下的容器服务。
官方给的例子使用了ubuntu镜像。
这里一个大大的疑问涌上心头, windows容器服务已经可以直接跑Linux的容器镜像了?
带着好奇心,启动了ubuntu镜像。
<code class="hljs applescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">docker <span class="hljs-command" style="box-sizing: border-box;">run</span> -<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">it</span> ubuntu bash</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
进入镜像不免想看看,到底是什么情况。uname -a 来查看下内核版本。
4.4.5的内核出现在了眼前。难道其实windows上跑的容器,仅仅是跑在一个虚拟机里面。
打开HyperV的管理器,可以看到,的确启动了一台虚拟机。
该虚拟机使用了MobyLinuxVM.vhdx文件作为了数据盘,用来存储docker image文件。mobylinux.iso作为启动盘
来加载linux系统。
好吧。这样原理就明朗了。使用HyperV虚拟机运行了一个定制版本的linux,
然后windows装了docker来跟这个定制版的linux进行通信,达到了对容器使用的目的。使用的镜像就是linux的镜像。
原理明朗了,但是有一些莫名的失望,windows上的容器是这么使用的吗?那windows原生程序怎么跑呢?
使用
<code class="hljs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">docker search microsoft</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
有些惊喜的发现
<code class="hljs r has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">NAME DESCRIPTION STARS OFFICIAL AUTOM ATED microsoft/aspnet ASP.NET is an open <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">source</span> server-side Web <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">464</span> [OK] microsoft/dotnet Official images <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> working with .NET Core... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">207</span> [OK] mono Mono is an open <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">source</span> implementation of M... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">172</span> [OK] microsoft/azure-cli Docker image <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> Microsoft Azure Command L... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">61</span> [OK] microsoft/iis Internet Information Services (IIS) instal... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">25</span> microsoft/mssql-server-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2014</span>-express-windows Microsoft SQL Server <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2014</span> Express installe... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">23</span> microsoft/nanoserver Nano Server base OS image <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> Windows cont... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">11</span> microsoft/windowsservercore Windows Server Core base OS image <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> Wind... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span> microsoft/dotnet-preview Preview bits <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> microsoft/dotnet image <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span> [OK] microsoft/oms Monitor your containers using the Operatio... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span> [OK] microsoft/applicationinsights Application Insights <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> Docker helps you <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> [OK] microsoft/sample-nginx Nginx installed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> Windows Server Core and... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> microsoft/sample-node Node installed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> a Nano Server based cont... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> microsoft/sample-redis Redis installed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> Windows Server Core and... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> microsoft/dotnet35 <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> microsoft/sqlite SQLite installed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> a Windows Server Core <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> microsoft/sample-httpd Apache httpd installed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> Windows Server C... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> microsoft/sample-mongodb <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> microsoft/sample-mysql MySQL installed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> Windows Server Core and... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> microsoft/sample-dotnet .NET Core running <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> a Nano Server container <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> microsoft/sample-golang Go Programming Language installed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> Windo... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> microsoft/sample-python Python installed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> Windows Server Core an... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> microsoft/sample-ruby Ruby installed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> a Windows Server Core ba... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> microsoft/dotnet-nightly Preview bits of the .NET Core CLI <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> [OK] microsoft/sample-rails Ruby on Rails installed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> Windows Server <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul>
已经有了microsoft的镜像了,那么尝试下载了一个microsoft/iis的镜像。在执行
<code class="hljs applescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">docker <span class="hljs-command" style="box-sizing: border-box;">run</span> -<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">it</span> microsoft/iis cmd</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
但是报错误。提示找不到$PATH变量。
到这里,基本可以确定,这个windows镜像不是这样使用的。那么windows上的容器服务该怎么用呢。
part 2
峰回路转,google一下就能看见,在MSDN网站有专门介绍windows docker服务如何体验的。
根据windows上docker安装提示,就可以真正的体验windows的容器服务。
首先说明下,截止现在windows的容器服务还是没有正式发布的。但是作为开发人员已经可以开始进行一些工作了。
环境要求 Windows 10 预览版,需要在win10中进行更新到一个开发人员版。
然后按照文章中介绍的进行安装就可以正常启动容器。
这里说一下,注意的地方:
- 从windows docker介绍的英文版中下载的docker是1.2.0版的。这个版本存在bug,在windows上会出错。
中文版介绍页面直接下载1.3.0的是可以正常使用的。 - windows的容器需要开启HyperV服务。
- windows存在两种容器,一种是windows上的,在win2016server版中使用的是这种。一种是借助HyperV的,在win10使用的就是借助HyperV的
- 在win10中使用的容器使用了nanoserver这个镜像,这个镜像就是一个裁剪过的微缩版windows。而win2016server上直接使用的是windowsservercore镜像。
- 在win10的容器,其实还是使用HyperV的虚拟机启动了nanoserver这个镜像,然后再镜像里面运行windows程序。每一个docker容器都是一个虚拟机。
- 根据文档,在winserver中启动的容器应该类似于linux的容器,真正公用了宿主机的内核。
小结:
从windows提供容器服务可以看到,docker的本质其实应该是镜像+资源隔离。和使用容器或者虚拟机本身来说关系并不那么密切。
在windows下,为了能够启动linux的程序,还是需要借助虚拟机来做操作系统隔离。而windows本身也存在有个人版和服务器版。
由于这2个版本内核形式的不同,windows为了让个人版能够使用容器服务目前也采取了虚拟机来启动一个微缩的内核。
这一思路也许可以在linux上沿用。在linux上启动nanoserver的虚拟机,然后跑windows程序。从这个角度看,摒弃容器本身带来的性能
优越性,将其封装在虚拟机层面来提供服务可以使得容器服务真正的操作系统无关。而这对现在企业中大量 windows服务进行容器化改造也有着深远的意义。