【发布时间】:2019-01-12 12:57:53
【问题描述】:
无法使用 JDBC 从另一个 docker 容器连接到在 docker 容器中运行的 MySQL。我可以在 docker 外部连接到每个容器,所以我知道它们正在运行。但是使用 JDBC 的容器到容器对我不起作用。
基于我的 docker-compose 文件,我目前尝试了多种 JDBC 组合,包括(对于 JDBC URL)localhost、0.0.0.0、127.0.0.1、内部和外部端口、容器名称、数据库名称和其他组合.
我也尝试在 docker-compose 文件中添加环境子句。
还尝试使用内部 docker 网络名称。
搜索了 StackOverflow 并尝试了任何似乎可行的建议。
使用 db 容器名称的示例 JDBC 语法:
"jdbc:mysql://test-mysql-docker:3306/ZipCodeLookup?useSSL=false&" + "serverTimezone=America/New_York&user=root&password=thepass&autoReconnect=true";
version: '3'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8089:8080"
volumes:
- /Users/mike/Library/apache-tomcat-9.0.7/conf/tomcat-users.xml:/usr/local/tomcat/conf/tomcat-users.xml
depends_on:
- db
db:
image: mysql
container_name: test-mysql-docker
ports:
- 3307:3306
volumes:
- ./ZipCodeLookup.sql:/docker-entrypoint-initdb.d/ZipCodeLookup.sql
environment:
MYSQL_ROOT_PASSWORD: "thepass"
预期结果将是在第一个 docker 容器“app”中运行的服务的 SQL 邮政编码结果。
实际结果是服务尝试3次后无法联系数据库的错误。
【问题讨论】:
-
您是否在尝试连接之前给 MySQL 适当的初始化时间?
depends_on只监控容器状态,不一定是容器内的应用程序。 -
这是个好问题。该服务应用程序立即可用,我可以从浏览器 (GET) 访问它。 docker-compose 窗口输出显示 MySQL 已启动并准备好请求的窗口。那么,给定上面的 docker-compose 文件,你会使用什么 JDBC 语法并期望它工作?谢谢。
-
我还想提一下,我可以使用常规 Java 程序和 JDBC 在 docker 之外访问 MySQL docker 容器。在这种情况下,对于 JDBC,我只使用 localhost 和端口(来自我上面的 docker-compose 文件),3307。工作正常。但是根本不会使用我尝试过的任何 JDBC 组合从另一个 docker 容器中的 Java 应用程序连接到 MySQL docker 容器。我严重没有想法。感谢任何尝试。
标签: docker jdbc docker-compose