2016-08-12 15 views
3

ErlangとDockerのコンテナでの再生。クライアントとサーバーの2つのコンテナに渡っておもちゃアプリを作成しました。ここで net_adm:1つのコンテナから別のコンテナへのping

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関数に入ってくると、ほぼ同じである):ここではドッキングウィンドウ-compose.ymlファイルです。ここではErlangのコードがあります:私はdocker-compose upとコンテナを実行すると、

-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 
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 
. . . 

は、最終的にクライアントが退屈とあきらめます。

どこが間違っているのか分かりますか?

私はthis postをChris Smithさんから見ましたが、これは本当に良いです。しかしクリスはソケットを使用していますが、私はネイティブのErlangメッセージを使っています。

答えて

1

複数の問題があるかもしれませんが、少なくとも1つは、あなたがpingしようとしていることです。server有効なノード名Erlangノードを起動すると、<name>@<host>の形式の名前が取得されます。ここで、hostは、実行しているマシンのホスト名です。私はそれがどのようにコンテナで動作するのか分かりません。サーバ上でnode()を実行して、ノード名全体を確認し、net_adm:ping()をそれを指すように変更することができます。

+0

私はどちらのコンテナも同じホスト上にあったので "server @ localhost"を使用しました... –

+0

erlang vmの起動パラメータを 'erl -name server @それに応じてpingが変更され、結果は「pang」でした。サーバのノード名を印刷しても同じでした。 –

+0

ドッカーが動作している間にホストマシンで 'epmd -names'を実行すると、ドッカーのErlangノードが表示されますか? – kjw0188

関連する問題