访问WS2016 docker容器内的虚拟COM端口

时间:2016-09-27 11:19:21

标签: docker windows-server-2016 com0com

使用Windows Server 2016 TP5(来宾虚拟机)在Win7(主机)和Virtual Box上运行。在WS2016上,我运行docker,使用windowsservercore基础映像作为容器。

我尝试了一种车队管理系统,试图在单独的码头图像中启动多个模拟车辆。

这些车辆模拟器使用模拟gps将数据发送到虚拟COM端口,模拟车辆从中读取。

在Windows XP / 7 / Server 2016中,我已成功使用 com0com(2.2.2.0签名)来创建虚拟COM端口。

我的问题是在docker容器中安装虚拟com端口,或者将它们作为主机上的设备访问

我的第一次尝试是在docker中运行com0com,使用静默模式安装驱动程序工作正常,但是当使用已安装的应用程序创建虚拟COM端口对时,我遇到了问题。命令停止,如果我查看Application事件日志,每次尝试运行命令时都会看到这类行。

<date> <time> Information Windows Error Rep. .. 1001 Fault bucket , type 0 

当尝试在主机中创建设备而不是传递设备时,我似乎无法访问它们

在容器中使用 com0com --list ,我可以看到设备,但与主机中的名称不同

在关联的Dockerfile中,我使用 com0com setupc.exe 将它们重命名为与主机上标识的名称相同的名称

主机上发出的模式命令正确地列出了端口,另一方面,使用insde的容器模式命令无法列出它们,只显示一个项目:CON

然后我尝试使用 --device = // ./ COM128://./COM128 参数将它们传递给docker run

注意!:这是正确的&#34;路径&#34;到设备?

显着的结果是零, com0com setupc 命令给出相同的结果,与模式相同

奇怪的是,当我运行powershell并列出serialports时,我得到主机上可用的预期comports,名称正确,但尝试打开其中一个会出现异常

PS C:\sims\com0com> [System.IO.Ports.SerialPort]::getportnames()
COM128
COM129
PS C:\sims\com0com> $comports=[System.IO.Ports.SerialPort]::getportnames()
PS C:\sims\com0com> $port= new-Object System.IO.Ports.SerialPort $comports[0],9600,None,8,one
PS C:\sims\com0com> $port.open()
Exception calling "Open" with "0" argument(s): "The port 'COM128' does not exist."

最后尝试与上面几乎相同,但使用另一个虚拟COM端口软件(eltima),在主机中设置它们,尝试在容器中使用ps打开端口时的最终结果与com0com相同配置端口

更新

尝试了一种新的方法,在hyper-v中运行容器,使用-isolation标志来停靠运行,假设您可以在超级v容器中安装com0com驱动程序,而不必尝试从主持人那里分享。

在hyper-v中运行迫使我们改为运行nanoserver基本映像而不是windowsservercore基本映像。

由于安装程序(基于NSIS)是32位应用程序,纳米服务器只能运行64位应用程序,因此目前无法在nanoserver中运行com0com安装工具。

快速浏览表明NSIS的新版本(3.0)可以与com0com仓库中包含的NSIS脚本一起使用。

欢迎所有关于如何前进的想法!

P.S:msdn容器论坛上的同样问题posted

1 个答案:

答案 0 :(得分:0)

更改为使用命名管道使其工作,因为似乎没有其他人使用docker for windows with serial ports。