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

Ole*_*leg 2 docker asp.net-core

我有 2 个 Docker:我的 ASP.NET Core Web 服务器 -p 5001:80 postgresql -p 5451:5432 当我配置我的 Web 服务器以使用在我的主机上运行的 postgresql 时,它可以工作。但是当我运行 configure 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
Run Code Online (Sandbox Code Playgroud)

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

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

有我的 docker-compose 文件

https://pastebin.com/b8FbHSLL

Chr*_*sli 6

所以,localhost这里指的是运行网络服务器的容器本地主机,而不是你的本地主机。因此localhost,如果不先做一些与网络相关的事情,就不能用来引用另一个容器。

有几种方法可以继续。由于您在评论中提到您正在使用 docker-compose,我建议如下:

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

基本上,你可以localhost用你想要的服务的服务名称替换,即如果 postgres 在你的 docker-compose 文件中被称为“db”,你可以localhost:5451db:5432.

如果您在 docker-compose 文件中指定自定义网络,则必须确保 web-server 和 postgres 使用相同的网络。

如果您需要使用docker run而不是运行 webapp docker-compose up,那么您需要包含一个--network参数,以便它们使用相同的网络。

更多信息在这里

编辑:更正的端口号。我们现在需要使用容器端口,而不是主机端口,正如@Adiii 在上面的评论中提到的。