Отказ в соединении: во время работы Docker Compose - PullRequest
0 голосов
/ 03 февраля 2020

Я новый ребенок в Docker. Я использую docker в приложении весенней загрузки. Ниже мой файл.

Файл Application.properties:

spring.datasource.url=jdbc:mysql://${DATABASE_HOST}:3306/${DATABASE_NAME}?allowPublicKeyRetrieval=true&useSSL=true
spring.datasource.username = root
spring.datasource.password = root
server.port=8443

DockerFile:

FROM openjdk:latest
ADD target/app.jar app.jar
EXPOSE 8443
ENTRYPOINT ["java","-jar","app.jar", "--spring.profiles.active=docker"]

Docker Состав:

version: '3.1'
services:
  mysqlDb:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=springdemo
      - MYSQL_USER=root
      - MYSQL_PASSWORD=root
      - DATABASE_HOST= 192.168.0.1
    volumes:
      - /data/mysql
    ports:
    - "3306:3306"
    container_name: mysql-db

  springbootdocker:
    image: xyz/signup
    restart: always
    ports:
      - "8080:8080"
    depends_on:
      - mysqlDb
    links:
      - mysqlDb   
    environment:
      - DATABASE_HOST= mysqlDb
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root
      - DATABASE_NAME=springdemo
      - DATABASE_PORT=3306
    healthcheck:
      test: ["CMD","curl","-f","http://localhost:8080/health"]
      interval: 1m30s
      timeout: 10s 
      retries: 3 

Решена 1-я часть проблемы: при запуске приложения я получаю следующую ошибку:

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: 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.



Caused by: java.net.UnknownHostException: ${DATABASE_HOST}

1) Что я пытаюсь достичь -

  • Хотите создать банку для моего приложения.
  • После создания баночки я хочу создать изображение из баночки
  • После создания образа приложения , я хочу положить sh в docker хаб.
  • С другого сервера я буду запускать файл docker -compose.yml. Он извлечет mysql и образ из хаба docker и запустит приложение на другом порту, как указано в docker -compose.

Надеюсь, я ясно, что я хочу

Здесь возникает проблема:

  • , когда я пытаюсь запустить приложение локально, я могу создать только банку когда я пишу эту строку в классе application.properties.

    spring.datasource.url = jdb c: mysql: //127.0.0.1: 3306 / springdemo? allowPublicKeyRetrieval = true & useSSL = true

Я могу создать банку и после этого изображения -> загрузить это изображение в docker концентратор, когда я запускаю docker -компоновать возможность чтобы извлечь это изображение, но не может подключиться к mysql верстаку.

  • Итак, я подумал, что я запускаю docker -compose в различных системах / серверах. Там IP-адрес другой.

    Итак, я изменил URL-адрес на это:

spring.datasource.url = jdb c: mysql : //192.168.0.1: 3306 / springdemo? AllowPublicKeyRetrieval = true & useSSL = true

где

192.168.0.1 - this ip is for the diffrent server, where i want to run the docker-compose file

Но когда я запускаю приложение весенней загрузки, я не могу запустить приложение, потому что оно говорит почти ту же ошибку, что и выше, то есть отказ в соединении. Так что я не могу создать банку, поэтому не могу создать изображение. Таким образом, моя идея не работает и здесь.

  • И снова, одна мысль снова приходит мне на ум, не можем ли мы поместить динамический c IP-адрес в файл application.properties, поэтому я попробовал эту строку :

spring.datasource.url = jdb c: mysql: // $ {DATABASE_HOST}: 3306 / $ {DATABASE_NAME}? AllowPublicKeyRetrieval = true & useSSL = true

DATABASE_HOST - вы можете найти его в docker -компонентном файле

Я подумал, что это может быть: $ {DATABASE_HOST}, выберет значение DATABASE_HOST из docker - compose.

Но моя идея не удалась, я получаю сообщение об ошибке, как указано в верхней части при запуске приложения. не могу создать банку, поэтому не могу создать изображение.

2-я часть - проблема все еще открыта

, когда я могу запустить docker -создать в моем локальном терминале, и в состоянии создать контейнер. Я также вижу, что mysql подключен, как и моя схема. Но когда я пытаюсь получить доступ к своему API через почтальон или веб-браузер, он говорит, что не подключен

http://localhost:8080/dockerex

Внутри моего класса контроллера:

@RestController
@RequestMapping(value = "/dockerex")
public class SpringBootDockerController {

    @GetMapping
    public String check() {
        return "checking";
    }
}

, когда я проверяю свой контейнер, ip адрес становится пустым: снимок conatiner:

[
 {
     "Id": "7664bab5ed452e3e2243e1802010240ab5a3eb817af6164e985b10e729ff4c8f",
     "Created": "2020-02-04T17:30:08.5351511Z",
     "Path": "java",
     "Args": [
         "-jar",
         "app.jar",
         "--spring.profiles.active=docker"
     ],
     "State": {
         "Status": "running"
.......................
"PortBindings": {
             "8080/tcp": [
                 {
                     "HostIp": "",
                     "HostPort": "8080"
                 }
             ]
         },

Ответы [ 4 ]

1 голос
/ 04 февраля 2020

Хорошо, это сработало, но здесь вы видите, что ранее вы использовали DB_HOST, теперь вы используете DATABASE_HOST = mysqlDb, который в данный момент указывает на ваше mysql имя службы. это имя службы может быть обнаружено в одной сети, созданной docker compose. Вы жестко запрограммировали DB_HOST = 192.168.0.1 и пытались подключиться, используя этот IP-адрес, который недопустим, так как docker compose создает свою сеть.

0 голосов
/ 03 февраля 2020

Попробуйте:

Замените DB_HOST= 192.168.0.7 на DB_HOST= mysqldb в вашем docker -композитном файле.

И обновите файл application.properties:

spring.datasource.url=jdbc:mysql://$(DB_HOST:mysqlDb):3306/springdemo?allowPublicKeyRetrieval=true&useSSL=true

к этому:

spring.datasource.url=jdbc:mysql://$(mysqlDb):3306/springdemo?allowPublicKeyRetrieval=true&useSSL=true
0 голосов
/ 03 февраля 2020

Спасибо всем: я получил решение с помощью удара и следа: P

spring.datasource.url=jdbc:mysql://${DATABASE_HOST:localhost}:${DATABASE_PORT:3306}/springdemo?allowPublicKeyRetrieval=true&useSSL=true
0 голосов
/ 03 февраля 2020

Вы должны указать здесь имя службы, так как в вашем случае имя службы db равно mysqlDb . Ниже обновленное приложение. Свойства

spring.datasource.url=jdbc:mysql://$(DB_HOST:mysqlDb):3306/springdemo?allowPublicKeyRetrieval=true&useSSL=true
spring.datasource.username = root
spring.datasource.password = root
server.port=8443
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...