Контейнер Spring-Boot API не может подключиться к контейнеру MySQL в той же определяемой пользователем сети Docker

Я запускаю 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 со всеми записями в моей таблице пользователей.


person johnbrans    schedule 16.02.2019    source источник
comment
Пробовали ли вы в свойствах весенней загрузки вместо localhost использовать IP-адрес контейнера mysl?   -  person Hakob Hakobyan    schedule 16.02.2019
comment
... вы должны использовать --name другого контейнера в качестве имени хоста, jdbc:mysql://snc-dev-db/snc_users. Внутренние IP-адреса Docker меняются при каждом перезапуске контейнера и недоступны во многих случаях, и я бы вообще избегал их использования.   -  person David Maze    schedule 16.02.2019
comment
@DavidMaze Думаю, вы правы насчет дубликата. Я не нашел этого в своем поиске. Я смог внести предложенные вами изменения, и это решило мою проблему. Изменил конфигурацию моего источника данных application.properties на: spring.datasource.url=jdbc:mysql://snc-dev-db:3306/snc_users?useSSL=false Спасибо!!   -  person johnbrans    schedule 16.02.2019