【问题标题】:Accessing MySQL Database on Host Machine from within Dockers Container从 Docker 容器中访问主机上的 MySQL 数据库
【发布时间】:2017-11-30 23:17:00
【问题描述】:

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

建立连接的代码sn-p如下:

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 建议的方式。
  • 除了创建另一个容器并重新设置数据库之外,是否需要进行其他特殊更改以允许一个 docker 中的应用程序调用另一个 docker 中的数据库?

标签: mysql rest docker spring-boot mariadb


【解决方案1】:

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

为此,您必须:

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

【讨论】:

  • 链接模式是旧模式。相反,建议使用网络服务发现。基本上,只要你的容器都连接到同一个docker network create 类型的网络,它们就可以通过它们的--name 相互解析。
  • 你说得对 - 我是凭记忆写的,我一直使用 --link :)
【解决方案2】:

如果您只想进行开发,您可以链接容器,或者更好地使用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 并在您的应用程序中检索它。

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 2017-11-30
    • 1970-01-01
    • 2017-10-22
    • 2017-07-24
    • 2019-08-08
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多