我有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文件
答案 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所述。