【问题标题】:Cannot connect to Mysql server in docker from another container无法从另一个容器连接到 docker 中的 Mysql 服务器
【发布时间】:2020-04-25 12:53:58
【问题描述】:

我现在坐下来寻找解决方案超过 6 小时。请帮我。首先,我将尝试解释我的问题。我使用图像(在 dcoker 中)创建了 MySql 数据库,但是当我想创建另一个容器(Sprig Boot)并连接到数据库时,我不能。我尝试只创建 MySql 的图像并从 intellij 连接,一切都是正确的。只有当我尝试在容器中创建项目时才有问题......

我的文档编写

version: '3'
services:
  api:
    build: ./springboot-api-docker
    ports:
    - "9090:9090"
    depends_on:
      - database
  database:
    container_name: 'localhost'
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_PASSWORD: password
      MYSQL_USER: user
      MYSQL_DATABASE: animaldb
    ports:
      - "3307:3306"
    restart: always

应用程序属性

server.port = 9090

spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3307/animaldb?autoReconnect=true&useSSL=false
spring.datasource.username=user
spring.datasource.password=password

和DocerFile

FROM openjdk:8u201-jdk-alpine3.9
ADD target/springboot-api-docker-0.0.1-SNAPSHOT.jar .
EXPOSE 9090
CMD java -jar springboot-api-docker-0.0.1-SNAPSHOT.jar

这很有趣,因为...首先我想将容器“localhost”的名称更改为另一个。但是当我改变这一点时,即使从 intellij 也无法运行 Spring Bot Application。我在 docker 中创建了 MySql 的图像,并试图在 intellij 中连接。它正在闪烁,但是当我想在容器中使用 SpringBoot 应用程序时,问题就来了。我还没有找到适合我的解决方案。我将非常感谢您的每一次帮助。

我的错误在这里。

java.sql.SQLNonTransientConnectionException: 无法创建 连接到数据库服务器。尝试重新连接 3 次。放弃。

以及来自控制台的所有文本。也许你会发现它更快。

原因:org.hibernate.service.spi.ServiceException:无法 创建请求的服务 [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] api_1 |在 org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275) ~[hibernate-core-5.4.9.Final.jar!/:5.4.9.Final]

引起:com.mysql.cj.exceptions.CJCommunicationsException: 通讯链路故障 api_1 | api_1 |最后 成功发送到服务器的数据包是 0 毫秒前。这 驱动程序没有收到来自服务器的任何数据包。 api_1 |
在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 方法)~[na:1.8.0_201] api_1 |在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_201] api_1 |在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_201] api_1 |在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_201] api_1 |在 com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 |在 com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 |在 com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 |在 com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 |在 com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 |在 com.mysql.cj.NativeSession.connect(NativeSession.java:144) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 |在 com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:850) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 | ... 58 常用框架省略 api_1 |造成的: java.net.ConnectException:连接被拒绝(连接被拒绝) api_1 |在 java.net.PlainSocketImpl.socketConnect(本机 方法)~[na:1.8.0_201] api_1 |在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_201] api_1 |在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_201] api_1 |在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_201] api_1 |在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_201] api_1 |在 java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_201] api_1 | 在 com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 |在 com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 | ... 60 常用框架省略

【问题讨论】:

  • 你遇到了什么错误,你运行的是什么环境(mac/windows/linux)?
  • 我再次编辑了帖子。我无法与 mysql 建立连接。我使用 Windows。
  • @Andrii 你找到解决问题的方法了吗?

标签: java mysql spring-boot docker docker-compose


【解决方案1】:

使用 localhost 作为 docker 容器名称并不好。

将本地主机更改为类似的数据库。

localhost 始终是您的本地机器或本地 docker,而不是外部资源。

docker-compose

version: '3'
services:
  api:
    build: ./springboot-api-docker
    ports:
    - "9090:9090"
    depends_on:
      - database
    links:
      - database
  database:
    container_name: 'database'
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_PASSWORD: password
      MYSQL_USER: user
      MYSQL_DATABASE: animaldb
    ports:
      - "3307:3306"
    restart: always

application.properties:

server.port = 9090

spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://database: 3306/animaldb?autoReconnect=true&useSSL=false
spring.datasource.username=user
spring.datasource.password=password

【讨论】:

  • 我知道,但它仍然无法正常工作。该名称不会导致错误。
  • 您使用的是外部端口3307,请尝试在spring.datasource.url中使用3306。
【解决方案2】:

我知道2年后已经很晚了,但是您应该先创建网络,然后将两个容器添加到网络中。

docker network create network name

docker run yourcontainter --net network name

【讨论】:

    猜你喜欢
    • 2019-09-04
    • 2019-07-20
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2020-02-18
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多