我有一个 Spring Boot 应用程序在本地计算机上作为 docker 容器运行。它正在连接到我们公司数据中心上的 Oracle 数据库。我可以使用 sql Developer 直接从本地计算机连接到数据库。但是,作为 docker 容器运行的 spring 应用程序在连接到数据库时出现以下错误。我确信它必须在 docker 容器中执行与端口映射或网络相关的操作。
原因:oracle.net.ns.NetException:网络适配器无法建立连接
您的数据库容器已映射到主机网络上的端口 1521。这就是为什么
SQL Developer
可以使用这样的东西:localhost:1521/SERVICE_NAME
SQL Developer 只能访问主机网络,并且端口 1521 暴露给主机网络。
现在,您希望应用程序容器连接到数据库容器。 应用程序容器无法访问主机网络(除非配置为主机模式),它只能访问 docker 网络,如
172.17.0.2/16
解决方案
在docker-network中查找数据库容器的ip:
docker container inspect free-23ai | grep '"IPAddress":'
"IPAddress": "",
"IPAddress": "172.21.0.2",
现在,您可以为您的应用程序构建连接字符串。
172.21.0.2:1521/SERVICE_NAME
提示
在有服务发现的地方使用docker compose更方便
services:
app:
db:
现在您可以像这样配置您的应用程序:
db:1521/SERVICE_NAME
或只是db/SERVICE_NAME
(1521是默认值,可以省略)
祝你好运!