Docker Compose运行的Web API无法通过HTTP访问服务依赖项
我有一个停靠的ASP.NET Core 2.2 Web API,它依赖于另一个服务(身份提供者)进行承载令牌验证。因此,我使用VisualStudio使用Docker Compose将容器编排支持添加到我的API项目中,以使我能够使用VisualStudio在适当的依赖项下进行本地调试 Docker Compose服务如下所示:Docker Compose运行的Web API无法通过HTTP访问服务依赖项,docker,asp.net-core,docker-compose,Docker,Asp.net Core,Docker Compose,我有一个停靠的ASP.NET Core 2.2 Web API,它依赖于另一个服务(身份提供者)进行承载令牌验证。因此,我使用VisualStudio使用Docker Compose将容器编排支持添加到我的API项目中,以使我能够使用VisualStudio在适当的依赖项下进行本地调试 Docker Compose服务如下所示: services: my.api: image: ${DOCKER_REGISTRY-}myapi build: context: .
services:
my.api:
image: ${DOCKER_REGISTRY-}myapi
build:
context: .
dockerfile: My.Api/Dockerfile
ports:
- "60004:80"
depends_on:
- identity
identity:
image: "my-identity:local"
ports:
- "60000:80"
当我在Visual Studio中运行Docker Compose调试配置文件时,我可以看到这两个服务都已启动,因此我可以使用浏览器在处加载API的匿名端点,还可以在处查看身份提供程序的OIDC配置
但是,当我使用客户端应用程序向我的API发出授权请求并传递有效的访问令牌时,它会返回一个包含以下错误的500响应:
IDX10803:无法从获取配置:
我的假设是,两个容器API和Identity之间的服务器到服务器调用失败。我通过尝试显式向OIDC端点发出HTTP请求并返回System.Net.Sockets.SocketException 99:无法分配请求的地址异常来确认这一点
但我的理解是Docker Compose处理了相互依赖容器的所有网络复杂性。那么,我还需要做些什么来确保依赖我的身份提供者的容器可以看到它呢?您的问题是,您试图在localhost上访问该服务。在大多数情况下,这是行不通的:localhost表示当前容器或当前主机,而您的标识服务与api服务不在同一容器中运行 在my.api容器中,您可以使用主机名标识访问您的标识服务,例如。,http://identity/.well-known/openid-configuration. 这是因为当您打开docker compose堆栈时,docker compose将默认为您的容器创建用户定义的网络。在用户定义的网络中,Docker维护一个DNS服务,该服务将容器名称映射到它们各自的地址。请注意,您需要访问容器端口80中它正在侦听的端口上的服务,而不是发布服务的主机上的端口 不需要使用服务定义中的ports键在主机端口上发布标识服务,除非您确实需要从api容器以外的其他对象访问此服务