简体   繁体   English

Spring Boot 无法在 docker 环境下与 MySQL DB 通信

[英]Spring Boot unable to communicate with MySQL DB in docker environment

I am trying to run a springboot microservice docker image.我正在尝试运行 springboot 微服务 docker 映像。 It fetches the DB connection properties from a Config server.它从配置服务器获取数据库连接属性。 However it is unable to connect to the container.但是它无法连接到容器。

Error :错误 :

JdbcEnvironmentInitiator - HHH000342: Could not obtain connection to query metadata : 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.

Exception :例外 :

at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.21.jar!/:8.0.21]
Caused by :
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_242]
2020-09-28 11:39:32.782 [ : ] WARN  [task-1] o.h.e.j.s.SqlExceptionHelper - SQL Error: 0, SQLState: 08S01
 1 --- [         task-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 08S01
2020-09-28 11:39:32.791 [ : ] ERROR [task-1] o.h.e.j.s.SqlExceptionHelper - 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.
 1 --- [         task-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : 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.

Properties located at Config Server位于配置服务器的属性

shopping-service.datasource.url: jdbc:mysql://A.B.C.D:3306/shoppingCartDB
shopping-service.datasource.username: root
shopping-service.datasource.password: root

ABCD is my docker host IP. ABCD是我的 docker 主机 IP。

application.yaml应用程序.yaml

datasource:
    url: ${shopping-service.datasource.url}
    username: ${shopping-service.datasource.username}
    password: ${shopping-service.datasource.password}
    #driver-class-name: com.mysql.jdbc.Driver
  jpa:
    generate-ddl: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
        show_sql: true
        ddl-auto: create-drop
  profiles:
    active: dev

I have pulled the MySQL 8.0 docker image from docker hub.我已经从 docker hub 拉取了 MySQL 8.0 docker 镜像。

docker pull mysql/mysql-server:8.0
docker run --name=mysql-container -d mysql/mysql-server:8.0

Changed the password to "root".将密码更改为“root”。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.02 sec)

Created the database :创建了数据库:

mysql> create DATABASE shoppingCartDB;
Query OK, 1 row affected (0.00 sec)

mysql> exit

Docker RUN运行

docker run -p 5000:5000 shoppingms:latest --env shopping-service.configserverurl=http://A.B.C.D:8888 --env shopping-service.eureka.url=http://A.B.C.D:4444/eureka

It is able to fetch the properties from config server.它能够从配置服务器获取属性。 I checked the logs.我检查了日志。 Error came from this line :错误来自这一行:

 com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...

In my local environment I am able to use the locally installed MySQL Db with the same connection parameters.在我的本地环境中,我能够使用具有相同连接参数的本地安装的 MySQL Db。 However in docker I am getting the exceptions.但是在 docker 中我得到了例外。 Where I am going wrong can anyone please help me out.我哪里出错了,任何人都可以帮助我。

UPDATE :更新 :

After exposing the MySQL container to port 3306, the error stands at now :将 MySQL 容器暴露给端口 3306 后,现在出现错误:

2020-09-28 12:07:43.942 [ : ] WARN  [task-1] o.h.e.j.e.i.JdbcEnvironmentInitiator - HHH000342: Could not obtain connection to query metadata : null,  message from server: "Host 'Some-IP' is not allowed to connect to this MySQL server"
     1 --- [         task-1] o.h.e.j.e.i.JdbcEnvironmentInitiator     : HHH000342: Could not obtain connection to query metadata : null,  message from server: "Host 'Some-IP' is not allowed to connect to this MySQL server"

2020-09-28 12:07:49.219 [ : ] WARN  [task-1] o.h.e.j.s.SqlExceptionHelper - SQL Error: 1130, SQLState: HY000
 1 --- [         task-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1130, SQLState: HY000
2020-09-28 12:07:49.225 [ : ] ERROR [task-1] o.h.e.j.s.SqlExceptionHelper - null,  message from server: "Host 'Some-IP' is not allowed to connect to this MySQL server"
 1 --- [         task-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : null,  message from server: "Host 'Some-IP' is not allowed to connect to this MySQL server"

I would suggest running a docker compose file to describe your application setup.我建议运行一个 docker compose 文件来描述您的应用程序设置。

As a guide line, this is a compose file for running phpMyAdmin, MySQL 8, tomcat on a given network.作为指导,这是一个用于在给定网络上运行 phpMyAdmin、MySQL 8、tomcat 的组合文件。 I have given a guess at your application requirement:我已经猜测了您的申请要求:

version: "3.5"
services:
  # Update the below for your application
  app:
    image: shoppingms:latest
    restart: always
    ports:
      - 5000:5000
    links:
      - db:db
    environment: 
      - shopping-service.configserverurl=http://A.B.C.D:8888
      - shopping-service.eureka.url=http://A.B.C.D:4444/eureka
    networks: 
      - appnet
  db:
    image: mysql:8.0
    restart: always
    ports:
        - 3306:3306
    command: --default-authentication-plugin=mysql_native_password
    environment:
        MYSQL_DATABASE: mydb
        MYSQL_USER: user
        MYSQL_PASSWORD: user123
        MYSQL_ROOT_PASSWORD: user123
    volumes:
        - ./sql-init:/docker-entrypoint-initdb.d
        - ./mysql/data:/var/lib/mysql
    networks:
        - appnet
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    links:
        - db:db
    ports:
        - 8201:80
    environment:
        MYSQL_USER: user
        MYSQL_PASSWORD: user123
        MYSQL_ROOT_PASSWORD: user123
    networks:
        - appnet
  tomcat:
    image: library/tomcat:9
    restart: always
    links:
        - db:db
    ports:
        - 8081:8080
    volumes:
      - ./tomcat/webapps:/usr/local/tomcat/webapps
      - ./tomcat/logs:/usr/local/tomcat/logs
    networks:
        - appnet

networks:
  appnet:
    name: appnet

In this application I was running a externally hosted tomcat server with Spring webapp volumed into the container.在这个应用程序中,我运行了一个外部托管的 tomcat 服务器,其中 Spring webapp 被卷入到容器中。 There are various ports exposed as well for ease of external access.为了便于外部访问,还暴露了各种端口。

You would need configure/tweak your application container as per your requirement.您需要根据您的要求配置/调整您的应用程序容器。

The Database is exposed on the DNS name db which is what phpMyAdmin uses.数据库公开在 phpMyAdmin 使用的 DNS 名称db上。

Able to resolve the issue now.现在可以解决问题。

 1. Identify the ip address from docker inspect command.
 2. Create an user for that ip.
 3. Need to alter the new user password.
 4. Grant some privileges to the user.
 5. Exit

Now run your container again, this time it could obtain the connections and successfully create the tables.现在再次运行您的容器,这次它可以获取连接并成功创建表。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM