Не удается подключить службу Spring-Boot 2 к MySQL в другом контейнере - PullRequest
0 голосов
/ 28 июня 2019

У меня есть служба весенней загрузки 2.16, которая подключается к базе данных my-sql. Он работает, как и ожидалось, поскольку все компоненты находятся на одном хосте. Я попытался улучшить решение и создать док-контейнер с запущенной службой sprin-boot со встроенным Tomcat и еще один докер-контейнер с сервером my-sql. Тот же код больше не работает. вот исключение:

 2019-06-28 12:23:48 ERROR 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)
at  sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:988)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:341)
....
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:211)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:300)
... 66 common frames omitted

Итак, IP-адрес сервера my-sql не найден или сервер не работает и т. Д. Вот файл docker-compse.yml:

version: "2"
services:
  rdf-data:
    container_name: rdf-data
    image: mysql:latest
    environment:
      MYSQL_DATABASE: test
      MYSQL_USER: nicolas
      MYSQL_PASSWORD: mysql
      MYSQL_ROOT_PASSWORD: mysql
    ports:
      - 3306:3306
      - 33060:33060
    hostname: rdf-data
    networks:
      net1:
        ipv4_address: 192.19.0.4
  rdf-core:
    image: openjdk:8-jdk-alpine
    depends_on:
      - rdf-data
    container_name: rdf-core
    links:
      - rdf-data:rdf-data
    volumes:
      - ../docker:/usr/local/share/rdf
    ports:
      - "8080:8080"
    entrypoint: /usr/local/share/rdf/run.sh
    hostname: rdf-core
    environment:
      PROFILE: "default"
      SERVER_PORT: "8080"
  networks:
    net1:
      ipv4_address: 192.19.0.8
networks:
  net1:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
  ipam:
    driver: default
    config:
      - subnet: 192.19.0.0/24
        gateway: 192.19.0.1

Здесь есть два контейнера: rfd-core с IP-адресом 192.19.0.8 и rdf-data с IP-адресом 192.19.0.4. Каждый контейнер может пропинговать другой. Машина hst может пропинговать каждый контейнер. С хост-компьютера я могу правильно подключиться к серверу my-sql, работающему на rfd-data, с помощью клиента командной строки my-sql. Однако мое подключение к услуге, показанное здесь ниже, не работает:

database=mysql
spring.datasource.url=jdbc:mysql://192.19.0.4/test?useSSL=false
spring.datasource.username=root
spring.datasource.password=mysql
spring.datasource.driver-class=com.mysql.cj.jdbc.MysqlXADataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.idleTimeout=600000
spring.datasource.hikari.maxLifetime=1800000
...

Есть ли что-то, что я пропускаю?

1 Ответ

0 голосов
/ 28 июня 2019

Попробуйте указать параметры приложения весенней загрузки в части среды вашего docker-compose файла:

 rdf-core:
    image: openjdk:8-jdk-alpine
    depends_on:
      - rdf-data
    container_name: rdf-core
        links:
          - rdf-data:rdf-data
        volumes:
          - ../docker:/usr/local/share/rdf
        ports:
          - "8080:8080"
        entrypoint: /usr/local/share/rdf/run.sh
        hostname: rdf-core
        environment:
          PROFILE: "default"
          SERVER_PORT: "8080"
          spring.datasource.url=jdbc:mysql://ipaddress/test?useSSL=false
          spring.datasource.username=root
          spring.datasource.password=mysql
          spring.datasource.driver-class=com.mysql.cj.jdbc.MysqlXADataSource
          spring.datasource.driver-class-name=com.mysql.jdbc.Driver
          spring.datasource.hikari.connectionTimeout=30000
          spring.datasource.hikari.idleTimeout=600000
          spring.datasource.hikari.maxLifetime=1800000

Другая возможная причина проблемы: depends_on не гарантирует, что контейнер зависимостей работает полностью. поэтому если для полного запуска контейнеров MySQL требуется больше времени, чем для контейнера Spring Boot, соединение не устанавливается.

Взгляните на это:

Spring Boot + docker-compose + MySQL: соединение отклонено

Существует несколько возможных способов заставить контейнер ждать другого: Используйте перезапуск при сбое или docker compose wait ( Github link )

...