在Docker容器中访问主机上的MySQL数据库

我有一个在Dockers容器中运行的Spring Boot应用程序。 该应用程序提供REST端点,可以使用http:// localhost:8080 / endpoint从主机成功调用。 以前,当这个应用程序运行在主机上而不是在Dockers中时,我可以从应用程序中使用jdbc:mariadb:// localhost:3308 / fi?user = userName&password = thePassword调用本地MariaDB。 现在应用程序在Dockers中运行,连接返回错误:“无法连接到地址=(host = localhost)(port = 3308)(type = master):连接被拒绝(连接被拒绝)”

进行连接的代码片段如下所示:

Connection connection = DriverManager.getConnection("jdbc:mariadb://localhost:3308/fi?user=username&password=thePassword"); Statement stmt = connection.createStatement(); String query = ""; ResultSet rs = stmt.executeQuery("SELECT * ....;"); 

我已经发布了8080端口来接受来自主机的REST调用,并试图发布或公开3308端口以允许进行数据库调用,而不提供帮助。

先谢谢你!

Docker使用数据库的build议方法是在独立的容器中运行它。 docker集装箱在同一个(docker)networking,所以你只需要链接它们。 在这里你有MariaDB的图像和指导如何使用它。 你可以将你现有的数据库转储到你的映像中(所以你不需要再把它全部做完)。

要做到这一点,你必须:

  1. 创build新的数据库映像(转储数据库)
  2. 运行数据库容器(设置名称!)
  3. 使用链接数据库容器运行您的REST容器

如果你喜欢做开发,你可以链接容器,或者更好地使用docker-compose 。 但要小心:容器中的数据库不适合生产!

从容器中,您可以使用ip route show检索docker主机IP

 # ip route show default via 172.17.0.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2 

那么默认路由就是你的主机IP(这里是172.17.0.1)

此时,请注意主机的防火墙,可以阻止连接

在入口点脚本中,您可以使用ip route show | awk '/default/ {print $3}'来检索主机IP ip route show | awk '/default/ {print $3}' 。 然后你可以通过一个环境variables传递这个IP,并在应用程序中检索它。