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的client
function)。 这是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()
指向该名称。