Windows上的Docker

因为Windows与macOS和Linux是差异很大的操作系统,所以这里多讨论一些细节,强调一些常见的问题和解决方案的更多细节。读者应该按照Docker Toolbox官方安装文档来进行,并确保不要勾选“Use Windows Containers Instead of Linux Containers”(使用Windows容器而不是Linux容器)。启动新创建的Docker Windows版将会开始加载Docker,这可能需要1分钟——它会在启动后通知你,然后你就可以开始使用了。

可以打开PowerShell然后执行 docker run hello-world 来检查其是否正常工作。Docker将会自动从Docker Hub拉取hello-world镜像并运行它。该命令的输出结果简要描述了刚刚在Docker客户端和守护进程之间进行通信的几个步骤。如果觉得输出内容没什么意义的话别担心,有关幕后内容的更多详细介绍参见第2章。

注意,因为本书中使用的脚本假定读者使用的是bash(或者类似的shell),并且拥有许多现成的工具,包括可用于下载本书中的代码示例的 git ,这在Windows上不可避免地会出现一些奇怪的情况。我们建议读者研究一下Cygwin和Windows Linux子系统(Windows Subsystem for Linux,WSL)来填补这一空白——两者都提供了类似的Linux环境,其中包括 socatsshperl 等命令,尽管读者可能会发现,当需要用到一些特定于Linux上的工具,如 straceip (用于 ip addr )时,WSL能够提供更为完整的用户体验。

提示

Cygwin是一个在Windows上可用的Linux工具的合集。如果想要一个可以在Windows上(作为.exe)实验的类Linux环境,Cygwin应该是首屈一指的。它自带一个包管理器,以便用户可以看一下可用软件。相比之下,WSL是微软公司对在Windows上提供一个完整的模拟的Linux环境的一次尝试,以至于用户可以在实际的Linux机器上复制可执行文件。虽然在WSL上运行它们并不完美(如无法在上面运行Docker守护进程),但是在绝大多数场景下用户下可以有效地将其看作是一台Linux机器。每个场景下完整的处理方式超出了附录的范畴。

以下列出的是Windows上一些命令和组件的替代品,但是要铭记其中的一些并不是完美的替代品——本书着眼于使用Docker来运行Linux容器,所以更合理的是用一个“完整的”Linux安装版(不管是臃肿的虚拟机、云中的一个环境还是本地的安装)来试验Docker的完全潜力。

  • ip addr ——这条命令在本书中一般用于找到在本地网络中我们的机器的IP地址。Windows的等价命令是 ipconfig
  • strace ——这条命令在本书中用于附加到在容器种运行的进程上,见技巧109中的“类宿主机的容器”以了解如何绕过Docker容器化来在运行Docker的虚拟机中获得类宿主机的权限——你可能想启动shell而不是执行 chroot ,并且比起BusyBox你可能更想使用如同Ubuntu那样的带有包管理的Linux发行版。然后你就可以好像在宿主机上那样安装并执行命令。这条技巧适用于很多命令,并且它可以让你的Docker虚拟机几乎和臃肿的虚拟机一样。
1.在Windows上对外公开端口

使用Docker Windows版时,端口转发是自动处理的,因此用户应该可以如预期那样使用localhost来访问公开的端口。如果尝试从外部机器连接的话,Windows防火墙可能会碍事。

如果用户处于一个受信且受防火墙保护的网络,就应该能够通过暂时禁用Windows防火墙来解决这个问题,但是,别忘了之后再重新启用它!我们之中的一员发现这对特定网络不奏效,最终确定该网络在Windows里被设置为“域”网络,需要进入Windows防火墙高级设置才能执行临时禁用操作。

2.Windows上的图形应用程序

在Windows上运行Linux图形工具很有挑战性——不仅需要让所有这些代码都在Windows上工作,还需要决定如何展示。Linux上使用的窗口系统(称为X Window System或者X11)并不适用于Windows。幸运的是,X允许通过网络显示应用程序窗口,所以可以使用Windows上的X实现来显示Docker容器中运行的应用程序。

Windows上有数个不同的 X 实现,我们仅介绍可以用Cygwin获得的安装版。你应该遵循Cygwin官方网站上的官方文档。当选择要安装的包的时候,必须确保 xorg-serverxinitxhost 被选中。

一旦安装完成,就可以打开Cygwin终端然后运行 XWin :0 -listen tcp -multiwindow 。它会在你的Windows机器上启动一个X服务器,它有监听来自网络的连接( -listen tcp )以及在自己的窗口内显示每个应用( -multiwindow )的能力,而不是作为程序虚拟屏幕显示应用的单个窗口。一旦启动,读者就应该在系统的托盘区看到一个X图标。

注意

虽然这个X服务器可以监听网络,但目前它只信任本地机器。在目前我们见过的案例里,这允许来自Docker虚拟机的访问,但是如果遇到授权问题,你可以试着执行不安全的 xhost +命令来允许来自所有机器的访问。如果这么做了,一定要确保防火墙设置了拒绝来自网络的任何连接企图——遇到任何情况都不要在禁用Windows防火墙时运行它!如果确实执行了这一命令,记得在之后执行 xhost- 命令来重新保护它。

是时候试用X服务器了!使用 ipconfig 找到本地机器的IP地址。在使用对外的网络适配器上的IP地址(无论是无线连接还是有线连接)时,一般来说这就是答案,因为这看起来似乎就是容器连接的发源地。如果你有很多这样的适配器,可能要挨个试试这些IP地址。

启动第一个图形应用程序应该就像在PowerShell执行 docker run -e DISPLAY=$MY_IP:0 --rm fr3nd/xeyes 一样简单, $MY_IP 就是你已经找到的IP地址。

如果你未连接到网络,那么可以使用不安全的 xhost + 命令来简化操作,它允许用户使用 DockerNAT 接口。和之前一样,完成后记得执行 xhost +

results matching ""

    No results matching ""