如何连接Dockerized ASP.NET Core应用程序-> Dockerized PostgreSQL?

时间:2020-07-28 11:11:14

标签: docker asp.net-core

我有2个Docker: 我的ASP.NET Core Web服务器-p 5001:80 PostgreSQL -p 5451:5432 当我将Web服务器配置为与在主机上运行的postgresql一起使用时,它将起作用。 但是,当我运行将myWeb App配置为可在Docker中使用postgresql时,请运行http:// localhost:5001

starts but then an error appears:

    warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
          Failed to determine the https port for redirect.
    fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
          An unhandled exception has occurred while executing the request.
    System.InvalidOperationException: An exception has been raised that is likely due to a transient failure.
     ---> Npgsql.NpgsqlException (0x80004005): Exception while connecting
     ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (99): Cannot assign requested address [::1]:5451

如果我将应用程序连接到外部非dockerized的PostgreSQL-它可以正常工作。

什么是不正确的以及如何解决?

有我的docker-compose文件

https://pastebin.com/b8FbHSLL

1 个答案:

答案 0 :(得分:3)

因此,localhost是指运行Web服务器的容器的本地主机,而不是您的本地主机。 因此,您必须先做一些与网络相关的事情,才能使用localhost来引用另一个容器。

有几种方法可以进行。由于您在评论中提到您正在使用docker-compose,因此我建议以下几点:

使用docker-compose,联网相对简单,如果docker-compose.yml文件中包含所有需要相互通信的服务,则可以使用docker-compose up运行所有服务。如果您未在docker-compose文件中指定任何特定网络,则docker-compose会为所有包含的服务设置一个单一网络,这使得每个容器都可以通过使用与容器名称。

基本上,您可以将localhost替换为所需服务的服务名,即,如果在docker-compose文件中将postgres称为“ db”,则将localhost:5451替换为{{ 1}}。

如果您在docker-compose文件中指定了自定义网络,则必须确保Web服务器和Postgres使用的是同一网络。

如果您需要使用db:5432而不是docker run来运行Web应用程序,则需要包含一个docker-compose up参数,以便他们使用相同的网络。

更多信息here

编辑:已更正的端口号。我们现在需要使用容器端口,而不是主机端口,如上面注释中的@Adiii所述。