在Docker上连接Erlang节点

4

我有两个包含已发布的Elixir应用程序的Docker镜像。
我在本地机器上运行这两个Docker。
我正在尝试连接这两个节点。
如何在命名节点上运行发布的应用程序?
或者 - 是否有其他方法可以做到这一点?

2个回答

5
这是在没有使用 docker-compose 的情况下创建 Erlang 节点的方法。

1. 创建网络

docker network create example

2. 启动Docker容器

终端1

$ docker run --rm -it --name bar -h bar --net example erlang:19.3 /bin/bash
root@bar:/# erl -sname bar -setcookie example
Erlang/OTP 19 [erts-8.3.5.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V8.3.5.1  (abort with ^G)
(bar@bar)1>

终端 2

docker run --rm -it --name foo -h foo --net example erlang:19.3 /bin/bash
root@foo:/# erl -sname foo -setcookie example
Erlang/OTP 19 [erts-8.3.5.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V8.3.5.1  (abort with ^G)
(foo@foo)1>

3. 检查连通性

终端1

(foo@foo)1> net_adm:ping(bar@bar).
pong

终端2

(bar@bar)1> net_adm:ping(foo@foo).
pong

在运行于Docker容器中的发布版中获取远程shell

1. 在两个Docker容器中的一个中启动bash shell

docker exec -it foo /bin/bash

在这里,foo是docker容器的名称。

2. 开启远程shell

./rel/your_app/bin/your_app console

我假设你知道容器内发布路径的位置。


嗯,我的应用程序已经发布了,但它上面没有安装Erlang/Elixir。 - fay
原则上是一样的。发布包含 Erlang 运行时系统 (ERTS),它启动了一个 Erlang 节点。如果您设置了 docker network 并为运行的 Docker 容器提供了主机 (-h),那么两个 Erlang 节点应该能够相互连接。 - juan.facorro
好的,那么如何在没有交互式 shell 的情况下运行 Erlang/Elixir 命令(以连接节点)? - fay
基于这个评论“所以我可以[...]调用在不同节点上的genserver”,我假设您已经知道如何访问运行在Docker容器上的发布版本的交互式shell。我将提供如何执行此操作的说明更新答案。 - juan.facorro

2
使用docker-compose
类似这样:

docker-compose.yml:

version: "3"
services:
  elixir1:
    image: image-name
    #(other configs here, like ports, volumes)

  elixir2:
    image: image-name
    #(other configs here, like ports, volumes)

然后,您可以使用这些名称将DNS elixir1elixir2之间进行指向。
将您的docker run命令替换为:
docker-compose up

当我使用docker-compose运行镜像时,它们是否连接? - fay
是的,docker-compose默认将容器放置在同一个docker网络中。每个容器都有自己的私有IP,并设置了DNS以将服务名称转换为相应的IP地址。 - Robert
仅仅将它们放在同一个网络下对我来说还不够,我想让它们连接起来,这样我就可以调用不同节点上的genserver。类似于 Elixir 中的 Node.connect - fay
@fay 你有没有找到在docker compose中进行集群的解决方案?我在docker-cloud上使用docker swarm有一个解决方案,但是在docker-compose中的本地开发还没有解决。 - Peter Saxton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接