【问题标题】:Docker - Spring Boot JPA(inside Docker) + MySQL(outside Docker)Docker - Spring Boot JPA(Docker 内部)+ MySQL(Docker 外部)
【发布时间】:2018-11-07 15:05:15
【问题描述】:

我是 Docker 新手。试图通过一个小例子来理解这些概念。 目前,我有 SpringBoot REST JPA(8080 端口)+ MySQL 服务器(3306 端口)。工作得很好(没有码头)。

我想在 Docker 容器中部署 Spring Boot REST JPA,并且 MySQL 应该保留在 Docker 引擎之外,它应该继续在相同的 localhost:3306 端口中运行。

一开始,创建了一个没有 JPA 的简单 HelloWorld 应用程序,能够容器化。并且能够从 RESTful URL 获取输出。现在棘手的部分启动了 MySQL 服务器 3306 并将数据库凭据添加到 Hello World 代码,再次构建并运行 docker。我猜它无法找到本地主机:3306?请建议如何使这项工作?我不想容器化 MySQL 服务器。

SpringBoot application.properties 文件:

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Dockerfile:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} demo-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/demo-0.0.1-SNAPSHOT.jar"]

错误:

2018-05-28 08:24:28.897  INFO 1 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2018-05-28 08:24:28.898  INFO 1 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2962 ms
2018-05-28 08:24:29.250  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Servlet dispatcherServlet mapped to [/]
2018-05-28 08:24:29.260  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-05-28 08:24:29.263  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-05-28 08:24:29.263  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-05-28 08:24:29.263  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2018-05-28 08:24:29.587  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2018-05-28 08:24:30.811 ERROR 1 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_151]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_151]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_151]

谢谢。

【问题讨论】:

    标签: docker spring-boot


    【解决方案1】:

    docker ontainer 通常在单独的网络命名空间中运行。这意味着例如localhost 指的是运行在其中的进程的容器。

    要解决您需要的问题,您需要更新连接字符串:

    spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false
    

    以便它产生一个有效的连接。此外,还有多种网络选项可用于各种场景。 https://docs.docker.com/network/

    如果这仅用于本地开发,最简单的可能是使用host 网络,但这可能不是您在生产环境中想要的设置。

    【讨论】:

    • 感谢您的快速回复,您的意思是用 IP 地址替换 localhost 吗?
    • 是的,应该可以工作(取决于您的设置)。但是为什么不在容器中运行 mysql 并使用 docker-compose 编排它们呢?
    • 最终我打算使用 AWS Aurora(MySQL 的味道)作为数据库,它不能被容器化。
    • 然后使用主机IP地址应该可以。如果您在 VM 或其他设备中运行容器,您可能会遇到一些问题。
    猜你喜欢
    • 2017-09-28
    • 2022-07-12
    • 1970-01-01
    • 2018-11-28
    • 2023-02-01
    • 2017-10-22
    • 2019-01-21
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多