Я запускаю 2 контейнера. Первый — это API/сервис Java Spring-Boot REST. Второй — база данных MySQL. Я пытаюсь выполнить простой запрос GET из работающего контейнера API в работающий контейнер MySQL, который должен вернуть все записи из таблицы в контейнере MySQL db.
Когда оба контейнера запущены, я пытаюсь сделать простой запрос GET к http://localhost:15505/users/all
или http://172.18.0.3:15505/users/all
(через браузер или Postman), получаю сообщение об ошибке:
{
"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
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 со всеми записями в моей таблице пользователей.
--name
другого контейнера в качестве имени хоста,jdbc:mysql://snc-dev-db/snc_users
. Внутренние IP-адреса Docker меняются при каждом перезапуске контейнера и недоступны во многих случаях, и я бы вообще избегал их использования. - person David Maze   schedule 16.02.2019application.properties
на:spring.datasource.url=jdbc:mysql://snc-dev-db:3306/snc_users?useSSL=false
Спасибо!! - person johnbrans   schedule 16.02.2019