Контейнер Spring-Boot API не может подключиться к контейнеру MySQL в той же пользовательской сети Docker
Я бегу 2 контейнера. Первым является REST API/ сервис Java Spring-Boot. Вторая база данных MySQL. Я пытаюсь выполнить простой запрос GET от работающего контейнера API к работающему контейнеру MySQL, который должен вернуть все записи из таблицы в контейнере базы данных MySQL.
Когда оба контейнера работают, я пытаюсь сделать простой запрос GET http://localhost:15505/users/all
или же http://172.18.0.3:15505/users/all
(через браузер или почтальон), я получаю сообщение об ошибке:
{
"timestamp": "2019-02-16T16:51:39.127+0000",
"status": 500,
"error": "Internal Server Error",
"message": "Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection",
"path": "/users/all"
}
Когда я проверяю журналы контейнера для API через docker logs <container-id>
Я вижу более подробное сообщение об ошибке, указывающее на проблемы с подключением к контейнеру БД MySQL:
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
Что я сделал для устранения неполадок
Я могу запустить API из IntelliJ локально, запустить контейнер MySQL, выполнить запрос GET и получить ожидаемый ответ (т.е. все записи из таблицы пользователей).
Я могу подключиться к работающему контейнеру MySQL через MySQL Workbench. Я могу выполнять любые действия с БД с этого клиента (например, INSERT/SELECT/DELETE и т. Д.).
Я создал пользовательскую сеть Docker local-network
, Когда я создал свои контейнеры, используя docker run
Я добавил оба в эту сеть. Когда я проверяю сеть, я вижу оба контейнера в этой сети.
я использовал docker exec <container-id> bash
для каждого контейнера. Я был в состоянии успешно выполнить ping
в обоих направлениях - по идентификатору контейнера и по имени контейнера.
Из Spring-Boot API - application.properties
server.port=15505
spring.datasource.url=jdbc:mysql://localhost:3306/snc_users?useSSL=false
spring.datasource.username=root
spring.datasource.password=pass123
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
Коллекция контейнеров отdocker network inspect local-network
"Containers": {
"61a9c53af62c26bedbf0ed8ffaeed2b97e61f7cff1e9644b71ffa2f45877c2e6": {
"Name": "snc-users-api-local",
"EndpointID": "3dc0a3abd3571cedf7d2250d35868b604531a75abb2091bfde1a9a444889d7eb",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"efda04231e97a46c9d16c3825d6b370b475f315387c92be2ca86f87e80533786": {
"Name": "snc-dev-db",
"EndpointID": "151bdc6c7a8a5a85aba15bfcb5c522cfc390b9b54ac57295f6ac989e08363ad8",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
Команды Docker, используемые для создания и запуска контейнеров
MySQL Container
docker run -p 3306:3306 -d --name snc-dev-db -e MYSQL_ROOT_PASSWORD=pass123 --network local-network mysql:5.6.41
Spring-Boot API-контейнер
docker run -p 15505:15505 -d --name snc-users-api-local --network local-network 5386a58f10c2
ПРИМЕЧАНИЕ. 5386a58f10c2 - это идентификатор моего изображения API.
Я ожидаю, что смогу отправиться в путь http://localhost:15505/users/all
или же http://172.18.0.3:15505/users/all
и получить ответ 200 со всеми записями в моей таблице пользователей.