将 Erlang Observer 应用程序与 Docker 内的远程 Elixir Phoenix 服务器结合使用

shd*_*ers 5 erlang elixir docker

我想做的是在本地运行Erlang Observer 应用程序,然后连接到在生产中运行我的 Elixir/Phoenix 应用程序的远程 Docker 容器。

我遇到的问题是无法连接。

根据我的研究,我似乎需要在启动 Phoenix 服务器之前知道 Docker 映像的 IP 地址,以便我可以像这样启动它:

iex --name my_app@10.20.57.123 -S mix phoenix.server

我不确定是否需要cookie,所以我也尝试过

iex --name my_app@10.20.57.123 --cookie random_cookie -S mix phoenix.server

我尝试过使用主机名而不是 IP 地址,但这似乎不起作用。

一旦我运行了它,我希望像这样运行观察者

erl -name observe@127.0.0.1 -setcookie random_cookie -run observer

或者,使用 IEx

iex --name observe@127.0.0.1 --cookie random_cookie

iex> :observer.start()
Run Code Online (Sandbox Code Playgroud)

我可以在不需要知道IP地址的情况下启动Phoenix服务器并且仍然能够远程连接Observer吗?

我可以在使用此 shell 命令构建 docker 映像的过程中找出它的 IP 地址

ip addr | grep -Eo 'inet (.*) scope global' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

但不知道如何将其放入命令中来启动 Phoenix 服务器。

我知道有一个可能的解决方案,可以使用静态 IP 地址启动 docker 映像,但我无法通过我的设置设置静态 IP 地址。

任何帮助表示赞赏。

Str*_*s3D 1

我可以在不需要知道IP地址的情况下启动Phoenix服务器并且仍然能够远程连接Observer吗?

是的,使用 DNS 就可以。当然,您至少需要知道运行 Erlang 节点的服务器的完全限定域名。虽然不像 Erlang 节点短名称(例如node@server)那么短,但它仍然可能比 IP 地址更好。我对 Docker 不太熟悉,所以坚持使用 IP 地址可能更容易。在这种情况下,它不会给你带来很多好处。

一旦我运行了它,我希望像这样运行观察者

erl -name observe@127.0.0.1 -setcookie random_cookie -run observer
Run Code Online (Sandbox Code Playgroud)

您在什么服务器上运行此命令?它需要位于已编译并支持 Wx 的 Erlang 的机器上。如果这是在与您运行 Phoenix 服务器的机器不同的机器上,则它将无法工作(这就是我所理解的情况)。

你需要做这样的事情:

  1. 找到运行phoenix的容器上的epmd端口

    $ ssh phoenix-host "epmd -names"
    epmd: up and running on port 4369 with data:
    name some_phoenix_node at port 58769
    
    Run Code Online (Sandbox Code Playgroud)

    记下 epmd 本身的端口以及您有兴趣调试的节点的端口。使用您发现转发的端口重新连接到 phoenix 主机:

    $ ssh -L 4369:localhost:4369 -L 58769:localhost:58769 phoenix-host
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在你的机器上,启动一个运行观察者应用程序的隐藏 Erlang 节点:

    $ iex -name debug@127.0.0.1 -setcookie <phoenix-server-cookie> -hidden -run observer
    
    Run Code Online (Sandbox Code Playgroud)

    该应用程序应该打开,您应该能够选择运行 phoenix 服务器的节点。

来源:https ://gist.github.com/pnc/9e957e17d4f9c6c81294

更新 2/20/2017

我编写了一个可以自动执行上述操作的脚本。epmd 知道的所有端口都转发到本地主机:https ://github.com/Stratus3D/dotfiles/blob/master/scripts/tools/epmd_port_forwarder