我可以使用在 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 完成所有这些工作吗?
答案1
(顺便说一句,“虚拟串行端口”是一个 Windows 术语,在 Unix 上这些东西被称为“(伪)tty”。)
ctrl-alt-delor 的意思是你可以只socat
在“串行设备容器”中执行一项,并socat
在使用该设备的“代码容器”中执行一项;它们通过网络连接进行通信,因此一个容器必须知道另一个容器的 IP 地址和端口,仅此而已(您可以选择哪个容器连接到另一个容器)。另外,“代码容器”中运行的代码只使用 tty;所以它不依赖于除了 tty 的路径之外的任何其他东西(无论如何,它应该是参数/命令行参数/等等)。
通话的详细信息socat
取决于您想要执行的其他一些详细信息;也许使用tcp-listen
andtcp
是最简单的变体。有很多socat
例子,例如这里。
编辑
解释一下命名:A终端(电传打字机)是对某些串行端口参数的抽象,以及字符的翻译和解释(如行尾)以及其他事物(如行规则)。伪终端是没有真实硬件的终端。 tty 与文件的不同之处在于它允许ioctl
s 设置所有这些参数。
因此,如果您的程序具有设置波特率等功能,您就需要一个 tty。如果没有,您也可以使用命名管道。
然而,如果您使用命名管道或 tty 来在容器之间共享,则没有什么区别:您仍然需要在某处设置一个通用文件系统,您可以将它们中的任何一个放在其中。这不一定是(docker)容器通常的工作方式。
OTOH,(docker)容器通常已准备好联网。因此,通过网络连接容器可能更简单,而不是让它们拥有共享文件系统。它还有一个额外的优点,即容器不需要在同一主机上运行(docker 容器不这样做)。所以这是一个更自然的选择。
当然,您可以按照自己喜欢的方式进行。