我想在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
这些是我跑的命令:
docker build -t oror/rust-test
docker run -it -p 8080:8080 --rm -v $(pwd):/source -w /source oror/rust-test cargo run
docker ps
ifconfig
获取我机器的IP地址:192.168.0.6
curl 192.168.0.6:8080
连接到我的防锈网络应用curl:(52)来自服务器的空回复
我已经尝试了localhost:8080
,但仍然可以获得相同的输出。
我错过了什么?
答案 0 :(得分:12)
问题是您的Web服务器正在侦听来自127.0.0.1(本地接口)但来自容器内部的请求。从容器的角度来看,你的主机在外面,所以你需要收听来自0.0.0.0的请求,然后它应该可以工作。
Iron::new(hello_world).http("0.0.0.0:8080").unwrap();
如果您需要过滤请求的来源,我建议您使用防火墙或类似设备从容器外部进行过滤。