如何将Docker化的ASP.NET Core应用程序连接到Docker化的PostgreSQL?

5

我有两个Docker容器: 我的ASP.NET Core Web服务器 -p 5001:80 postgresql -p 5451:5432 当我配置我的Web服务器与运行在主机上的postgresql配合使用时,它可以工作。 但是当我将我的Web应用程序配置为与在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

如果我将应用程序连接到一个外部的非docker化PostgreSQL,它可以正常工作。

有何不正确之处,如何解决?

这是我的docker-compose文件:

https://pastebin.com/b8FbHSLL


你是如何运行容器的?使用docker-compose还是docker run?请提供您用于运行容器的命令。 - Christian Fosli
你应该在docker-compose网络中使用容器端口5432而不是5451发布端口。 - Adiii
@ChristianFosli 我在docker-compose中运行了postgres docker,其中包含postgresl、elastic和kibana。我运行我的Web应用程序:>docker run -it --rm -p5901:5901 pman。同时,我已将其包含在同一组合中。但是该应用程序具有PG连接字符串:localhost。我已将其替换为0.0.0.0,两者都会出现错误。 - ZedZip
1个回答

13

因此,在这里,localhost 指的是运行 Web 服务器的容器的本地主机,而不是 您的 本地主机。因此,如果要引用另一个容器,则需要先进行一些网络相关的操作,才能使用 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 服务器和 postgres 使用相同的网络。

如果您需要使用 docker run 而不是 docker-compose up 运行 Web 应用程序,则需要包含一个 --network 参数以确保它们使用相同的网络。

更多信息在此

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


谢谢,我明白了,好的,我会测试并提供反馈。 - ZedZip
我按照你的建议做了所有事情,但是错过了一些东西。现在我无法像以前一样调用我的Docker化应用程序http://localhost:5001。Christian,你能否看一下我的docker-compose文件?如果可以,我可以上传它。 - ZedZip
此外,检查一下 postgres 容器的日志,以验证其是否成功启动,并可能仔细检查端口和连接字符串/凭据是否正确。 - Christian Fosli
根据你的第一个问题,我假设web服务器叫做“propman”? - Christian Fosli
让我们在聊天中继续这个讨论 - ZedZip
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接