【发布时间】:2017-10-18 02:39:47
【问题描述】:
我有一个 Spring Boot 应用程序,它使 jdbc 连接到不同 VPC 中的数据库。从我的本地我无法访问这个数据库,所以当我在本地部署我的应用程序时,我必须打开一个 ssh 隧道才能连接到数据库。这就是隧道的设置方式:
ssh -L 61616:data_base_host:data_base_port myuser@tunnel_server
然后我的应用使用以下方式连接:
jdbc:sqlserver://localhost:61616....
现在我需要将我的应用程序放入 Docker 容器中。这就是我运行 docker 映像的方式:
docker run -p 9018:9018 myapp
9018 是 http 端口。当 Spring Boot 应用程序在 Docker 中启动时,它无法连接到数据库。错误是:
Failed to initialize pool: The TCP/IP connection to the host localhost, port 61616 has failed.
所以我需要将容器内的61616端口绑定到主机内的61616端口。我能够使用这个 jdbc URL 解决我的问题:
jdbc:sqlserver://docker.for.mac.localhost:61616
使用别名 docker.for.mac.localhost 可以解决问题,但它是面向 Mac 平台的解决方案。我也试过了:
docker run -p 9018:9018 -p 61616:61616 myapp
而且没用。
有什么想法吗?
【问题讨论】:
-
Docker 没有提供简单的获取主机 ip 的方法。根据 docker 方法,如果您使用应用程序运行容器,则无需在主机上运行 db,您还应该将其容器化。如果数据库在容器内,连接数据库非常容易。不过,您可以尝试一些解决方法,看看这个答案的第二部分stackoverflow.com/a/24326540/2065796 您还可以考虑从 docker 容器内部建立 ssh 隧道的选项。
标签: java docker spring-boot jdbc ssh