Windows的Docker Beta版本

本文讲的是Windows的Docker Beta版本,【编者的话】本文为Docker Saigon社区于其官方网站中发布的文章Docker For Windows Beta,此文描述了在Windows上的Docker Beta版本的一些功能,并且做了演示。Docker Saigon社区是由越南的Docker社区用户创建的,位于胡志明市。

注释:这篇文章的研究已在Beta客户端完成了,并且技术细节有可能发生变化。

正如之前发布的帖子描述的那样,我们已经在Windows的Hyper-V上使用Docker有一阵子了。听说了新的Windows的Docker客户端是基于Alpine的,并且会专注于Hyper-V,这使得我们很渴望亲眼看一看。

Hyper-V 配置

第一个要克服的问题是当在Windows上使用Hyper-V时缺乏DNS/DHCP和NAT服务。新的Docker客户端为我们接管虚拟交换机的NAT配置并且为DNS与DHCP添加了一个很巧妙的解决方案。

作为安装过程的一部分,将创建一个内部DockerNAT虚拟交换机,并且该Windows主机上的虚拟接口将会为这个虚拟交换机获得一个静态IP:

New-VMSwitch -Name "DockerNAT" -SwitchType Internal
Get-NetAdapter "vEthernet (DockerNAT)" | New-NetIPAddress -AddressFamily IPv4 `
  -IPAddress "10.0.75.1" -PrefixLength 24

同时,也创建了一个为“10.0.75.0/24”子网提供网络地址转换(Network Address Translation)的NAT对象。

New-NetNat –Name $SwitchName `
–InternalIPInterfaceAddressPrefix "10.0.75.0/24"

提示: 如果有任何的步骤失败了,须确保名为“DockerNAT”的交换机是被创建的,并且IP已经被分配给了该虚拟接口(Virtual Interface)的。此外通过Get-NetNat命令所显示的NAT是属于正确的子网内的。同时要确保物理网络与现有存在的接口不重叠(我们已经在测试beta版本的时候手动地将这些问题修复了)。
接下来,MobyLinuxVM虚拟机已经在Hyper-V里建立起来了。MobyLinuxVM使用Alpine bootcd集成的Hyper-V服务,例如Key-Value Pair Exchange服务(hv_kvp_daemon)。Hyper-V KVP的守护进程允许Hyper-V和Linux客户机之间通信(例如检索客户IP和发送双向的消息,这我们将在后面看到)。
最终,Docker捆绑了com.docker.proxy.exe源代码,它代理了在Windos主机上的MobyLinuxVM端口。在写该文的时候(Docker Beta 7),它已经包含了DNS(TCP/UDP 53),DHCP(UDP 67)和Docker 守护进程(TCP2375)。
如果你一直在为你的Hyper-V配置运行一个替代解决方案,那么需要确保以上所有端口是可用的,如下所示。

查看是否有任何进程在占用53端口:

netstat -aon | findstr :53

一旦你发现任何进程号再占用该端口(<pid>),那么先获取进程名:

tasklist /SVC | findstr <pid>

com.docker.proxy.exe将会把你笔记本内部网络所有的DNS请求通过Windows主机代理到DNS服务器上,当你移动你的笔记本的时候可以有效地从网络配置上隔离MobyLinuxVM。
为了确保该进程工作正常,docker自动地创建了DockerTcp和DockerUdp防火墙规则,并且可以在我们关闭客户端的时候移除它。

New-NetFirewallRule -Name "DockerTcp" -DisplayName "DockerTcp"  `
-Program "C:\<path>\<to>\com.docker.proxy.exe" -Protocol TCP `
-Profile Any -EdgeTraversalPolicy DeferToUser -Enabled True

New-NetFirewallRule -Name "DockerUdp" -DisplayName "DockerUdp"  `
-Program "C:\<path>\<to>\com.docker.proxy.exe" -Protocol UDP `
-Profile Any -EdgeTraversalPolicy DeferToUser -Enabled True

Docker的守护进程在本地打开,允许你的docker客户端与本地主机通信,可是-它看起来在使用一个命名管道的方案去替代它, 如果该VM被正确地创建, 那么你应该看到连接到其COM口的命名管道。
那么同样也可以看到docker客户端代码在处理Windows命名管道

Get-VMComPort -VMName MobyLinuxVM | fl | Out-String

如果MobyLiunxVM正常地启动,我们就应该可以确认Hyper-V集成服务是在运行着的。

Get-VMIntegrationService -VMName MobyLinuxVM -Name "Key-Value Pair Exchange"

并且com.docker.proxy.exe的DHCP服务提供了一个到VM的IP,通过该IP我们可以查询Hyper-V集成服务:

$(Get-VM MobyLinuxVM).NetworkAdapters[0]

排错

所有的配置都放在%APPDATA%\Docker\文件夹下面,当漫游设置开启的时候,这个文件夹被复制在该主机的企业设置中。
所有日志存放在%LOCALAPPDATA%\Docker\文件夹下面。
可以通过如下PowerShell脚本去监控最新的日志:

gc $(gi $env:LocalAppData\Docker\* | sort LastAccessTime -Desc | select -First -
1) -Wait 

一旦有事件写入日志文件将会被自动刷新。

Docker ToolBox 迁移

在Windows上切换至Hyper-V角色的话将会关闭VirtualBox(其实直到你关闭Hypver-V并重启之前都不可能用Docker ToolBox)。
如果检测到Docker Toolbox已经安装了,那么会提供一个整合路径(基于qemu-img方式的)。这将会把%USERPROFILE%.docker\machine\machines\<machine-name>\disk.vmdk路径下的磁盘转换成vhdx格式:

qemu-img.exe convert <path-to-vmdk> -O vhdx -o subformat=dynamic 
-p "C:\Users\Public\Documents\Hyper-V\Virtual hard disks\MobyLinuxVM.vhdx\"

如果你已经通过Hyper-V使用Docker-Machine和Docker-Compose了,你也可以同时用Docker的Windows客户端这么做一遍。

挂载卷

基于Windows下的Docker的其中一个较大的改进是承诺的卷如何挂载的问题。
一个便利的对话框模式提供了我们所需要的一切。

目前的改进将是共享整个存储(不包括单独的文件夹)。开启共享的时候需要提供凭据。
凭据信息伴随着“Docker Host Filesystem Access”目标被存储在了Windows > Control Panel > Credential Manager > Windows Credentials Store路径下,这是通过System.Security.Cryptography随着当前用户进行加密的。
如果凭据管理器已经包含了指定的目标凭据,他们将被覆盖。
接下来,可以看到存储器被共享在了Windows主机上:

net share C=C:\ /grant:<username>,FULL /CACHE:None

Samba的共享方式现在将会被挂载到MobyLinuxVM上,并且会通过Hyper-V的Key-Value交换服务进行自动操作。这里是细节方面的解释
工作方式应该像下面描述的那样:Windows主机将一个mount authentication token令牌打包放进了VMBus中的KvpExchangeDataItem类里:

class Msvm_KvpExchangeDataItem : CIM_ManagedElement
{
uint16 Source = 0;
string Name = "cifsmount";
string Data = "authToken";
};

认证令牌是包含挂载点和安装选项的序列化的字符串:

/c;/C;username=<username>,password=<password>,noperm

在Alpine上,是hv_utils核心驱动模块通知hv_kvp_daemon。这个守护进程把kvp写进了池文件里(/var/lib/hyperv/.kv_pool_**)。
此时,MobyLinuxVM需要构建一个目录,并且从主机上挂载该共享目录-但是这一次写入的时候是失败了的:

#for both upper and lower case
mount -t cifs //10.0.75.1/C /C -o username=<username>,
password=<password>,noperm

如果共享是工作正常的,那么我们的docker客户端将会经由com.docker.proxy.exe通过开启的端口发送任何卷的挂载信息,该代理会在需要的时候重写该路径:例如C:\Users\test\变成/C/Users/test,这可以让我们把Windows的目录挂载到我们的Docker容器中。
然而,由于SMB协议的原因(缺少inotify和symlinks的支持)使得我们这么做这仍然会有限制,这将会导致实时重置。
排错:我们可以通过以下的PowerShell脚本来验证令牌是否存在:

$VmMgmt = Get-WmiObject -Namespace root\virtualization\v2 
-Class ` Msvm_VirtualSystemManagementService
$vm = Get-WmiObject -Namespace root\virtualization\v2 
-Class ` Msvm_ComputerSystem -Filter {ElementName='MobyLinuxVM'}

($vm.GetRelated("Msvm_KvpExchangeComponent")[0] ` 
).GetRelated("Msvm_KvpExchangeComponentSettingData").HostExchangeItems | % { ` 
    $GuestExchangeItemXml = ([XML]$_).SelectSingleNode(` 
        "/INSTANCE/PROPERTY[@NAME='Name']/VALUE[child::text() = 'cifsmount']") 

    if ($GuestExchangeItemXml -ne $null) 
    { 
       $GuestExchangeItemXml.SelectSingleNode(` 
        "/INSTANCE/PROPERTY[@NAME='Data']/VALUE/child::text()").Value 
    }    
} 

目前为止,我还没有弄清楚在Alpine主机上是由哪个进程去监控var/lib/hyperv/.kv_pool_0这个文件的。

私有仓库

现在的Windows Beta版本目前还不支持DOCKER_OPTS和TLS证书。
像下面一样,我们可以获得到MobyLinuxVM的根账号访问权限:

#get a privileged container with access to Docker daemon
docker run --privileged -it --rm 
-v /var/run/docker.sock:/var/run/docker.sock 
-v /usr/bin/docker:/usr/bin/docker alpine sh

#run a container with full root access to MobyLinuxVM and no seccomp profile 
(so you can mount stuff)
docker run --net=host --ipc=host --uts=host --pid=host -it 
--security-opt=seccomp=unconfined --privileged
--rm -v /:/host alpine /bin/sh

#switch to host FS
chroot /host

闲逛该VM的时候发现了下面的一些东西:
这个基于Alpine的VM使用OpenRC作为它的初始化系统

rc-status

显示所有的服务状态的时候,我们会发现一些定义的脚本并没有部署状态,并且显示是“崩溃的”,尽管这些进程看起来其实是运行的(ps -a)。
Docker初始化脚本依赖于/usr/bin/mobyconfig脚本。该脚本要求内核伴随着com.docker.database标签定义的文件配置的位置启动。如果该标签存在-/Database使用 Docker for Mac的原始文件系统Plan 9 Filesystem Protocol挂载。
mobyconfig可以检索网络并且为Docker守护进程取消加密,或者从/etc/docker/daemon.json中获取配置文件。一旦全面实施,将会是一个很有前景的解决方案。
由于整个磁盘是一个只有/var/固定挂载点的临时文件的系统是固定存在的(挂载到/dev/sda2),更改的任何脚本在重新引导时不会持续运行。这将可以临时改变Docker选项并且通过/etc/init.d/docker restart命令重启守护进程。

总结

许多的改进将会随着基于Windows的Docker客户端而来,我们期待下次在MAC上的Docker客户端的测试。

原文链接:Docker For Windows Beta (翻译:薛开成)

===========================================
译者介绍
薛开成,趋势科技南京研发中心工程工具服务事业部基础架构高级工程师,负责容器仓库实施及落地。

原文发布时间为:2016-04-25

本文作者:绝地魔影 

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:Windows的Docker Beta版本

时间: 2024-10-31 10:00:57

Windows的Docker Beta版本的相关文章

Windows Server 8 Beta中Active Directory体验

Windows Server系统,随着版本的升级,很多功能越来越依赖于Active Directory,越来越离不开Active Directory,所以在体验Windows Server 8 Beta 其它功能之前,我们先部署Active Directory,探讨在Active Directory集成下的各种应用. 先看看部署Active Directory 的各种要求: 必要条件 描叙 TCP/IP 配置适当的TCP / IP和DNS服务器地址. NTFS 存储数据库,日志文件和Active

Windows Server 8 Beta安装过程体验

这个没有技术含量,只是让没有安装过或懒得安装Windows Server 8 Beta的人感受一下,知道Server 8 和以前Server版本 之间的变化,大多是贴图: 开始安装和Widnwos 8及以前版本的Server区别不大. 这个地方只给出了两个选择:一个是核心安装,一个是图形界面安装,对于不是很懂命令行的人,建议选择图形界面安装, 微软这里只给出了数据中心版,我想,这个版本是最能代表微软的Server操作系统的一个版本.

Windows 下 Docker 的安装与配置概述

本文简要说明 Windows 环境下 Docker 的安装与配置. 原理概述 Docker 最早基于 Linux 内核相关特性构建,只能在 Linux 类系统上运行.所以,Windows 上只能基于 Linux 虚拟机运行 Docker.但与微软深入合作后,从 Windows Server 2016 开始,提供了对 Docker 的原生支持.所以,在 Windows 上安装.运行 Docker 有两种模式: Windows Container:专为 Windows 设计的容器架构下原生支持.运行

百度站长平台新上线外链工具beta版本公告

  站长网10月30日消息,百度站长平台今天新上线了外链工具beta版本,以下是百度官方平台新版本上线公告内容.    各位网站管理员: 很高兴通知大家,百度站长平台外链工具beta版今日正式上线.根据我们前期的需求调研,发现网站管理员对外链工具都有很高的需求,百度网页搜索首次推出外链工具 ,提供链接到所查询网站的域.该主域下链接url 的详细信息及查询网站被链接的网页的详细信息的展示和下载功能. 本次工具亮点: 1.百度首次推出外链工具,为网站管理员提供自己网站在百度中的真实外链情况,更好的为

获得Windows 8 应用的版本信息的方法

为什么要获得Windows 8 应用的版本信息呢? 对于普通用户我们一般可以不用理会这个版本信息,而且通常情况下Windows 商店的Windows UI 图标右上角会显示更新数字,更新后就会获得更好体验.不过有时候热心的朋友会进行问题反馈,为了能更好的进行问题信息的收集,一般来说应用的反馈会提供一个自己软件所在问题反馈平台,在其中有的会要求提供相关的版本信息,但是对于版本信息的显示(来自于传统桌面模式下的帮助à关于),在超级按钮呼唤出的菜单下并不是统一要求展示这个"关于"选项的. F

Windows Server 8 Beta中Hyper-v体验

Windows Server 8 Beta 和以往的Server操作系统比较,最大的变化就是没有了开始菜单,开始菜单由服务器管理器所代替,从操作感受上来讲,以往的Server操作系统基本上由四部分组成:开始.桌面.控制面板,管理工具,用这四部分,基本就能完成所有的配置,而Windows Server 8,少了的开始菜单这部分基本由服务器管理器代替,使操作更加方便快捷. 对于Windows Server 8 Hyper-v的期许一直很大,下面先看看微软的介绍,然后再看看我简单的折腾图示: 利用 W

Opera浏览器VPN推出Beta版本

近日Opera浏览器VPN服务推出Beta版本(下载),今年四月份Opera宣布在浏览器产品的开发者预览版中捆绑免费VPN服务,宣称"让每个人都能用上免费VPN",引起全球媒体关注.但是不久后该VPN服务在国内就无法开启使用. Opera宣布转型VPN服务正值奇虎360和昆仑万维联手向Opera发出12亿美元的收购要约,且Opera董事会一致建议股东接受该要约,但Opera首席执行官公开表示拒绝.因此业界有人猜测推出VPN服务作为产品主要卖点实际上是一个"产品毒丸"

如何还原Windows 10为老版本时钟

Windows 10 带来了太多的变化,连时钟都更改了显示方式.Windows 10 中的新时间显示方式更为扁平化,也非常适合移动设备来使用.不过,我个人还是比较喜欢老版本 Windows 中的时间显示方式,如果你跟我一样,可以使用本文介绍的方式还原 Windows 10 为 Windows 7/8 老版本的时钟显示. 还原Windows 10为老版本时钟 若要将 Windows 10 的时间显示还原为 Windows 7/8 老版本的时钟方式显示,只需按如下方式更改注册表即可. 1.按下 Wi

Windows下Python多版本共存

Windows下Python多版本共存 Python数据科学安装Numby,pandas,scipy,matpotlib等(IPython安装pandas) 0.0 因为公司项目,需要Python两个版本共存开发,一个2.7x用来处理空间数据主要配合ArcGIS,而另一个3.5x用来做算法应用.因此就必须在计算机中共存2.7x和3.5x版本的.这次解决共存后记录下来过程,分享给大家. 1.0 下载Python2.7x和Python3.5x版本 2.0 安装Python2.7x和Python3.5