从Dockers容器中访问主机上的MySQL数据库

时间:2017-06-27 19:13:31

标签: mysql rest docker spring-boot mariadb

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

进行连接的代码段如下:

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端口以允许进行数据库调用,但没有帮助。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

将数据库与docker一起使用的建议方法是在分离的容器中运行它。 Docker容器位于同一个(docker)网络中,因此您只需要link它们。 Here您拥有MariaDB图像和指南如何使用它。您可以将现有数据库转储到图像中(因此您无需再次执行此操作)。

要做到这一点,你必须:

  1. 创建新的数据库映像(在其中转储数据库)
  2. 运行数据库容器(设置名称!)
  3. 使用链接do database container
  4. 运行REST容器

答案 1 :(得分:1)

如果您打算只进行开发,可以链接容器或更好,您可以使用docker-compose。但要小心:容器中的数据库不用于生产!

从容器中,您可以使用ip route show

检索泊坞主机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并在应用程序中检索它。