【问题标题】:Docker - Spring Boot application - cannot access MySql server on localhostDocker - Spring Boot 应用程序 - 无法访问本地主机上的 MySql 服务器
【发布时间】:2019-01-16 04:03:55
【问题描述】:

如何将在 Docker 中运行的 Spring Boot (JAR) 应用程序连接到我计算机上的 MySql 服务器? [我尝试了不同的帖子,但没有帮助]

在我的 Spring Boot 'application.properties' 中,我有:

spring.datasource.url = jdbc:mysql://localhost:3306/geosoldatabase

我尝试了多种选择:

$ docker run -p 8080:8080 --name containername imagename

$ docker run --net="host" -p 8080:8080 --name containername imagename

$ docker run -p 8080:8080 --add-host=localhost:192.168.99.100 --name containername imagename

但是,我无法连接到 MySql 服务器。休眠失败。在我的 CAAS 提供商上,这一切都很好 - 当然使用已知的容器名称。

我的 Dockerfile 很简单:

FROM fabric8/java-jboss-openjdk8-jdk
ENV JAVA_APP_JAR myapplication.jar
ENV AB_OFF true
EXPOSE 8080
ADD target/$JAVA_APP_JAR /deployments/

按照建议,也可以使用环境变量。这是我到目前为止所做的:

  • 在Windows10环境设置界面定义,我定义了如下环境变量:[1] DATABASE_HOST=127.0.0.1:3306 and [2] DATABASE_NAME=mydbname
  • 我按照建议更改了 application.properties 文件: spring.datasource.url = jdbc:mysql://${DATABASE_HOST}/${DATABASE_NAME}

在我输入“docker push...”后的 Docker 快速启动屏幕中,我得到了同样的错误。这次原因不同:

引起:java.net.UnknownHostException:${DATABASE_HOST}:名称或 服务未知。

要检查环境变量是否设置正确,我输入:“echo ${DATABASE_HOST}”,得到值“127.0.0.1:3306”。

更新:建议将 'docker-machine ip' 地址放入 database_host 变量中。原因现在有点不同:

原因:org.hibernate.tool.schema.spi.SchemaManagementException: Unable to open JDBC connection for schema management target

【问题讨论】:

  • docker run --net="host" 应该是正确的方法,当你使用它运行它时会发生什么?超时?
  • @JackGore - 消息是 [1] com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure, [2] 最后一个成功发送到服务器的数据包是 0 毫秒前。驱动没有收到服务器发来的任何数据包 [3] Caused by: java.net.ConnectException: Connection refused (Connection denied)
  • 您是否尝试将您的docker-machine ip 输出作为主机?我今天必须意识到,win10的docker工具箱和docker(native)必须配置不同
  • 无修复。请参阅下面问题中的标题“更新”。

标签: docker spring-boot


【解决方案1】:

在您的 docker run 命令中使用 --network="host" ,然后您的 docker 容器中的 127.0.0.1 将指向您的 docker 主机。请参阅this post 中的答案。

【讨论】:

    【解决方案2】:

    好吧,正如我所承诺的那样 - 我自己也试过了。

    假设你的 localhost mysql 实例在默认端口 3306 上运行,在你的 spring boot 项目的 application.properties 中有以下内容:

    spring.datasource.url = jdbc:mysql://${DATABASE_HOST}/${DATABASE_NAME}
    

    然后使用以下环境变量在 docker 容器中运行您的 Spring Boot 应用程序

    DATABASE_HOST=127.0.0.1:3306
    DATABASE_NAME=yourDBname
    

    如果您使用上述配置,请不要在任何地方的属性中添加端口。或者,为了测试,将这些直接推入 application.properties 中的 spring.datasource.url

    祝你好运。

    【讨论】:

    • 如果正确请打勾:)
    • 唉,不工作。得到同样的错误(在 Win10 上),这一次得到 - Caused by: java.net.UnknownHostException: ${DATABASE_HOST}: Name or service not known。当我在 Docker 快速启动屏幕中输入内容时,我得到“echo ${DATABASE_HOST}”的值“127.0.0.1:3306”。
    • 看起来您没有正确传递环境变量。请详细说明你是如何做到的。
    • 我更新了我的问题 - 所以你可以看到我到底做了什么。
    • 是DATABASE_HOST相关的问题。尝试制作一个 docker-compose,然后所有容器将共享同一个网络。如果您将 HOST 设置为 127.0.0.1,则该地址与容器网络有关,因此它会尝试连接到自己。使用 compose,它们将共享网络,您可以通过 container_name 调用每个服务
    【解决方案3】:

    您需要在 Spring Boot 应用程序属性中有一个环境变量来代替 mysql URL 中的“localhost”。将其设置为默认本地主机:

    MYSQL_HOST=localhost
    spring.datasource.url = jdbc:mysql://${MYSQL_HOST}:3306/geosoldatabase
    

    然后您可以将 MYSQL_HOST 环境变量作为 docker run 命令的一部分传递。它应该是您的 mysql 容器的名称。所以给它一个特定的容器名称,比如“mysql”

    更好的方法是使用docker compose,在compose文件中指定一个网络,并以与上面相同的方式传入环境变量。希望有帮助。

    【讨论】:

    • 对不起,我在那里写的假设你的 mysql dB 也是容器化的。我将为实际本地安装的 mysql 服务器添加另一个答案。
    猜你喜欢
    • 2022-07-25
    • 2015-09-27
    • 1970-01-01
    • 2021-03-05
    • 2020-04-03
    • 2019-02-21
    • 2019-01-31
    • 2020-07-12
    • 1970-01-01
    相关资源
    最近更新 更多