从另一个 Docker 访问一个 Docker 中的 MariaDB
Posted
技术标签:
【中文标题】从另一个 Docker 访问一个 Docker 中的 MariaDB【英文标题】:Accessing a MariaDB in one Docker from another Docker 【发布时间】:2017-12-01 23:32:27 【问题描述】:我有两个 Docker 容器。一种是基于标准的 MariaDB 映像。该容器名为“mariadb”,其中有一个名为“fi”的数据库。 fi db 里面有几个表,每个表都有几行数据。使用 DataGrip 或任何其他数据库查看软件,我可以成功地访问和查询该数据库,在本地主机上使用端口 3306 调用它。
我的第二个 Docker 容器运行一个 Spring Boot 应用程序,它需要访问 MariaDB 中的数据。如果我在 docker 中运行 MariaDB,并在主机上运行 Spring Boot 应用程序,我可以使用连接字符串成功访问 docker 中的 MariaDB:“jdbc:mariadb://localhost:3306/?user=myUsername&password=myPassword ”。我的问题是,当我尝试在单独的 Docker 中运行它们时,Spring Boot 应用程序无法访问数据库。我发现很多人说要“链接”两个码头工人,但这似乎并没有解决问题。当我运行 Spring Boot docker 时,我执行命令“docker run -i -p 8080:8080 --link mariadb:db javaImage /bin/bash”。由于与此问题无关的原因,我发布了 8080 端口。据我了解,它们现在应该是我的 Spring Boot docker 中的一个环境变量,可以使用关键字“db”访问,它将被一个环境变量替换,该环境变量是 MariaDB docker 的实际 ip。
到目前为止,在我的 Java 代码中,建立连接(或尝试良好)是使用连接字符串“jdbc:mariadb://db:3306/fi?user=myUsername&password=myPassword”。这将返回错误“无法连接:未知数据库'fi'”,这很奇怪,因为如果此连接真正连接到 MariaDB docker,则会找到 fi 数据库。
感谢任何帮助。 谢谢!
编辑:代码片段
Connection connection = DriverManager.getConnection("jdbc:mariadb://mariadb:3306/fi?user=myUsername&password=myPassword");
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM ...;");
按照以下建议更改连接字符串,如上所示。现在使用命令“run -i -p 8080:8080 --link mariadb javaImage /bin/bash”运行容器。结果相同,尝试建立连接时收到此错误“无法连接:未知数据库'fi'”。
【问题讨论】:
同时,我建议您根据指南格式化您的问题,尤其是引用代码 sn-ps。 【参考方案1】:如果容器命名为mariadb,你应该在url中使用它,而不是db。
jdbc:mariadb://mariadb:3306/fi?user=myUsername&password=myPassword
在你的链接上你也应该使用 mariadb,
docker run -i -p 8080:8080 --link mariadb javaImage /bin/bash
【讨论】:
请参阅问题的编辑:及以下部分。似乎没有解决问题,对连接字符串和运行命令进行了更改。 您能否发布执行“docker ps”时得到的结果。另外,是否有可能在您的计算机中运行本地 mysql 实例,当您使用 localhost 时可能会连接到它? 是的,我发现了问题,你是对的。主机上还有一些其他本地 MySQL 数据库(我不知道),当我认为我将表插入到 Docker MariaDB 中时,我正在将它们插入到主机数据库中。我现在已经正确地将表插入到实际的 Docker MariaDB 中,并且一切正常。谢谢 您好,请在下面的链接中查看此答案,我认为这可以帮助您解决此问题。 ***.com/a/53431294/1939983 谢谢,以上是关于从另一个 Docker 访问一个 Docker 中的 MariaDB的主要内容,如果未能解决你的问题,请参考以下文章
无法从另一个 docker 容器中的烧瓶应用程序对驻留在 docker 容器中的 django 应用程序进行“获取”调用 [重复]