【问题标题】:How to connect to a remote service from a Docker Container如何从 Docker 容器连接到远程服务
【发布时间】:2020-03-26 00:03:34
【问题描述】:

我在 docker 容器中运行的 dotnet 核心应用程序需要通过其 IP 连接到一些外部服务,其中一个是在谷歌云上托管的远程服务器上单独运行的 sql 数据库。应用程序在不使用 docker 运行时运行没有问题,但是使用 docker 会失败并显示

An error occurred using the connection to database 'PartnersDb' on server '30.xx.xx.xx,39876'.
fail: Microsoft.EntityFrameworkCore.Update[10000]
      An exception occurred in the database while saving changes for context type 'Partners.Api.Infrastructure.Persistence.MoneyTransferDbContext'.
      System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled conn
ections were in use and max pool size was reached.

我的 Docker 撰写文件如下所示

version: "3.5"
networks:
  my-network:
    name: my_network

services:
  partners:
    image: partners.api:latest
    container_name: partners
    build:
      context: ./
    restart: always
    ports:
      - "8081:80"
    environment:
      - ASPNETCORE_ENVIRONMENT=Docker
      - ConnectionStrings:DefaultConnection=Server=30.xx.xx.xx,39876;Database=PartnersDb;User Id=don;Password=Passwor123$$
    networks:
      - my-network
    volumes:
      - /Users/mine/Desktop/logs⁩:/logs

我有

  1. bin 被撞到正在运行的容器中,我可以运行 ping 到 远程sql数据库服务器
  2. 我还可以远程登录到 数据库端口上的远程 sql 数据库服务器

但是,当我执行 docker-compose up 时出现问题,然后出现上述错误。 Docker 版本 19.03.5,构建 633a0ea 正在 MacOS Mojave 10.14.6 上运行

现阶段我真的不知道该怎么办。

【问题讨论】:

  • 这篇关于超级用户的帖子可能对superuser.com/questions/1286281/…有帮助
  • @SeanMorris 我已经在用户定义的网桥网络上运行,即使我剥离了它并使用链接中建议的默认网桥,它仍然无法正常工作。
  • 当你运行容器并成功访问服务时,你使用的是docker run还是docker-compose run
  • @SeanMorris 使用 docker run 和 docker-compose up 并将 shell 附加到容器,我可以 ping 和 telnet 到远程服务。但应用本身无法连接。

标签: docker .net-core docker-compose docker-networking


【解决方案1】:

有两个独立的网络。 docker内部是一个单独的网络。在 docker 之外,在主机上,它是一个不同的网络。如果您通过 localhost 或 IP 地址访问它,它将无法按预期工作。

docker network ls

将向您显示类似的输出,如下所示:

NETWORK ID          NAME                DRIVER              SCOPE
58a4dd9893e9        133_default         bridge              local
424817227b42        bridge              bridge              local
739297b8107e        host                host                local
b9c4fb3ed4ba        none                null                local

您需要在本地添加 Java 服务的主机。尝试像下面的命令一样运行:

对于服务:

docker run --add-host remoteservice:<ip address of java service> <your image>

希望这会解决它。

更多:https://docs.docker.com/engine/reference/run/#managing-etchosts

对于 PartnersDb 数据库:

如果 PartnersDb 是 SQL 数据库,您必须配置 SQL Server 以侦听特定端口。通过 SQL Server 配置管理器 > SQL Server 网络配置 > TCP/IP 属性。

更多:https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/configure-a-server-to-listen-on-a-specific-tcp-port?view=sql-server-ver15

MySQL 也有类似的设置。

之后你必须运行add-host switch

docker run --add-host PartnersDb:<ip address of PartnersDb database> <your image>

您也可以使用这些设置更新hosts 文件。我更喜欢通过命令行来代替。

【讨论】:

  • 这不起作用。我有这样的连接字符串 ConnectionStrings:DefaultConnection=Server=x.x.x.x,3030;Database=MyDb;User Id=User;Password=Password。在我的 docker compose 中设置了 extra_hosts: - "PartnersdB:x.x.x.x" 并尝试使用 docker run 运行后,我仍然得到同样的错误。
  • 哦,对不起,伙计!请在 docker 内进行网络调试,您需要 net-tools 包来执行 ifconfigping 主机。在这里找到了一些有效的技术:forums.docker.com/t/…
猜你喜欢
  • 1970-01-01
  • 2021-06-05
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2018-05-02
  • 2018-09-17
相关资源
最近更新 更多