这里有一些背景故事。我使用微服务架构实现了两个Web API。我正在尝试通过HTTPS访问我的微服务。这些微服务是使用.net核心开发的,因此根据Microsoft文档,要实施HTTPS,我需要配置Kestrel。以下是我的操作方式。
.UseKestrel(options =>
{
options.Listen(IPAddress.Loopback, 5000);
options.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("cert.pfx", "pwd");
});
})
为简单起见,我自己使用kestrel并跳过反向代理。我当然会将Nginx包括为反向代理,但这是未来的工作。我在本地测试,它有效。然后,我将其部署到Docker。这是docker-compose.override文件
version: '3.4'
services:
dataservice:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
ports:
- "5000:80"
- "5001:443"
在dockerfile中,端口5000和5001被暴露。我将项目构建到图像中,并使用docker run -it --rm -p 5000:80 --name *name* *imagename*
在docker上运行。 Docker显示Now listening on: http://127.0.0.1:5000
和Now listening on: https://127.0.0.1:5001
。现在的问题是,撇开https部分,API甚至无法通过http访问。浏览器仅显示This page isn’t working 127.0.0.1 didn’t send any data. ERR_EMPTY_RESPONSE
。我从这里Docker: cannot open port from container to host
找到了一个类似的问题,这某种程度上是关于服务器应该听0.0.0.0的问题。尽管我不完全了解原因,但我将茶est配置更改为
options.Listen(IPAddress.Any, 5000);
再次构建并运行docker镜像,并且Docker显示Now listening on: http://0.0.0.0:5000
,但仍然无法正常工作。我还尝试用localhost
替换IP,它没有用。我没有使用.UseHttpsRedirection()
,https应该与该问题无关。
我缺少任何配置还是做错了什么?如果有人可以阐明一点,那将真的很有帮助。预先谢谢你。
答案 0 :(得分:1)
您应该<div class="main">
<headertext>ExampleTitle</headertext>
<p>Welcome to my website.</p>
</div>
在容器内部的80和443上,即listen
,因为此docker声明
options.Listen(IPAddress.Any, 80);
表示本地端口80(源代码中的端口)已导出到外部端口5000,而不是相反。