如何通过互联网连接到Docker容器中打开的tcp端口



最近我开始学习网络编程。我已经写了简单的服务器程序

fn main() {
println!("Start server");
let server = TcpListener::bind("0.0.0.0:7878").unwrap();
match server.accept() {
Ok((_socket, addr)) => {
println!("new client: {:?}", addr);
loop {
//do something
}
}
Err(e) => { println!("couldn't accept the client: {:?}", e) }
}
println!("server disconnect")
}

现在我想在docker容器中运行它,并使它可以从互联网上访问。我的意思是,当我运行docker容器时,我想从另一台计算机连接到tcp侦听器。

在运行docker容器后,我尝试使用我的公共ip地址连接到那个端口。但我总是收到超时错误

要运行容器,我使用docker run --rm -dp 7878:7878 appname

当我使用localhost连接到那个端口时,一切都很好

您需要在主机上运行任何类型的服务器,然后在运行docker容器时进行端口绑定。

例如,在您的主机上运行服务器,在该服务器上公开端口5000,然后运行

docker run -p 5000:<docker_app_port> container

这将创建某种代理,每当有人从另一个IP连接到您的主机的IP,连接到端口5000时,将通过端口暴露重定向到您的docker容器。

我建议看一下docker compose命令。不知道任何Rust(程序的语言(,但看起来它正在侦听localhost上的端口7878。您可能已经在运行Dockerfile。docker compose可以将端口7878暴露给容器运行的主机:

docker-compose.yml:

version: "3.9"
services:
web:
build: .
container_name: "rust_container"
ports:
- "3000:7878"

使用运行

docker-compose up 

注意端口:";3000:7788";。这意味着在Docker容器中,端口7878发布在端口3000上的主机上。因此,可以在http://localhost:3000/

在描述中放入您的Cargo.toml、Dockerfile和所有其他必要的文件。然后我可以创建一个工作示例。

最新更新