繁体   English   中英

Docker 容器中的 Rust TCP 服务器不工作

[英]Rust TCP Server in Docker Container Not Working

我很难理解为什么 tcp 服务器不能接受外部请求。

我的服务器:

use std::io::Write;
use std::net::TcpListener;
use std::thread;

fn main() {
    let listener = TcpListener::bind("0.0.0.0:8080").unwrap();
    println!("listening started, ready to accept");
    for stream in listener.incoming() {
        thread::spawn(|| {
            let mut stream = stream.unwrap();
            stream.write(b"Hello World\r\n").unwrap();
        });
    }
}

Docker 文件

FROM rust:1.31

WORKDIR /usr/src/proto-rust
COPY . .

RUN cargo install --path .

EXPOSE 8080

CMD ["cargo", "run"]

在本地运行,这有效

nc 0.0.0.0 8080

运行以下命令后:

docker run --rm -p 8080:8080 --name my-running-app proto-rust

并检查 docker 桥

docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "78d335687fcd96ad1051ca17662024708dff9db4d3043b787a43d29edbb8ff58",
        "Created": "2022-09-03T01:53:48.606052848Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "21a4f5fec2cb2a880ed01c044ccaf001e120c9b507d34fabf93c9da21957d558": {
                "Name": "my-running-app",
                "EndpointID": "34a003ea12612d479e47a61478f3a445455f919a66350b9b5fde651e6cb8a12b",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

运行以下任一操作均无效:

nc 172.17.0.2 8080
nc localhost 8080

我不确定 go 从这里到哪里。 我认为我的 docker 容器的 ip 地址是错误的,因为 netcat 看不到打开的端口? 我不确定这里。 为什么我什至需要额外的地址以及网桥? 这是狂野的 docker 不能只在本地主机上公开。

我最初将服务器设置为 127.0.0.1,然后将其更改为 0.0.0.0,因为 docker 仅绑定在本地主机上。 但是,我没有运行 docker 构建,这意味着更新从未应用于 docker 映像。 运行后

docker build -t proto-rust . 

以下作品:

nc localhost 8080

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM