docker-for-windows - 配置 Akka.Net Remoting,以便(Windows)docker 容器内的进程可以与本地主机上的进程通信

标签 docker-for-windows akka.net

我有 2 个 Akka.Net 进程,它们通过远程处理相互通信。

进程 1 具有以下 app.hocon:

 akka{
 actor{
    provider = remote
 }

 remote{
    dot-netty.tcp.port = 1111
 }
}

进程 2 具有以下 app.hocon:

 akka{
 actor{
    provider = remote
 }

 remote{
    dot-netty.tcp.port = 2222
    dot-netty.tcp.hostname = "localhost"

 }
}

请注意,配置非常简单,因为两个进程都位于本地主机上。

进程 1 使用以下命令连接到进程 2 参与者:

Process1ActorSystem.ActorSelection($"akka.tcp://Process2ActorSystem@localhost:2222/user/someActor");

进程 2 在收到来自进程 1 的“SubscribeMessage”后,将数据“告诉”回进程 1 (Context.Sender.Tell)。

当两个进程在同一台计算机上运行时,它们可以很好地相互通信。

进程 2 在 Docker 容器内运行时似乎本身工作正常(进程 1-<->进程 2 通信除外)。

但是,我根本不清楚需要将什么内容放入进程 2 dockerfile、docker run 命令、进程 1 hocon 和进程 2 hocon 中,以便进程 1 在进程 2 运行 a 时仍然可以通话容器。

我想我需要在 Process 1 hocon 和 Process 2 hocon 中获得这些值的某些子集的正确组合,并在我的 dockerfile 中获得正确的 EXPOSE 语句和/或在我的 docker run 中获得正确的端口映射。

Process 1 hocon:    
   "port" : "1111".     
    #"hostname": "???? or omit",
    #"bind-hostname": "???? or omit",
    #"bind-port": "???? or omit",
    #"public-hostname": "???? or omit",
    #"public-port": "???? or omit",

Process 2 hocon:    
    "port" : "2222".     
    #"hostname": "???? or omit",
    #"bind-hostname": "???? or omit",
    #"bind-port": "???? or omit",
    #"public-hostname": "???? or omit",
    #"public-port": "???? or omit",

Dockerfile:
    EXPOSE 2222 #or omit?

Docker run:
  docker run -p 2222:2222 mycontainer

非常感谢任何指导。

更新:

我提高了调试日志级别,现在当进程 1 尝试发送消息时,我可以从进程 2 中看到这一点。注意:容器的IP是172.22.87.66,这是进程1寻址的地方。但似乎因为进程 2 的主机名是 0.0.0.0,所以它收到了消息,但拒绝了它。

也许我可以通过将 Process 2 hocon 更改为主机名 172.22.87.66 来解决此问题,但每次运行容器时该 IP 地址都会发生变化,因此这不能成为整个解决方案。

[ERROR][3/7/2020 10:24:03 AM][Thread 0010][akka.tcp://<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="662705120914351f1512030b34030b091203542656485648564856" rel="noreferrer noopener nofollow">[email protected]</a>:8222/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FActorSystemRemote1%40host.docker.internal%3A8111-1/endpointWriter] Dropping message [Akka.Actor.ActorSelectionMessage] for non-local recipient [[akka.tcp://<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2a6b495e45587953595e4f47784f47455e4f186a1b1d1804181804121d041c1c" rel="noreferrer noopener nofollow">[email protected]</a>:8222/]] arriving at [akka.tcp://<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d697b5a2b9a485afa5a2b3bb84b3bbb9a2b3e496e7e1e4f8e4e4f8eee1f8e0e0" rel="noreferrer noopener nofollow">[email protected]</a>:8222] inbound addresses [akka.tcp://<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a9e8caddc6dbfad0daddccc4fbccc4c6ddcc9be999879987998799" rel="noreferrer noopener nofollow">[email protected]</a>:8222]

更新2

好的,现在我确实有两个进程进行通信,但这不是一个可行的长期设置。我附加到正在运行的容器并执行 ipconfig 来获取其 IP。我想我可以使用

docker network inspect nat 

或类似的。

获得 IP 后,我在正在运行的容器内编辑 app.hocon 并重新启动 Process2 可执行文件。

然后,我从进程 1 使用该 IP 寻址进程 2。

此外,进程 1 正在使用 host.docker.internal 的公共(public)主机名,我认为这对于进程 2 能够解决该问题是必要的。

akka{
 actor{
    provider = remote
 }

 remote{
    dot-netty.tcp.port = 8111,
    dot-netty.tcp.hostname = 172.22.80.1
    dot-netty.tcp.public-hostname=host.docker.internal
 }
}

enter image description here

最佳答案

结果非常简单。

akka{
 actor{
    provider = remote
 }

 remote{
    dot-netty.tcp.port = 1111
 }
}
Process 2 has the following app.hocon:

 akka{
 actor{
    provider = remote
 }

 remote{
    dot-netty.tcp.port = 2222
    dot-netty.tcp.public-hostname = "localhost" //this was the key addition

 }
}

docker run -p 2222:2222 myimage

并且 dockerfile 中包含 EXPOSE 2222。

关于docker-for-windows - 配置 Akka.Net Remoting,以便(Windows)docker 容器内的进程可以与本地主机上的进程通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60562962/

相关文章:

docker - Docker Windows和Linux

powershell - 如何读取 Dockerfile 中的 Powershell 变量?

c# - 如何配置 Akka.NET 来记录参与者收到的所有消息?

c# - 使用 Windows 容器在 Docker Desktop 中运行 ASP.NET 时,传出 HTTP 请求超时

Docker Compose up 命令经常超时

c# - AKKA.NET 问题 : Is it a good idea to have more than one ActorSystem in an application?

c# - 抑制警告消息 Akka.net

c# - 在 akka.net Actor 中安全地使用事件处理程序

c# - 具有状态构造函数参数的 Akka .NET 中的依赖注入(inject)

docker - 从 Linux docker 访问本地机器上的 Cosmos db 模拟器