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

Posted

技术标签:

【中文标题】将本地 Elixir/Erlang 连接到 Docker 容器内正在运行的应用程序【英文标题】:Connecting a local Elixir/Erlang to a running application inside a Docker container 【发布时间】:2018-08-07 07:35:06 【问题描述】:

我有一个 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->4000/tcp, 0.0.0.0:4369->4369/tcp, 0.0.0.0:9000->9000/tcp

凤凰服务器为 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

我不确定如何解决这个问题。我在关注这个blog post。

【问题讨论】:

不确定它是否适用,但之前的S O answer 可能对您的问题有些影响。 【参考方案1】:

更改 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`

【讨论】:

感谢您的回复,但这似乎对解决问题没有帮助 可以指定节点连接的端口吗?喜欢:iex(local@127.0.0.1)1&gt; Node.connect :'test@1.2.3.4:4368'

以上是关于将本地 Elixir/Erlang 连接到 Docker 容器内正在运行的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Elixir/Erlang 并发状态访问

Elixir/Erlang

E1.获取Elixir/Erlang版本信息

Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?

Elixir/Erlang:变量列表与许多其他列表合并时出错

Elixir/Erlang Random/Rand Seed 是不是需要在每个进程上调用?