【问题标题】:Access to Cosmos db emulator on local machine from Linux docker从 Linux docker 访问本地计算机上的 Cosmos db 模拟器
【发布时间】:2019-07-02 22:26:59
【问题描述】:

我对 Linux docker 和 cosmos db 模拟器有点困惑。我在本地机器上安装了一个模拟器。在我的 Windows 10 上,我有一个带有 Web API ASP.NET 核心应用程序的 Linux docker 容器。当我尝试从容器访问 cosmos db 时,我得到一个异常 - > HttpRequestException:连接被拒绝。

在 C# 代码中,我从环境变量中获取数据库所需的选项,例如 AuthKey 和 Uri。看起来我在容器和本地主机之间的网络有问题,但我不明白如何连接这些。

下面提供了 docker-compose.yml 和 docker-compose.override.yml 文件。

event.webapi:
    container_name: event.webapi
    image: '${DOCKER_REGISTRY-}eventwebapi'
    environment:
     **- AzureCollectionName=Events
     - AzureDatabaseName=EventsDatabase**
    build:
      context: .
      dockerfile: src/Services/Event/Event.WebApi/Dockerfile

``` docker-compose.override.yml
event.webapi:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_HTTPS_PORT=44378
      **- AzureEndpointUri=https://127.0.0.1:8081
      -AzurePrimaryKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==**
    ports:
      - "53753:80"
      - "44378:443"
    volumes:
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro

【问题讨论】:

标签: docker asp.net-web-api docker-compose azure-cosmosdb docker-for-windows


【解决方案1】:

你不能通过直接设置https://127.0.0.1:8081从docker容器里面访问vm主机。

请参考这个document,并尝试设置host.docker.internal:8081访问vm主机。

主机有一个不断变化的 IP 地址(如果您没有网络,则没有 使用权)。从 18.03 起,我们的建议是连接到 特殊的 DNS 名称 host.docker.internal,解析为内部 主机使用的 IP 地址。这是出于开发目的,将 不适用于 Docker Desktop 之外的生产环境 窗户。


Cosmos DB 模拟器需要安装 SSL 证书,根据 link。对于 .net 运行时,您可以直接从 Windows 证书存储区访问证书。

但是,您在 linux docker 映像中运行 .net 代码。所以我的想法是按照这些 steps 导出 SSL 证书。

保存在宿主机上的具体路径和挂载宿主机目录下。请参考这个guide

【讨论】:

  • 非常感谢您的帮助。提供的信息对我有帮助。但是在我从127.0.0.1:8081 更改为host.docker.internal:8081 之后,我得到了这样的异常“无法建立 SSL 连接,请参阅内部异常。---> System.Security.Authentication.AuthenticationException:远程证书无效根据验证程序。”
  • 非常感谢您提供的信息。这对我真的很有帮助。也许您知道我如何使用生成的证书?我有 documentdbemulatorcert.cer 文件。我在主机和容器之间共享卷,但我不知道如何使用这个证书。你能帮我解决这个问题吗?
  • @mVadim - 对此有何更新?走这条路似乎是正确的方法,但由于导出 .cer 是针对 localhost,它不会针对 host.docker.internal 进行验证。
猜你喜欢
  • 1970-01-01
  • 2020-08-06
  • 2012-08-04
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
相关资源
最近更新 更多