在Windows 10上运行Linux及Windows容器

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文讲的是在Windows 10上运行Linux及Windows容器【编者的话】DockerCon 2016上Docker官方发布了Docker for Windows的公开测试版本,在这一版本里,添加了对在Windows 10上运行Windows容器(包括nanoserver和servercore)、Linux容器以及两者并存的支持,本文作者就这一话题为我们展示了一些具体的实例操作并进一步分析了背后的运行机制。
本文讲的是在Windows 10上运行Linux及Windows容器【编者的话】DockerCon 2016上Docker官方发布了Docker for Windows的公开测试版本,在这一版本里,添加了对在Windows 10上运行Windows容器(包括nanoserver和servercore)、Linux容器以及两者并存的支持,本文作者就这一话题为我们展示了一些具体的实例操作并进一步分析了背后的运行机制。

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

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

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

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

统领一切的Beta 26

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

正如你在视频里所看到的那样,你不用再通过更改环境变量或是利用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进程监控工具 。通过进程树功能,你可以看到一个时间线,每个已启动或者已退出的进程都会有对应的绿色条。

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

和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

docker-run-nginx.png

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

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

是的,这个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  

docker-run-webserver-1.png

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

然后打开浏览器输入对应容器的IP地址:
start http://$(docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" grave_thompson):81  

docker-inspect.png

此外,从宿主机到容器的端口转发使得你在其他机器上也可以通过81端口访问Web服务。
curl-to-windows-10.png

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

结论

新版的Docker Windows测试版把两个容器世界结合在了一起,并且简化了Linux和Windows Docker镜像的构建,使得一台Windows 10机器对于两者而言均可算是一个不错的开发平台。

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

原文链接:run-linux-and-windows-containers-on-windows-10(翻译:吴佳兴)

原文发布时间为:2016-10-15

本文作者:吴佳兴

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:在Windows 10上运行Linux及Windows容器

相关文章
|
30天前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
46 2
|
1月前
|
Linux 数据安全/隐私保护 Windows
Linux共享Windows目录
Linux共享Windows目录
|
25天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
1月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
30天前
|
Unix Linux Ruby
在windows和linux上高效快捷地发布Dash应用
在windows和linux上高效快捷地发布Dash应用
|
8天前
|
存储 传感器 Linux
STM32微控制器为何不适合运行Linux系统的分析
总的来说,虽然技术上可能存在某些特殊情况下将Linux移植到高端STM32微控制器上的可能性,但从资源、性能、成本和应用场景等多个方面考虑,STM32微控制器不适合运行Linux系统。对于需要运行Linux的应用,更适合选择ARM Cortex-A系列处理器的开发平台。
53 0
|
30天前
|
Ubuntu Linux 虚拟化
安装Windows Linux 子系统的方法:适用于windows 11 版本
本文提供了在Windows 11系统上安装Linux子系统(WSL)的详细步骤,包括启用子系统和虚拟化功能、从Microsoft Store安装Linux发行版、设置WSL默认版本、安装WSL2补丁,以及完成Ubuntu的首次安装设置。
83 2
|
17天前
|
Linux 开发者 Python
从Windows到Linux,Python系统调用如何让代码飞翔🚀
【9月更文挑战第10天】在编程领域,跨越不同操作系统的障碍是常见挑战。Python凭借其“编写一次,到处运行”的理念,显著简化了这一过程。通过os、subprocess、shutil等标准库模块,Python提供了统一的接口,自动处理底层差异,使代码在Windows和Linux上无缝运行。例如,`open`函数在不同系统中以相同方式操作文件,而`subprocess`模块则能一致地执行系统命令。此外,第三方库如psutil进一步增强了跨平台能力,使开发者能够轻松编写高效且易维护的代码。借助Python的强大系统调用功能,跨平台编程变得简单高效。
14 0
|
27天前
|
Linux
用QEMU模拟运行uboot从SD卡启动Linux
用QEMU模拟运行uboot从SD卡启动Linux
|
30天前
|
Linux Windows Python
最新 Windows\Linux 后台运行程序注解
本文介绍了在Windows和Linux系统后台运行程序的方法,包括Linux系统中使用nohup命令和ps命令查看进程,以及Windows系统中通过编写bat文件和使用PowerShell启动隐藏窗口的程序,确保即使退出命令行界面程序也继续在后台运行。