我可以在 Linux 系统上创建两个链接的虚拟串行端口socat
,并假设一端是串行设备,另一端是使用该设备的一些代码。该socat
命令如下所示:
socat -d -d pty,raw,echo=1 pty,raw,echo=0
它会在系统上创建两个端口,例如/dev/pts/3
和/dev/pts/4
。
现在,我想更进一步,有两个代表系统的 docker 容器:一个容器假装是串行设备,另一个容器是使用该设备的代码。目标是在生产中,我可以删除虚拟设备容器并只使用真正的传感器。
问题是我似乎无法找到devpts
在两个容器之间共享它们的方法,并且不知何故感觉这不是一件好事。
有没有办法通过使用命名管道而不是 pty 来实现完全相同的行为(虚拟串行端口)?然后我可以在容器之间共享文件(比如“/home/user/folder/my_pipe”)(实际上我会在两者上安装“/home/user/folder”,然后两者都可以访问my_pipe
)。
还是有另一种更好的方法来使用 docker 完成所有这些工作?
(顺便说一句,“虚拟串行端口”是 Windows 术语,在 Unix 上这些东西称为“(伪)tty”。)
ctrl-alt-delor 的意思是你可以
socat
在“串行设备容器”中做一个,socat
在“代码容器”中使用设备做一个;它们通过网络连接进行通信,因此一个容器必须知道另一个容器的 IP 地址和端口,仅此而已(您可以选择哪个容器连接到另一个容器)。此外,在“代码容器”中运行的代码只使用 tty;所以它不依赖于除了 tty 的路径(无论如何应该是参数/命令行参数/等)之外的任何其他内容。通话的详细信息
socat
取决于您想要做什么的其他一些细节;也许使用tcp-listen
andtcp
是最简单的变体。例如这里有很多socat
例子。编辑
解释命名:tty(电传打字机)是对某些串行端口参数的抽象,以及字符的翻译和解释(如行尾),以及其他类似线路规则的东西。伪 tty 是没有真正硬件的 tty。tty 与文件的不同之处在于它允许
ioctl
s 设置所有这些参数。因此,如果您的程序具有设置波特率的功能,则需要一个 tty。如果没有,您也可以使用命名管道。
但是,在容器之间共享时使用命名管道或 tty 并没有什么区别:您仍然必须在某个地方设置一个通用文件系统,您可以在其中放置其中任何一个。这不一定是(docker)容器通常的工作方式。
OTOH,(docker)容器通常已准备好联网。因此,通过网络连接容器可能会更简单,而不是让它们拥有共享的文件系统。它还有一个额外的优势,即容器不需要在同一主机上运行(docker 容器不假设)。所以更自然的搭配。
当然,您可以按照自己喜欢的方式进行操作。