net_adm:从一个容器ping到另一个容器

时间:2016-08-12 07:28:03

标签: docker erlang docker-compose

使用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消息传递...

1 个答案:

答案 0 :(得分:1)

可能存在多个问题,但我发现至少有一个问题是您尝试ping server那里不是有效的节点名称。当您启动Erlang节点时,它会获得一个<name>@<host>形式的名称,其中host是运行它的机器的主机名。我不确定它如何适用于容器。您可以尝试在服务器上运行node()以查看整个节点名称,并将net_adm:ping()更改为指向该名称。

相关问题