1

在带有 Windows Server 2016 TP5(来宾 vm)的 Win7(主机)和 Virtual Box 上运行。在 WS2016 上,我运行 docker,将 windowsservercore 基础映像用于容器。

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

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

在 windows XP/7/Server 2016 中,我已成功使用com0com(2.2.2.0 signed)创建虚拟 com 端口。

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

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

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

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

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

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

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

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

注意!:这是设备的正确“路径”吗?

值得注意的结果为零,com0com setupc命令给出相同的结果,与模式相同

奇怪的是,当我运行 powershell 并列出串行端口时,我得到了主机上可用的预期 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 标志来 docker run,假设您可以在 hyper-v 容器中安装 com0com 驱动程序,而不必尝试共享它们从主机。

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

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

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

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

PS:在 msdn 容器论坛上发布了相同的问题

4

1 回答 1

0

更改为使用命名管道使其工作,因为似乎没有其他人将 docker 用于具有串行端口的 Windows。

于 2016-10-25T11:17:15.630 回答