我是Docker的新手,我试图设置2个容器,一个运行mongoDB,一个运行Web应用程序。
问题是我无法通过localhost:5000或0.0.0.0:5000访问我的.NET核心应用程序。
Mongo运行正常。
这是我的docker-compose.yml
/^\d{11}:/g
.NET Core应用程序的Dockerfile
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
mongo:
build: ../../../docker/wishare-mongo/
volumes:
- ../../../docker/wishare-mongo:/data/db
ports:
- "27017:27017"
docker-compose构建和docker-compose运行没有错误,导致Web容器:
web_1 |托管环境:生产 web_1 |内容根路径:/ app web_1 |现在听: http://[::]:80 web_1 |申请开始了。按Ctrl + C关闭 下来。
这是docker ps的结果,应该根据docker ps result导出端口5000。
有什么想法吗?
答案 0 :(得分:2)
看起来.NET在生产中使用端口80,所以当我改变了docker文件并导出端口80而不是5000并且还在docker-compose中将端口5000更改为端口80时,它可以正常工作。
所以我假设为了在端口5000上运行它,它需要在.NET端进行一些配置。
答案 1 :(得分:2)
问题和解决方案摘要:
默认情况下,ASP.NET Core 只侦听 localhost,而不是任何 IP 地址,通常这在代码级别或 appSettings.json 或 launchSettings.json 中配置:http://localhost:5000。您可以轻松地将其更改为“http://*:5000”以解决问题。 (你可以指定你想让应用监听的IP)
验证:
在具有本地主机的容器中工作:
我们可以进入容器 bash,
docker exec -ti <container name> /bin/bash
运行验证
curl -X GET http://localhost:5000
在具有 IP 的容器中不起作用
curl -X GET http://{thecontainer IP}:5000
在带有 localhost 的本地机器上不起作用
在 docker compose 中,甚至映射了 5000:5000。但是在本地电脑上访问 http://localhost:5000 时不起作用
在有IP的本地机器上不起作用
为什么,这是浏览器如何路由到 docker 容器中的应用程序?
如果应用只监听本地主机,那么,
第 4 步:有效。
第 3 步不起作用,
第 2 步和第 1 步不起作用。
因此,解决方案是更改应用程序以确保它同时侦听本地主机和所需的 IP。
这是一个如何解决问题的示例(ASP.NET Core 3.1)。 当然,您可以将这些 URL 放入 appSettings 或其他配置中。
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
// In order to use Docker Container, we need to use *:5000
// to listen all IPs instead of only localhost.
// feel free to move these IPs settings into appSettings.json
webBuilder.UseUrls("http://*:5000","https://*:5001");
})
.UseAutofac()
.UseSerilog();
注意: 如何获取容器IP
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
来自 MSDN 的 ServerUrls 解释
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/web-host?view=aspnetcore-5.0#server-urls(您也可以使用环境变量 ASPNETCORE_URLS,而不是配置中的硬编码)