【问题标题】:Running rust on Docker: Empty reply from server在 Docker 上运行 rust:来自服务器的空回复
【发布时间】:2017-05-21 14:47:20
【问题描述】:

我想在 docker 容器中运行一个 rust web 应用程序。我对这两种技术都很陌生,所以我一开始很简单。

这里是main.rs

extern crate iron; 
use iron::prelude::*; 
use iron::status; 
fn main() { 
    fn hello_world(_: &mut Request) -> IronResult<Response> {
        Ok(Response::with((status::Ok, "Hello World!"))) 
    } 
    Iron::new(hello_world).http("127.0.0.1:8080").unwrap(); 
}

Cargo.toml

[package]
name = "docker"
version = "0.1.0"

[dependencies]
iron = "*"

Dockerfile(改编自this教程)

FROM jimmycuadra/rust

EXPOSE 8080
COPY Cargo.toml /source
COPY src/main.rs /source/src/
CMD cargo run

这些是我运行的命令:

  1. docker build -t oror/rust-test
  2. docker run -it -p 8080:8080 --rm -v $(pwd):/source -w /source oror/rust-test cargo run
  3. docker ps

Terminal Ouput

  1. ifconfig获取我机器的IP地址:192.168.0.6
  2. curl 192.168.0.6:8080 连接到我的 rust 网络应用程序

curl: (52) 来自服务器的空回复

我已经尝试过localhost:8080,但仍然得到相同的输出。 我错过了什么?

【问题讨论】:

  • 你在哪里部署了 docker 容器?您还应该检查您是否真的想要-p 8080:80
  • 我将它部署在我的本地机器上。我尝试在没有-p 8080:80 的情况下运行 docker 容器; docker 镜像在 32768 端口上运行。我尝试连接到192.168.0.6:32768,但得到了相同的响应
  • 该端口与您的服务器无关,您仍然需要通过端口 8080 访问它。
  • 好的,我想我不需要-p 8080:80 这行,因为我的 rust 服务器侦听端口 8080,并且该端口在 docker 文件中公开,但我仍然面临同样的问题
  • 改用-p 8080

标签: docker rust


【解决方案1】:

问题是您的 Web 服务器正在侦听来自 127.0.0.1(本地接口)的请求,但来自您的容器内部。从容器的角度来看,你的主机在外面,所以你需要监听来自 0.0.0.0 的请求,然后它应该可以工作。

Iron::new(hello_world).http("0.0.0.0:8080").unwrap(); 

如果您需要过滤请求的来源,我建议您使用防火墙或类似的东西从容器外部进行。

【讨论】:

    猜你喜欢
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2015-07-16
    • 1970-01-01
    • 2012-08-10
    • 2015-12-20
    • 2017-08-27
    相关资源
    最近更新 更多