【问题标题】:Connect erlang nodes on docker在 docker 上连接 erlang 节点
【发布时间】:2017-12-16 20:40:57
【问题描述】:

我有两个 docker 镜像,其中包含一个已发布的 elixir 应用程序。
我在本地机器上运行这两个 docker。
我正在尝试连接这两个节点。
如何在命名节点上运行已发布的应用程序?
或者 - 还有其他方法吗?

【问题讨论】:

    标签: docker erlang elixir


    【解决方案1】:

    这就是在没有 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。启动远程外壳

    ./rel/your_app/bin/your_app console

    我假设你知道容器内的释放路径。

    【讨论】:

    • 嗯。我的应用程序在图像中发布。上面没有 erlang/elixir。
    • 原理是一样的。该版本包含启动 Erlang 节点的 Erlang RunTime System (ERTS)。如果设置docker network 并为正在运行的 docker 容器提供主机 (-h),则两个 Erlang 节点应该能够相互连接。
    • 好的,那么如何在没有交互式 shell 的情况下运行 erlang/elixir 命令(连接节点)?
    • 基于此评论“所以我可以 [...] 调用位于不同节点上的 genserver” 我假设您已经知道如何访问交互式 shell 以在 docker 容器上运行您的版本.我将使用有关如何执行此操作的说明更新答案。
    【解决方案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 运行图像时,它们是否已连接?
    • 是的,docker-compose 默认将容器放在同一个 docker-network 中。每个容器都有自己的私有 IP,并设置了 DNS 以便将服务名称转换为相应的 IP。
    • 把它放在同一个网络上对我来说是不够的,我希望它们能够连接起来,所以我可以,例如,调用不同节点上的 genserver。类似于:Node.connect 在长生不老药中
    • @fay 你有没有在 docker compose 中找到集群的解决方案。我在 docker-cloud 上有一个使用 docker swarm 的解决方案,但无法在 docker-compose 中为本地开发解决它
    猜你喜欢
    • 1970-01-01
    • 2019-07-19
    • 2011-04-11
    • 2014-06-28
    • 2013-04-16
    • 2022-01-25
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多