通过WSL2上的Docker连接到TCP服务器时出现问题

通过WSL2上的Docker连接到TCP服务器时出现问题,docker,rust,windows-subsystem-for-linux,Docker,Rust,Windows Subsystem For Linux,我在Windows10上使用的是WSL2,使用的是Ubuntu映像,桌面Windows的Docker(2.2.2.0)和WSL集成 我有一个超级基本的tcp服务器。我认为唯一相关的是: let listener = TcpListener::bind("127.0.0.1:8080").unwrap(); println!("Listening on 8080"); for stream in listener.incoming() { println!("Received connec

我在Windows10上使用的是WSL2,使用的是Ubuntu映像,桌面Windows的Docker(2.2.2.0)和WSL集成

我有一个超级基本的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安装
并运行二进制文件而不会出现问题;上面这行显示,我可以从WSL中卷曲
localhost:8080
,并看到我期望从其余代码中得到的响应

我想把它变成一个码头工人的形象。这是Dockerfile

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
我看到
按预期监听8080
(即没有恐慌),但尝试
curl localhost:8080
会产生
curl:(52)来自服务器的空回复。这个,我不知道该怎么办。日志记录表明我的程序到达它到达的点,即它到达了
listener.incoming()
,但没有进入块

为了查看这是否与我的设置(Docker for Desktop、WSL等)或Dockerfile有关,我成功地遵循了图像的自述文件。我可以在指定的端口上卷曲它


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

EXPOSE
关键字是打开集装箱间通信的端口,以便从主机使用这些端口。您必须使用
-p 8080:8080
,同时通过
docker run运行docker

@Carlosrafielramirez为我解决了这个问题。它就像绑定到
0.0.0.0
一样简单,而不是环回地址
127.0.0.1
。更多信息请点击此处:

噢,天哪,我确实试过这个,但我忘了解决这个问题。我会更新帖子的。简言之,我收到的是来自服务器的
curl:(52)空回复,并且Ctrl-C问题仍然存在。@esel您不需要任何其他文件来运行coolserver只要一个文件,不需要复制任何其他依赖项这是一个多阶段构建,因此第一阶段我复制源文件,以便在Docker中构建它。在第二种情况下,我只是将构建的二进制文件复制到最终图像中。我误解你了吗?更重要的是,这与我面临的问题有什么关系?如果只复制了部分文件,那么这不是docker问题,而是脚本问题,要确保您的服务器拥有所有文件您是否尝试过TcpListener::bind(“0.0.0.0:8080”)。?或者在localhost之外听些什么?docker容器内的Localhost与outside@CarlosRafaelRamirez就这样!我想是对环回ip的误解吧。我还有一个问题#2W.r.t.Ctrl-C没有传播,我愿意听取你们的任何意见,尽管我可以单独问。如果你写这篇文章作为回答,我会接受的。我认为Ctrl+C的问题是很正常的。使用Ctrl+C而不是终端的是您的进程。你可以用telnet命令体验同样的行为。我不太确定。我做了一些研究,在仍然接受终止的情况下,我成功地运行了http echo映像。我的小程序在直接运行可执行文件时处理得很好。我在echo应用程序的Dockerfile中没有看到任何关于正确处理信号的建议。
-it
标志应该足够了!不是某个人。是卡洛斯·拉斐尔·拉米雷斯。通常情况下,你应该让他将此作为回答,而不是让你接受你的建议response@SajithSilva是的,请查看我的第一个评论回复。我想结束这一切。如果他们决定回答,我会为了他们的利益删除这个。