在 WSL 2 上通过 Docker 连接到 TCP 服务器时遇到问题

Trouble connecting to a TCP server through Docker on WSL 2

我在 Windows 10 上使用 WSL2,使用 Ubuntu 图像,Docker 桌面 Windows (2.2.2.0) 与 WSL 集成。

我有一个超级基本的 rust tcp 服务器。我认为唯一相关的是:

let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
println!("Listening on 8080");
for stream in listener.incoming() {
    println!("Received connection");
    let stream = stream.unwrap();
    handle_connection(stream);
}

我可以 cargo install 和 运行 二进制文件没有问题;打印上面的行,我可以从 WSL 卷曲 localhost:8080 并按照我对其余代码的预期查看响应。

我想把它变成 docker 图片。这是 Docker 文件。

FROM rust:1.40 as builder
COPY . .
RUN cargo install --path . --root .

FROM debian:buster-slim
COPY --from=builder ./bin/coolserver ./coolserver
EXPOSE 8080
ENTRYPOINT ["./coolserver"]

然后我做:

docker build -t coolserver .
docker run -it --rm -p 8080:8080 coolserver

我按预期看到 Listening on 8080(即没有恐慌),但尝试 curl localhost:8080 会产生 curl: (52) Empty reply from server。这,我不知道该怎么办。日志记录表明我的程序到达了 listener.incoming() 的位置,但没有进入块。

为了查看它是否与我的设置(Docker 用于桌面、WSL 等)或我的 Docker 文件有关,我遵循了 docker-http-https-echo 的自述文件图片,成功。我可以将它卷曲到指定的端口。

我不知道如何进一步调试。提前致谢。

EXPOSE 关键字是为容器间通信打开端口,以便从主机使用这些端口,您必须使用 -p 8080:8080 而 运行 docker 通过 docker run

@CarlosRafaelRamirez 帮我解决了。它就像绑定到 0.0.0.0 而不是环回地址 127.0.0.1 一样简单。更多信息在这里:https://pythonspeed.com/articles/docker-connection-refused/