【问题标题】:Cannot connect to remote MSSQL database from stacked docker container无法从堆叠的 docker 容器连接到远程 MSSQL 数据库
【发布时间】:2020-01-20 12:51:06
【问题描述】:

我在从堆栈中运行的 docker 容器内部连接到现有远程 MSSQL 数据库时遇到问题。

  1. 我的应用程序由三个模块(后端、前端和 haproxy)组成
  2. 后端模块是用 Java 编写的(SpringBoot 应用程序),它也是需要连接远程 MSSQL 数据库的模块(远程我的意思是放置在不同的服务器上,与 docker 部分分开)。
  3. 我有以下 docker compose 文件:

  1. 我使用以下命令启动堆栈:

    docker stack deploy -c docker-compose.yml myapp
    
  2. 结果是,所有容器都启动并运行,但是spring app报告连接DB超时:

服务器似乎配置正确,我可以通过 telnet 从容器访问主机。

当独立运行(甚至从 docker 容器)时,后端应用程序能够毫无问题地连接到数据库,而与 docker-compose 堆叠时,它无法连接到同一个数据库。

我也尝试提供数据库服务器 IP 而不是主机名 - 没有成功。

也许在 docker compose 中设置网络部分可以解决问题?

【问题讨论】:

  • mssql 实例在 docker 之外运行?
  • 是的。这是一个单独的服务器。
  • 服务器的 IP 是否正确?你如何以及在哪里运行它?因为它看起来像一个内部(网络)IP,而不是一个全局 IP。当您堆叠 docker 应用程序时,它会获得自己的内部网络,从而导致 10.x.x.x 等 IP 地址指向其他容器,这可能是您的应用程序找不到远程 mssql 服务器的原因。
  • 是的,IP 是正确的。它作为内部企业基础设施的一部分工作。有没有办法避免这些冲突?

标签: java sql-server docker docker-compose docker-networking


【解决方案1】:

更新

您可以做的另一件事是使用host.docker.internal 代替数据库的IP 地址。 ONLY 适用于 docker for windows 或 docker for mac。

来源:I want to connect from a container to a service on the host

OLD,仅在非集群模式时有效

你需要指定docker应该和宿主机使用同一个网络,可以通过以下方式进行:

version: '3'
services:
  web-app:
    build:
      dockerfile: web-app/something
    ports:
       - 8080:8080
    network_mode: "host"

参考:Use host networking

【讨论】:

  • 构建包含网络模式选项的堆栈只会给我忽略不支持的选项:网络模式信息。 docker for desktop 似乎不支持它。您是否还有其他想法如何在 docker-compose 中实现它?
  • 我已经用另一个选项更新了我的答案,我希望这个对你有用。如果没有,请告诉我:)
  • 不幸的是,这不是解决方案。即使我设法在同一个网络上运行 docker 和主机,我的端点也变得公开(这是非常不受欢迎的行为)。我找到了另一个解决方案,我在这个问题下发布了。
【解决方案2】:

问题似乎是由网络重叠引起的。

添加如下所示配置的网络,允许连接到我的远程数据库并隐藏我的端点:

networks:
    backend:
        ipam:
            driver: default
            config:
                - subnet: 192.168.40.0/26

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多