2017-06-27 168 views
1

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

代码段进行连接如下:

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

我已经有公布,接受REST从主机调用的8080端口,并试图发布或揭露3308端口,允许数据库调用在没有帮助的情况下制作。

预先感谢您!

+0

我建议你在另一个容器中运行你的数据库 - 它建议从码头的方式。 – giaco

+0

除了创建其他容器并重新设置数据库以外,是否还有其他特殊更改需要进行以允许一个泊坞窗中的应用程序在另一个泊坞窗中调用数据库? – dFrancisco

回答

1

与docker一起使用数据库的建议方法是在单独的容器中运行它。 Docker容器在同一个(docker)网络中,所以你只需要link他们。 Here你有MariaDB的形象和指导如何使用它。你可以将你现有的数据库转储到你的映像中(这样你就不需要再把它全部做完)。

要做到这一点,你必须:

  1. 创建新的数据库图像(在它转储数据库)
  2. 运行数据库容器(!集名)
  3. 与链接运行您的REST容器做数据库容器
+0

链接模式是旧模式。相反,建议使用网络服务发现。基本上,只要你的容器都连接到同一个'docker network create'类型的网络,它们将能够通过它们的'--name'来解析对方。 – programmerq

+1

你是对的 - 我从我的记忆中写下来,我总是用--link :) – giaco

1

如果您只是为了开发而开发,您可以链接容器或更好地使用docker-compose。但要小心:容器中的数据库不适合生产!

从您可以ip route show

# 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容器然后默认路由是你的主机IP(这里172.17.0.1)

在这一点上,要注意主机的可以阻止连接的防火墙

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

相关问题