我要做的是在本地运行Erlang Observer App,然后连接到正在运行我的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地址,这似乎不起作用。
一旦我运行了那么我希望像这样运行Observer
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()
我可以在不需要知道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地址。
感谢任何帮助。
答案 0 :(得分:1)
我可以在不需要知道IP地址的情况下启动Phoenix服务器 并且仍然能够与Observer远程连接?
是,您可以使用DNS。当然,您至少需要知道运行Erlang节点的服务器的完全限定域名。虽然不像Erlang节点短名称那么短(例如node@server
),但它仍然可能比IP地址更好。我对Docker不太熟悉,因此坚持使用IP地址可能更容易。在这种情况下,它不会给你带来很多。
一旦我运行了那么我希望像这样运行Observer
erl -name observe@127.0.0.1 -setcookie random_cookie -run observer
您在运行此命令的服务器是什么?它需要在具有Wx支持的Erlang编译的机器上。如果这个机器与运行凤凰服务器的机器不同,那么这将不起作用(我理解的情况就是这样)。
您需要执行以下操作:
在运行phoenix的容器中找到epmd端口
$ ssh phoenix-host "epmd -names"
epmd: up and running on port 4369 with data:
name some_phoenix_node at port 58769
请注意epmd本身的端口以及您要调试的节点的端口。使用您找到的端口重新连接到phoenix主机:
$ ssh -L 4369:localhost:4369 -L 58769:localhost:58769 phoenix-host
在您的计算机上,启动一个运行观察者应用程序的隐藏Erlang节点:
$ iex -name debug@127.0.0.1 -setcookie <phoenix-server-cookie> -hidden -run observer
该应用程序应该打开,您应该能够选择运行凤凰服务器的节点。
来源:https://gist.github.com/pnc/9e957e17d4f9c6c81294
2017年2月20日更新
我写了一个可以自动执行上述操作的脚本。 epmd知道的所有端口都转发到localhost:https://github.com/Stratus3D/dotfiles/blob/master/scripts/tools/epmd_port_forwarder