我正在使用 Ubuntu 镜像在 Windows 10 上使用 WSL2,并使用 WSL 集成的 Docker for Desktop Windows (2.2.2.0)。
我有一个 super 基本的 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
并毫无问题地运行二进制文件;上面的行打印,我可以 curl localhost:8080
来自 WSL 并查看我对其余代码的期望的响应。我想把它变成一个 docker 图像。这是 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
我看到了
Listening on 8080
正如预期的那样(即没有 panic ),但试图 curl localhost:8080
产量 curl: (52) Empty reply from server
.这个,我不知道该怎么说。日志记录表明我的程序达到了 listener.incoming()
,但不进入区 block 。要查看它是否与我的设置(桌面版 Docker、WSL 等)或我的 Dockerfile 有关,我按照 docker-http-https-echo 的 README 进行操作。图片,成功。我可以在指定的端口上 curl 它。
我不知道如何进一步调试。提前致谢。
最佳答案
EXPOSE
关键字是为容器间通信打开端口,以便使用来自主机的这些端口,您必须使用 -p 8080:8080
通过 docker run
运行 docker 时
关于docker - 在 WSL 2 上通过 Docker 连接到 TCP 服务器时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60690463/