我尝试从在 Docker 容器中运行的 C# 控制台应用程序打开一个端口。我认为根本问题是我无法绑定到 0.0.0.0:1234。为了演示这个问题,我将分享一个简单的 Web 服务器。我收到错误消息
System.Net.HttpListenerException:“不支持该请求。”
运行以下代码时:
using System.Net;
using System.Text;
string html = "<html><body><h1>Hello World</h1></body></html>";
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://0.0.0.0:1234/");
//listener.Prefixes.Add("http://localhost:1234/");
listener.Start();
while (true)
{
HttpListenerContext context = listener.GetContext();
HttpListenerResponse response = context.Response;
byte[] buffer = Encoding.UTF8.GetBytes(html);
response.ContentLength64 = buffer.Length;
Stream output = response.OutputStream;
output.Write(buffer, 0, buffer.Length);
output.Close();
}
我使用 VS 2022 集成 docker 设施运行代码。我的 Dockerfile 如下所示:
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
EXPOSE 1234
USER app
WORKDIR /app
[...]
还有我的 docker-compose.yml:
services:
demo:
image: ${DOCKER_REGISTRY-}demo
build:
context: .
dockerfile: demo/Dockerfile
ports:
- "1234:1234"
如何从浏览器 http://localhost:1234 访问我的容器?
我在主机上执行了代码(不涉及 docker),并且在绑定到 localhost:1234 时它起作用了。
在 docker 容器中托管时,我尝试绑定到 localhost:1234。没有发生错误,但浏览器告诉我服务器似乎没有启动。
我检查了绑定到 localhost:1234 时映射是否有效(这让我得出结论,我应该绑定到 0.0.0.0:1234)。
docker port demo_1
1234/tcp -> 0.0.0.0:1234
我尝试了几个端口(80、8080,最后是 1234),以免与图像中的某些预定义配置发生冲突。
我尝试查找一些有关潜在环境变量的文档,但您发现的所有文档似乎都与 ASP 相关。
Docker 容器有自己的虚拟网络配置。尝试将侦听器更改为以下内容,以便它将绑定到任何 IP 地址并允许所有 HTTP 方法:
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://+:1234/");
然后您应该能够通过以下方式访问主机上的容器:
http://localhost:1234