Проблемы с подключением к серверу TCP через Docker на WSL 2 - PullRequest
2 голосов
/ 15 марта 2020

Я использую WSL2 на Windows 10, используя образ Ubuntu, и Docker для рабочего стола Windows (2.2.2.0) с интеграцией WSL.

У меня есть супер основы c ржавчина 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 и запустить двоичный файл без проблем; напечатанная строка выше, я могу свернуть 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, как и ожидалось (то есть без pani c), но попытка curl localhost:8080 приводит к curl: (52) Empty reply from server. Это, я не знаю, что делать. Ведение журнала предполагает, что моя программа достигает точки, где она достигает listener.incoming(), но не входит в блок.

Чтобы узнать, было ли это как-то связано с моей настройкой (Docker для Desktop, WSL, et c.) Или мой файл Docker, я успешно выполнил README для изображения docker -http-https-echo . Я могу свернуть его на указанных портах.

Я не знаю, как отлаживать дальше. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

@ CarlosRafaelRamirez решил это для меня. Это было так же просто, как привязка к 0.0.0.0, а не к кольцевому адресу 127.0.0.1. Больше информации здесь: https://pythonspeed.com/articles/docker-connection-refused/

0 голосов
/ 15 марта 2020
Ключевое слово

EXPOSE - открыть порты для межконтейнерной связи для использования этих портов с хоста, который вы должны использовать -p 8080:8080 при выполнении docker через docker run

...