无法从堆叠的Docker容器连接到远程MSSQL数据库

4

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

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

enter image description here

  1. I start the stack by using following command:

    docker stack deploy -c docker-compose.yml myapp
    
  2. The result is, all containers are up and running, but spring app reports that connection to DB is timed out:

enter image description here

服务器似乎已经正确配置,我能够通过telnet从容器访问主机。
当独立运行(即使从docker容器中)时,后端应用程序能够无问题地连接到数据库,但是与docker-compose堆叠时,它无法连接到同一个数据库。
我也尝试提供db服务器IP而不是主机名 - 没有成功。
也许在docker compose中设置网络部分可以解决问题?

Mssql实例正在docker之外运行? - f1sh
是的,它是一个独立的服务器。 - Bartłomiej Adamczyk
服务器的IP地址是否正确?您要在哪里和如何运行它?因为它看起来像是内部网络IP而不是全局IP。在堆叠Docker应用程序时,它会获得自己的内部网络,导致像10.x.x.x这样的IP地址指向其他容器,这可能是您的应用程序找不到远程mssql服务器的原因。 - Sven Hakvoort
是的,IP地址是正确的。它作为公司内部基础架构的一部分在工作。 有什么方法可以避免这些冲突吗? - Bartłomiej Adamczyk
2个回答

1

更新

另一件事情是可以使用host.docker.internal代替数据库的IP地址。这仅适用于Windows或Mac上的Docker。

来源: 我想从容器连接到主机上的服务

旧版,仅在非Swarm模式下有效

您需要指定Docker应使用与主机相同的网络,可以通过以下方式进行:

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

参考:使用主机网络

参考:使用主机网络


构建使用 network_mode 选项的堆栈只会给我 忽略不支持的选项:network_mode 的信息。看起来在 Docker for Desktop 下不受支持。您是否有任何其他想法如何在 docker-compose 中实现它? - Bartłomiej Adamczyk
我已经更新了我的答案,提供另一种选择,希望这个可以解决你的问题。如果不行,请告诉我 :) - Sven Hakvoort
不幸的是,这不是解决方案。即使我成功地在同一网络上运行了Docker和主机,我的端点也变成了公共的(这是非常不希望的行为)。我找到了另一个解决方案,在这个问题下面发布了。 - Bartłomiej Adamczyk

0

看起来问题是由网络重叠引起的。

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

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

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