将本地Elixir / Erlang连接到Docker容器中正在运行的应用程序

我有一个Elixir应用程序在Docker容器内运行(在我的笔记本电脑中).使用以下命令执行Elixir应用程序:

iex \
  --name test@1.2.3.4 \
  --cookie secret \
  --erl '-kernel inet_dist_listen_min 9000'  \
  --erl '-kernel inet_dist_listen_max 9000' \
  -S mix phx.server

Docker容器公开以下端口:

0.0.0.0:4000-\u0026gt;4000/tcp,0.0.0.0:4369-\u0026gt;4369/tcp,0.0.0.0:9000-\u0026gt;9000/tcp

>凤凰服务器> 4000
EPMD> 4369
VM节点> 9000

然后我尝试使用以下命令使用IEx shell进行连接:

iex –name local@127.0.0.1 –cookie secret导致此错误:
协议’inet_tcp’:注册/监听错误:epmd_close

这似乎是因为本地epmd守护程序试图分配给端口4369,但是,这已经分配给Docker容器.

然后我改变了EPMD端口,如下所示:

ERL_EPMD_PORT = 4370 iex –name local@127.0.0.1 –cookie secret

我设法打开IEx会话.但是,我找不到在Docker容器上运行的节点:

iex(local@127.0.0.1)1> Node.connect :'test@1.2.3.4'
false

我不知道如何解决这个问题.我跟着这个blog post.

最佳答案 改变docker容器的向外端口不是更简单的解决方案吗?只需将其更改为4368

$docker run -itd -p 4000:4000 4368:4369 9000:9000 <docker_image_name> iex \
  --name test@1.2.3.4 \
  --cookie secret \
  --erl '-kernel inet_dist_listen_min 9000'  \
  --erl '-kernel inet_dist_listen_max 9000' \
  -S mix phx.server`
点赞