在Windows 10上运行Linux及Windows容器

   2016-10-17 0
核心提示:在西雅图举办的DockerCon 2016上,Docker官方发布了Docker Windows的公开测试版本。在这一版本里,你能够以一种非常简便的方式在安装了Hyper-V的Windows 10专业版上通过Docker运行Linux容器。在一段时间内这里会同时存在 一个稳定版本以及一个测试版本渠道 以

在西雅图举办的DockerCon 2016上,Docker官方发布了Docker Windows的公开测试版本。在这一版本里,你能够以一种非常简便的方式在安装了Hyper-V的Windows 10专业版上通过Docker运行Linux容器。在一段时间内这里会同时存在 一个稳定版本以及一个测试版本渠道 以获取新的版本。

并且,微软已经将 容器功能 添加到了Windows10的年度更新补丁里。通过一些 安装步骤 ,你便能在你的Windows10机器上运行 Windows Hyper-V容器

但是这里面可能存在点小疑问,那便是这两种安装方式对应启动的是哪类容器。而且,在不做任何调整的情况下你将无法并排运行两个Docker引擎。

由于两个安装版本使用的是同一个默认的命名通道 //./pipe/docker_engine ,这会导致其中的一个引擎启动失败。

统领一切的Beta 26

从Docker Windows Beta 26测试版本起,这里有一个更简单的方法来解决这个矛盾。你只需要通过MSI安装器装上Docker Windows版即可。在Docker的托盘图标上会有一个新的菜单选项支持在Linux及Windows容器间切换。

正如你在视频里所看到的那样,你不用再通过更改环境变量或是利用Docker客户端的 -H 参数来和其他的Docker引擎通信。

如果你下载了 Docker Windows测试版 或是你在安装过程中切换到了测试频道,那么不妨亲身体验一下。

如果你之前还没有激活 容器 功能的话该安装器将会帮你激活它。为了添加这项特性,需要重启一次才能生效。

现在你可以轻松地通过点击托盘图标里的菜单栏来完成切换。

这里也提供了一个命令行工具来切换引擎。你可以打开一个PowerShell窗口然后键入:

& 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchDaemon

这样它便完成了从Linux切换到Windows,反之亦然。注意按照上面展示的那样键入参数,它是大小写敏感的。

用代理来解围

但是,如何才能做到切换工作进行过程中无需Docker客户端改用其他的命名通道或是套接字呢?

答案便是,Docker会运行一个代理进程 com.docker.proxy.exe ,它会监听默认的命名通道 //./pipe/docker_engine

如果你是从Linux切换到Windows,那么Windows Docker引擎 dockerd.exe 将会启动并监听在另外的命名通道 //./pipe/docker_engine_windows ,然后发起一个新的代理进程重定向到它。

探寻本质

为了探寻从Linux切换到Windows容器的过程中究竟发生了什么,我安装了 sysinternals进程监控工具 。通过进程树功能,你可以看到一个时间线,每个已启动或者已退出的进程都会有对应的绿色条。

下面这张截图展示了切换前后的进程情况。大概在绿色条的中间部分我就已经完成了切换。

在Windows 10上运行Linux及Windows容器

和MobyLinuxVM通信的 com.docker.proxy.exe (列表里的 dockerd.exe ),正如深绿色条高亮展示的那样已然退出。

dockerd.exe ,即Windows Docker引擎启动了,并且它还发起了一个新的和Windows Docker引擎通信的 com.docker.proxy.exe (dockerd.exe下面)。

因此,在切换后你仍然可以用 docker.exe 客户端或者是集成在你喜爱的编辑器或IDE里的Docker插件,而无需作任何环境上的改动。

并行运转两个容器世界

代理进程只是切换了连接到的Docker引擎而已。在这样一个切换动作完成后实际上Linux和Windows两个Docker引擎均在运行。

运行一个Linux Web服务器

在体验之前我们首先得切换回Linux容器。现在我们可以在80端口上运行默认的nginx web容器:

```

docker run -p 80:80 -d nginx

```

然后再切换到Windows容器:

& 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchDaemon

在Windows 10上运行Linux及Windows容器

现在,让我们跑一些Windows容器吧。但是首先我们还得试试看Linux容器是否仍然还在运行,并且服务是否是可以访问的:

start http://localhost

通过这个 start 命令你可以打开Edge浏览器访问一个运行在Linux容器里的nginx自带的欢迎页面。

在Windows 10上运行Linux及Windows容器

是的,这个Linux容器一直在跑着。

构建一个Windows Web容器

在Windows 10上你(只能运行Nanoserver容器。而这里并没有针对Nanoserver的IIS docker镜像)(删除横线)。更正:你可以在Windows 10上运行Nanoserver以及windowsservercore容器。

但是为了演示nanoserver容器是如何的简单,我将仍然使用下面这个例子来做讲解。那么,我们现在来创建一个属于自己的小型Node.js Web服务器。首先,我们编写一个简单的web服务应用:

notepad app.js

app.js 文件里键入如下代码作为一个迷你web服务然后保存该文件。

```

var http = require('http');

var port = 81;

function handleRequest(req, res) {

res.end('Hello from Windows container, path = ' + req.url);

}

var server = http.createServer(handleRequest);

server.listen(port);

```

现在我们来为这个应用构建一个Windows Docker镜像。我们另外打开一个编辑器然后通过如下命令创建 Dockerfile

notepad Dockerfile.

键入下面的代码作为Dockerfile的内容。正如你所能看到的那样,只有 FROM 这一行和典型的Linux Dockerfile不太一样。它使用的是一个来自Docker Hub的Windows基础镜像。

```

FROM stefanscherer/node-windows:6.7.0-nano

COPY app.js app.js

CMD [ "node", "app.js" ]

```

保存该文件然后通过如下熟悉的命令来构建Docker镜像:

docker build -t webserver .

通过如下命令将Windows web服务跑在一个Docker容器里:

docker run -p 81:81 -d webserver

在Windows 10上运行Linux及Windows容器

这时候你无法直接通过127.0.0.1连接到容器。但是可以使用容器的IP地址去访问。我们需要容器的ID或者名字,可以通过如下命令列出当前正在运行的容器:

```

docker ps

```

然后打开浏览器输入对应容器的IP地址:

start http://$(docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" grave_thompson):81

在Windows 10上运行Linux及Windows容器

此外,从宿主机到容器的端口转发使得你在其他机器上也可以通过81端口访问web服务。

在Windows 10上运行Linux及Windows容器

是的,Windows容器也在处理请求了。

结论

新版的Docker Windows测试版把两个容器世界结合在了一起,并且简化了Linux和Windows Docker镜像的构建,使得一台W

indows 10机器对于两者而言均可算是一个不错的开发平台。

并且在切换到所需的Docker引擎时稍微注意一下便能发现,Linux和Windows容器可以同时在两侧运行。

如果您有任何问题或者改善的意见又或者想分享你的看法,不妨留下宝贵的评论。你可以在推特上关注我 @stefscherer

 
标签: Linux Docker
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • windows10环境下安装Linux子系统---debian
    windows10环境下安装Linux子系统---debian
    windows10环境下安装Linux子系统---debian一、前提1、在控制面板-程序-启用与关闭Windows功能中,勾选“适用于Linux的Windows子系统”  2、首先需要创建一个文件夹,用来存放子系统,在需要的位置创建即可,文件夹名任意3、手动下载Windows子系统发行版包,
    03-08
  • 【强转】QEMU+GDB调试linux内核全过程
    【强转】QEMU+GDB调试linux内核全过程
    昨天更新了一篇名为《QEMU+GDB调试linux内核全过程》[link][https://blog.csdn.net/weixin_37867857/article/details/88138432]的博客,发现排版比较混乱,而且思维也比较混乱。咋一看下来简直是惨不忍睹,而且会给读者在安装过程中一种云里雾里的感觉,加上
    03-08
  • Linux下Bochs,NASM安装和使用 linux bom
    Linux下Bochs,NASM安装和使用 linux bom
    以Ubuntu为例,先更新一下:sudo apt-get updatesudo apt-get upgrade然后安装Bochs环境:sudo apt-get install build-essential xorg-dev libgtk2.0-dev安装NASMNASM官网下载,这以nasm-2.14.02.tar.gz为例:用tar zxvf nasm-2.14.02.tar.gz解压后编译安装cd
    03-08
  • 把玩Alpine linux(一):安装
    把玩Alpine linux(一):安装
    导读Alpine Linux是一个面向安全应用的轻量级Linux发行版。它采用了musl libc和busybox以减小系统的体积和运行时资源消耗,同时还提供了自己的包管理工具apk。Alpine 的内核都打了grsecurity/PaX补丁,并且所有的程序都编译为Position Independent Executabl
    03-08
  • 日志审计与分析实验三(rsyslog服务器端和客户端配置)(Linux日志收集)
    日志审计与分析实验三(rsyslog服务器端和客户
     Linux日志收集一、实验目的:1、掌握rsyslog配置方法2、配置rsyslog服务收集其他Linux服务器日志:C/S架构:客户端将其日志上传到服务器端,通过对服务器端日志的查询,来实现对其他客户端的日志进行集中管理;下面实现就是通过两套机器来实现,(server:19
    03-08
  • Linux学习系列--如何在Linux中进行文件的管理
    Linux学习系列--如何在Linux中进行文件的管理
    文件在常见的Linux的文件系统中,经常使用能了解到的文件管理系统是分为多个文件夹进行管理的。如何查看文件路径 pwd ,在文件目录中,会有一个点(.)代表的是当前目录,两个点(..)代表的是当前目录的上层目录在Linux下,所有以点开始的文件都是“隐藏文件
    03-08
  • [JetBrains] 我想在 Linux 上使用 macOS 键绑定!
    [JetBrains] 我想在 Linux 上使用 macOS 键绑定
    很高兴认识你,我的名字是kitakkun。我最近开始实习,是工程界的新手。顺便说一句,这是我的第一篇文章。你最喜欢的操作系统是什么?视窗?苹果系统?还是Linux?我将它们全部用于不同的目的,但感觉就像 macOS ≒ LinuxWindows。一两个月前,我最喜欢 Linux
    03-08
  • Linux使用nginx反向代理。可实现域名指向特定端
    在配置80指向域名的时候出现端口占用,使用kill -9无法杀死端口,应使用下面的命令来杀死进程killall -9 nginx(使用完本命令需要再把配置过的配置文件重新启动。命令写在了PS下面)后在root权限下的nginx的sbin下使用./nginx -t(命令重启nginx并检查是否有语
    02-13
  • 新换的 Fedora Core Linux 桌面,来秀一秀(多
    1、桌面、终端、文件浏览器,已经设置好字体、自动挂载硬盘,不是很麻烦2、即时通讯:QQ,Skype3、firefox4、D4X、BT、电驴5、开发工具:eclipse netbeans6、openoffice 大开 word 公式文档,输出 PDF7、小企鹅输入法,支持微软双拼8、星际译王,linux 下免费
    02-10
  • fedora linux源代码下载
    fedora linux源代码下载
    yumdownloader --source kernel如果是下载insight就是 yumdownloader --source insight下载到的是当前目录.然后在用rpm2cpio 生成 压缩文件rpm2cpio insight-7.4.50-8.20120403cvs.fc17.src.rpm|cpio -idrpm2cpio 的使用 在 http://www.rpm.org/max-rpm/s1-rp
    02-10
点击排行