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メッセージを使っています。
私はどちらのコンテナも同じホスト上にあったので "server @ localhost"を使用しました... –
erlang vmの起動パラメータを 'erl -name server @それに応じてpingが変更され、結果は「pang」でした。サーバのノード名を印刷しても同じでした。 –
ドッカーが動作している間にホストマシンで 'epmd -names'を実行すると、ドッカーのErlangノードが表示されますか? – kjw0188