在带有 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 容器论坛上发布了相同的问题