配置 Akka.Net 远程处理,使 (windows) docker 容器内的进程可以与本地主机上的进程通信
Configure Akka.Net Remoting such that process inside (windows) docker container can talk to process on local host
我有 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" 后,"Tells" 数据返回给进程 1 (Context.Sender.Tell)。
当两个进程 运行 在同一台机器上时,它们可以很好地相互通信。
当 docker 容器内的 运行 时进程 2 本身似乎运行良好(进程 1-<->进程 2 通信除外)。
但是,我一点都不清楚我需要在进程2 docker文件,docker 运行命令,进程1 hocon和进程中放入什么2 hocon 以便当进程 2 运行正在容器中时进程 1 仍然可以通信。
我想我需要在 Process 1 hocon 和 Process 2 hocon 中获得这些值的某些子集的正确组合,并在我的 docker 文件 and/or 中获得正确的 EXPOSE 语句我的 docker 运行.
中正确的端口映射
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://ActorSystemRemote2@0.0.0.0: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://ActorSystemRemote2@172.22.87.66:8222/]] arriving at [akka.tcp://ActorSystemRemote2@172.22.87.66:8222] inbound addresses [akka.tcp://ActorSystemRemote2@0.0.0.0:8222]
更新 2
好的,现在我确实有两个进程在通信,但这不是一个可行的长期设置。我附加到 运行ning 容器并执行 ipconfig 以获取其 IP。我想我可以使用
docker network inspect nat
或类似。
获得 IP 后,我在 运行ning 容器中编辑 app.hocon 并重新启动 Process2 可执行文件。
然后,我使用该 IP 从进程 1 寻址到进程 2。
进程 1 还使用 public-host.docker.internal 的主机名,我认为这是进程 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
}
}
原来很简单
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 运行 -p 2222:2222 myimage
并且 docker 文件中有 EXPOSE 2222。
我有 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" 后,"Tells" 数据返回给进程 1 (Context.Sender.Tell)。
当两个进程 运行 在同一台机器上时,它们可以很好地相互通信。
当 docker 容器内的 运行 时进程 2 本身似乎运行良好(进程 1-<->进程 2 通信除外)。
但是,我一点都不清楚我需要在进程2 docker文件,docker 运行命令,进程1 hocon和进程中放入什么2 hocon 以便当进程 2 运行正在容器中时进程 1 仍然可以通信。
我想我需要在 Process 1 hocon 和 Process 2 hocon 中获得这些值的某些子集的正确组合,并在我的 docker 文件 and/or 中获得正确的 EXPOSE 语句我的 docker 运行.
中正确的端口映射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://ActorSystemRemote2@0.0.0.0: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://ActorSystemRemote2@172.22.87.66:8222/]] arriving at [akka.tcp://ActorSystemRemote2@172.22.87.66:8222] inbound addresses [akka.tcp://ActorSystemRemote2@0.0.0.0:8222]
更新 2
好的,现在我确实有两个进程在通信,但这不是一个可行的长期设置。我附加到 运行ning 容器并执行 ipconfig 以获取其 IP。我想我可以使用
docker network inspect nat
或类似。
获得 IP 后,我在 运行ning 容器中编辑 app.hocon 并重新启动 Process2 可执行文件。
然后,我使用该 IP 从进程 1 寻址到进程 2。
进程 1 还使用 public-host.docker.internal 的主机名,我认为这是进程 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
}
}
原来很简单
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 运行 -p 2222:2222 myimage
并且 docker 文件中有 EXPOSE 2222。