【问题标题】:How to connect from a docker container with web service to another docker container with MySQL using JDBC?如何使用 JDBC 从带有 Web 服务的 docker 容器连接到另一个带有 MySQL 的 docker 容器?
【发布时间】: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


【解决方案1】:

问题是我的 WAR 文件被缓存了,即使我执行了 docker down,随后使用 docker up 进行的重建仍在使用该缓存的 war 文件。

因此,在构建之间执行“docker system prune -af”(可能是更好的方法),实际上让我可以尝试不同的构建。

解决方案:使用 docker-compose 中定义的 mysql 容器名称。就我而言,这是正确的 JDBC(来自上面的 docker-compose):

    final String DATABASE_URL =
            "jdbc:mysql://test-mysql-docker:3306/ZipCodeLookup?useSSL=false&" +
                    "serverTimezone=America/New_York&user=root&password=thepass&autoReconnect=true";

希望这对其他人也有帮助。 :)

谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2019-07-20
    • 2019-02-24
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多