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

Sas*_*eca 5 erlang networking elixir docker epmd

我有一个运行在Docker容器中的Elixir应用程序(在我的笔记本电脑中)。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
Run Code Online (Sandbox Code Playgroud)

Docker容器公开以下端口:

0.0.0.0:4000->4000/tcp, 0.0.0.0:4369->4369/tcp, 0.0.0.0:9000->9000/tcp

  • Phoenix服务器4000
  • EPMD 4369
  • 9000用于VM节点

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

iex --name local@127.0.0.1 --cookie secret 导致此错误: Protocol 'inet_tcp': register/listen error: 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
Run Code Online (Sandbox Code Playgroud)

我不确定该如何解决。我正在关注此博客文章

seb*_*now 2

难道不是更简单的解决方案是更改 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`
Run Code Online (Sandbox Code Playgroud)