【问题标题】:How to connect Dockerized ASP.NET Core app ->Dockerized PostgreSQL?如何连接 Dockerized ASP.NET Core 应用程序 -> Dockerized PostgreSQL?
【发布时间】:2020-07-28 11:11:14
【问题描述】:

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

【问题讨论】:

  • 你是如何运行容器的? docker-compose 还是 docker run?请添加您用于运行容器的命令
  • 你应该使用容器端口5432而不是5451使用docker-compose网络发布端口
  • @ChristianFosli 我在 docker-compse 中运行 postgres docker:它包含 postgresl、elastic、kibana。我运行的网络应用程序:>docker run -it --rm -p5901:5901 pman。此外,我已将其包含在同一个组合中。但是该应用程序有一个 PG 连接字符串:localhost。我已将其替换为 0.0.0.0 0 都给出了错误。

标签: docker asp.net-core


【解决方案1】:

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

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

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

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

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

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

更多信息here

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

【讨论】:

  • Thnx,我看到了,好的,会测试并给出反馈
  • 我按照你的建议做了所有的事情,但错过了一些东西。现在我不能像以前那样调用我的 dockerized 应用程序 localhost:5001 。克里斯蒂安,你能看看我的 docker-compose 文件吗?如果是,我可以上传它
  • 连接到PG pm_1时出现错误 | ---> System.Net.Sockets.SocketException (111): Connection denied at Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout timeout) at Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout timeout) Npgsql.NpgsqlConnector.RawOpen(NpgsqlTimeout timeout, Boolean async, CancellationToken取消令牌) pm_1 |在 Npgsql.NpgsqlConnector.Open(NpgsqlTimeout 超时,布尔异步,CancellationToken 取消令牌)
  • 您能否编辑您的问题以包含 docker-compose 文件?
  • 另外,检查 postgres 容器的日志以验证它是否成功启动,并可能仔细检查端口和连接字符串/凭据是否正确。
猜你喜欢
  • 2022-06-19
  • 2017-12-29
  • 2019-11-06
  • 1970-01-01
  • 2018-02-18
  • 2021-01-29
  • 2021-06-17
  • 2020-11-18
  • 1970-01-01
相关资源
最近更新 更多