我写了一个简单的docker映像,它启动了一个Erlang节点(rebar3
版本,console
启动模式)。它启动得很好,让我可以从容器内部ping节点。但是,我不能让erl
shell从hostping它-它只是返回pang
,并且在dockerized控制台中没有记录任何内容。Dockerfile
只是启动节点,并不执行任何更有趣的操作。
清单
- Cookie已设置并匹配
- 在两个节点上都设置了
sname
- 可从其他容器节点访问Docker节点
- 我使用完整的sname引用Docker节点(尝试了
nodename@localhost
、nodename@machinename
和nodename@127.0.0.1
) epmd
端口已暴露(也尝试不使用它)
我忘了什么才能让它工作呢?
1条答案
按热度按时间ui7jx7zq1#
有几种方法可以做到这一点,但在此之前,让我们先设定一些关键的想法:
1.下面的脚本在docker内部运行,模拟一个节点,它只是等待一个节点连接,打印它并终止。
1.为了使分发协议成功,不仅需要以用于ping的名称到达节点,而且整个节点名称都必须匹配。
-node
可以与IP一起使用,它将广泛用于以下命令选项
现在,让我们来看看选项(所有命令都将在不同的终端中运行)
Docker:主机网络命名空间
当在host的网络名称空间(
--net=host
)中启动docker时,这与在docker外部运行两者没有区别(出于网络目的)。Docker:使用Docker的默认网桥(
docker0
)默认情况下,Docker在自己的桥中启动容器,这些IP不需要公开任何端口就可以到达。
ip a show docker0
lists 172.17.0.1/16 for my machine, and erlang listens in 172.17.0.2 (shown indocker inspect <container>
)Docker :使用其他 Docker 桥
只需创建新网络并使用新网络中的ips重复前面的步骤即可
Docker:暴露带有两个EPMD的端口
当暴露端口时,您必须同时处理端口和ip,因为EPMD端口必须相同。
在这种情况下,您将有两个epmd,一个用于主机,另一个用于容器(EPMD拒绝来自非本地对等体的名称请求),监听同一个端口号。
这里的技巧是(ab)使用127.0.0. * ips,这些ips全部指向localhost来模拟不同的节点。
坞站合成
docker-compose
允许您轻松设置多容器系统。使用它,您无需创建/检查网络。给定以下
docker-compose.yaml
:如果运行以下
docker-compose run
命令,您将看到结果: