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

玩Erlang和Docker容器。 我在两个容器中创build了一个玩具应用:客户端和服务器。 以下是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的clientfunction)。 这是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 . . . 

最终客户感到无聊而放弃。

你能看到我要去哪里吗?

我看过克里斯·史密斯的这篇文章 ,这真的很不错。 但克里斯使用套接字,而我想利用本地Erlang消息传递…

可能有多个问题,但至less有一个我可以发现的是,你正在尝试ping server ,这是不是一个有效的节点名称。 当你启动一个Erlang节点时,它会得到一个<name>@<host>forms的<name>@<host> ,其中host是运行它的机器的主机名。 我不知道如何适用于容器。 您可以尝试在服务器上运行node()来查看整个节点名称,并将net_adm:ping()指向该名称。