Соединение Docker compose между контейнером java и mysql невозможно

#java #mysql #docker #docker-compose #dockerfile

#java #mysql #docker #docker-compose #dockerfile

Вопрос:

У меня есть приложение java spring / hibernate, и я не могу создать соединение между контейнерами mysql и java. Когда я запускаю только контейнер mysql и запускаю Java-приложение вручную в CMD, оно работает нормально. Но как только приложение Java запускается в контейнере, я получаю следующую проблему:

 bookAPI | com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
bookAPI |
bookAPI | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
bookAPI |      at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.21.jar!/:8.0.21]
bookAPI |      at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-java-8.0.21.jar!/:8.0.21]
  

Если я правильно понимаю ошибку, контейнер java может отправлять в контейнер mysql, но не наоборот. Я связал контейнер java с контейнером mysql. Кто-нибудь знает, как правильно подключить эти контейнеры?

Мой docker-compose.yml выглядит следующим образом:

 version: '3'
 
services:
  db:
    image: mysql:5.7
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: aaaaaa
      MYSQL_DATABASE: bookAPI
      MYSQL_USER: aaaaaa
      MYSQL_PASSWORD: aaaaaa
    ports:
      - 3306:3306
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    links:
      - db
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
      PMA_ARBITRARY: 1
    restart: always
    ports:
      - 8081:80
  java:
    container_name: bookAPI
    image: openjdk:8
    depends_on:
    - db
    volumes:
    - ./:/app
    working_dir: /app
    command: bash -c "cd /app amp;amp; java -jar bookAPI.jar"  
    stdin_open: true
    tty: true
    ports:
      - 8080:8080
    links:
      - db
  

Комментарии:

1. Следуйте этому коду javainuse.com/zip/docker/employee-jdbc.zip или этот URL javainuse.com/devOps/docker/docker-mysql это поможет вам.

2. Если вы удалите все, links: тогда настройка, описанная в разделе Создание сетей в Compose , должна работать просто отлично. К какому адресу вы пытаетесь подключиться? Можете ли вы показать эту часть своей конфигурации?

Ответ №1:

Вы также можете напрямую переопределить applications.properties с помощью переменных среды docker-compose, подобных этому :

   java:
    container_name: bookAPI
    image: openjdk:8
    volumes:
    - ./:/app
    working_dir: /app
    command: bash -c "cd /app amp;amp; java -jar bookAPI.jar"
    stdin_open: true
    tty: true
    environment:
      spring.datasource.url="jdbc:mysql://db:3306/bookAPI""
    links:
      - db
    ports:
      - 8080:8080
  

Я бы порекомендовал вам использовать depends_on db вместо ссылок

 depends_on:
  - db
  

Ответ №2:

Хорошо, я решил проблему. Для подключения приложения spring к другому контейнеру docker вам необходимо изменить значение url application.properties с localhost или ip на имя контейнера docker maysql. Это сложно при локальном запуске или запуске maven install, поэтому лучше всего перезаписать его при запуске приложения в контейнере.

   java:
    container_name: bookAPI
    image: openjdk:8
    volumes:
    - ./:/app
    working_dir: /app
    command: bash -c "cd /app amp;amp; java -jar bookAPI.jar  --spring.datasource.url="jdbc:mysql://db:3306/bookAPI""  
    stdin_open: true
    tty: true
    links:
      - db
    ports:
      - 8080:8080