Контейнер 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 Containerdocker 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 со всеми записями в моей таблице пользователей.

0 ответов

Другие вопросы по тегам