【问题标题】:net_adm:ping from one container to anothernet_adm:从一个容器ping到另一个
【发布时间】:2016-12-19 03:11:47
【问题描述】:

玩转 Erlang 和 Docker 容器。我跨两个容器创建了一个玩具应用程序:客户端和服务器。这是 docker-compose.yml 文件:

version: '2'
services:
    client:
        image: test3_client
        links:
            - server
    server:
        image: test3_server

这是服务器的 Dockerfile

FROM erlang:19.0
ADD . /app
WORKDIR /app
CMD erl -sname server -setcookie abc -noshell -s test3 start

(客户端大致相同,只是名称为client并进入test3的client函数)。这是 Erlang 代码:

-module (test3).

-compile(export_all).

start() ->
    register(greeter, spawn(fun() -> loop() end)) .

loop() ->
    io:format("server loop~n"),
    receive
        {greeting, Sender, Name} ->
            io:format("greeting: ~w~n", [Name]),
            Sender ! {response, self(), "Yowser " + Name}
    end,
    loop() .

client() ->
    timer:sleep(250),
    ok = ping_server(10),
    greeter ! {greeting, self, "diego"},
    receive
        {response, Pid, Greeting} ->
            io:format("I was greeted: " + Greeting + "!~n")
    end .

ping_server(Count) ->

    case Count of
        X when X < 1 ->
            {error, "unable to reach server"};
        _ ->
            case net_adm:ping(server) of
                pong ->
                    io:format("found server~n"),
                    ok ;
                pang ->
                    io:format("unable to reach server~n"),
                    timer:sleep(1000),
                    ping_server(Count - 1)
            end
    end .

当我使用docker-compose up 运行容器时,我得到了这个:

docker-compose up
Creating network "test3_default" with the default driver
Creating test3_server_1
Creating test3_client_1
Attaching to test3_server_1, test3_client_1
server_1  | server loop
client_1  | unable to reach server
client_1  | unable to reach server
client_1  | unable to reach server
client_1  | unable to reach server
client_1  | unable to reach server
. . . 

最终客户感到无聊并放弃了。

你能看出我哪里错了吗?

我看过 Chris Smith 的 this post,非常棒。但是 Chris 使用的是套接字,而我想使用原生 Erlang 消息传递...

【问题讨论】:

    标签: docker erlang docker-compose


    【解决方案1】:

    可能存在多个问题,但至少我可以发现一个问题是您正在尝试 ping server,而这不是有效的节点名称。当你启动一个 Erlang 节点时,它会得到一个 &lt;name&gt;@&lt;host&gt; 形式的名称,其中 host 是运行它的机器的主机名。我不确定它如何与容器一起使用。您可以尝试在您的服务器上运行 node() 以查看整个节点名称是什么,然后将您的 net_adm:ping() 更改为指向它。

    【讨论】:

    • 我尝试了两种方式 - 我使用了“server@localhost”,因为两个容器都在同一个主机上,所以应该可以工作......
    • 我将 erlang vm 启动参数更改为使用 erl -name server@servernode 并相应地更改了 ping,结果仍然是 pang,即使当我打印出服务器的节点名称时它也是一样的。
    • 如果在 docker 运行时在主机上运行 epmd -names,它会显示 docker Erlang 节点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多