最近,我一直在努力应对docker在网络上的性能不佳的问题,总的来说,与Docker在通过容器的任何通信中引起的延迟有关。
我的情况是这样的:
我有3个互相通信的容器,其中一个(“管理”容器)也通过端口绑定与外部通信,并公开了一些服务以对内部容器进行测试。 对于内部-外部通信,我已经有了一个解决方案(即使我仍在寻找更好的东西,使用桥接网络也可以),但是我真正关心的是容器内通信。
所以这是问题: 我想使用this example provided by Microsoft尝试在Windows主机下的Linux docker容器内的.net核心中使用命名管道。 我使用的是docker-compose,因此我首先假设将npipe作为卷添加会成功,但是我遇到了一些问题。
使用此dockerfile:
version: '3.4'
services:
netcorepipetest.server:
image: netcorepipetestserver
build:
context: .
dockerfile: NetCorePipeTest.Server/Dockerfile
volumes:
- //./pipe/PipeName://./pipe/PipeName
netcorepipetest.client:
image: netcorepipetestclient
build:
context: .
dockerfile: NetCorePipeTest.Client/Dockerfile
volumes:
- //./pipe/PipeName://./pipe/PipeName
并像下面这样稍微修改源代码示例:
服务器部分
发件人:
NamedPipeServerStream pipeServer =
new NamedPipeServerStream("testpipe", PipeDirection.InOut, numThreads);
致
NamedPipeServerStream pipeServer =
new NamedPipeServerStream(@"\\.\pipe\PipeName", PipeDirection.InOut, numThreads);
客户部分
发件人
NamedPipeClientStream pipeClient =
new NamedPipeClientStream(".", "testpipe",
PipeDirection.InOut, PipeOptions.None,
TokenImpersonationLevel.Impersonation);
致
NamedPipeClientStream pipeClient =
new NamedPipeClientStream(@"\\.\pipe\PipeName");
我收到此错误:
Cannot create container for service netcorepipetest.client: b'Mount denied:\nThe source path "\\\\\\\\.\\\\pipe\\\\PipeName://./pipe/PipeName"\nis not a valid Windows path'
好吧,在那之后,我在google上搜索了一下,目的是当我偶然发现github问题(我不太记得如何再次找到它)时变得更加困惑,其中有人提到也许使用了长语法。撰写文件将完成某些操作。更新撰写文件后,将卷行替换为:
volumes:
- type: tmpfs
#source: \\.\pipe\PipeName
target: \\.\pipe\PipeName
在构建过程中我不再遇到错误,但是在执行阶段,应该发生的一切都没有发生。服务器只是挂在那儿什么也没做,而客户端跟进。我究竟做错了什么?在Linux主机上更简单吗?
还是使用自定义命名管道的可能性只是我的幻想?
P.s。 (我使用tmpfs
作为类型,因为bind
就像以前一样,会出错)
版本和工具:
请,如果您需要更多详细信息,请不要害怕询问!