#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