Docker-使用.NET Core无法访问

时间:2017-12-15 19:29:04

标签: .net docker .net-core docker-compose

我是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。

Docker ps result

有什么想法吗?

2 个答案:

答案 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的本地机器上不起作用

  1. 使用 ipconfig 获取您的本地 IP。即 192.168.1.123
  2. 运行您的 asp.net 核心应用
  3. 使用 IP 而不是 localhost 在浏览器中访问您的应用:http://19.2.168.1.123 你会发现它不起作用。

为什么,这是浏览器如何路由到 docker 容器中的应用程序?

  1. 您的本地主机(在浏览器中输入)-> 您的本地 IP 192.168.1.123
  2. 您的本地 IP 192.168.1.123 -> 容器 IP:192.168.4.45(根据您的 docker 桌面设置)
  3. 容器IP:192.168.4.45 -> 容器本地
  4. Container localhost -> 运行容器的应用程序。

如果应用只监听本地主机,那么,

第 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,而不是配置中的硬编码)

相关问题