本文讲的是在<b>Windows 10上运行Linux及Windows容器</b>【编者的话】DockerCon 2016上Docker官方发布了Docker for Windows的公开测试版本,在这一版本里,添加了对在Windows 10上运行Windows容器(包括nanoserver和servercore)、Linux容器以及两者并存的支持,本文作者就这一话题为我们展示了一些具体的实例操作并进一步分析了背后的运行机制。
但是这里面可能存在点小疑问,那便是这两种安装方式对应启动的是哪类容器。而且,在不做任何调整的情况下你将无法并排运行两个Docker引擎。
由于两个安装版本使用的是同一个默认的命名通道<code>//./pipe/docker_engine</code>,这会导致其中的一个引擎启动失败。
从Docker Windows Beta 26测试版本起,这里有一个更简单的方法来解决这个矛盾。你只需要通过MSI安装器装上Docker Windows版即可。在Docker的托盘图标上会有一个新的菜单选项支持在Linux及Windows容器间切换。

正如你在视频里所看到的那样,你不用再通过更改环境变量或是利用Docker客户端的<code>-H</code>参数来和其他的Docker引擎通信。
如果你之前还没有激活容器功能的话该安装器将会帮你激活它。为了添加这项特性,需要重启一次才能生效。
现在你可以轻松地通过点击托盘图标里的菜单栏来完成切换。
这里也提供了一个命令行工具来切换引擎。你可以打开一个PowerShell窗口然后键入:
这样它便完成了从Linux切换到Windows,反之亦然。注意按照上面展示的那样键入参数,它是大小写敏感的。
但是,如何才能做到切换工作进行过程中无需Docker客户端改用其他的命名通道或是套接字呢?
答案便是,Docker会运行一个代理进程 <code>com.docker.proxy.exe</code>,它会监听默认的命名通道<code>//./pipe/docker_engine</code>。
如果你是从Linux切换到Windows,那么Windows Docker引擎<code>dockerd.exe</code>将会启动并监听在另外的命名通道<code>//./pipe/docker_engine_windows</code>,然后发起一个新的代理进程重定向到它。
下面这张截图展示了切换前后的进程情况。大概在绿色条的中间部分我就已经完成了切换。
和MobyLinuxVM通信的<code>com.docker.proxy.exe</code>(列表里的<code>dockerd.exe</code>),正如深绿色条高亮展示的那样已然退出。
<code>dockerd.exe</code>,即Windows Docker引擎启动了,并且它还发起了一个新的和Windows Docker引擎通信的<code>com.docker.proxy.exe</code>(dockerd.exe下面)。
因此,在切换后你仍然可以用<code>docker.exe</code>客户端或者是集成在你喜爱的编辑器或IDE里的Docker插件,而无需作任何环境上的改动。
代理进程只是切换了连接到的Docker引擎而已。在这样一个切换动作完成后实际上Linux和Windows两个Docker引擎均在运行。
在体验之前我们首先得切换回Linux容器。现在我们可以在80端口上运行默认的nginx web容器:
然后再切换到Windows容器:
现在,让我们跑一些Windows容器吧。但是首先我们还得试试看Linux容器是否仍然还在运行,并且服务是否是可以访问的:
通过这个<code>start</code>命令你可以打开Edge浏览器访问一个运行在Linux容器里的Nginx自带的欢迎页面。
是的,这个Linux容器一直在跑着。
在Windows 10上你~~只能运行Nanoserver容器。而这里并没有针对Nanoserver的IIS docker镜像~~。重大更新:你可以在Windows 10上运行Nanoserver以及windowsservercore容器。
但是为了演示nanoserver容器是如何的简单,我将仍然使用下面这个例子来做讲解。那么,我们现在来创建一个属于自己的小型Node.js Web服务器。首先,我们编写一个简单的web服务应用:
在<code>app.js</code>文件里键入如下代码作为一个迷你web服务然后保存该文件。
现在我们来为这个应用构建一个Windows Docker镜像。我们另外打开一个编辑器然后通过如下命令创建<code>Dockerfile</code>:
键入下面的代码作为Dockerfile的内容。正如你所能看到的那样,只有<code>FROM</code>这一行和典型的Linux Dockerfile不太一样。它使用的是一个来自Docker Hub的Windows基础镜像。
保存该文件然后通过如下熟悉的命令来构建Docker镜像:
通过如下命令将Windows web服务跑在一个Docker容器里:
这时候你无法直接通过127.0.0.1连接到容器。但是可以使用容器的IP地址去访问。我们需要容器的ID或者名字,可以通过如下命令列出当前正在运行的容器:
然后打开浏览器输入对应容器的IP地址:
此外,从宿主机到容器的端口转发使得你在其他机器上也可以通过81端口访问Web服务。
是的,Windows容器也在处理请求了。
新版的Docker Windows测试版把两个容器世界结合在了一起,并且简化了Linux和Windows Docker镜像的构建,使得一台Windows 10机器对于两者而言均可算是一个不错的开发平台。
并且在切换到所需的Docker引擎时稍微注意一下便能发现,Linux和Windows容器可以同时在两侧运行。
<b>原文发布时间为:</b>2016-10-15
<b>本文作者:</b>吴佳兴
<b>本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。</b>
<b></b>
<b>原文标题:</b><b>在Windows 10上运行Linux及Windows容器</b>