Spring-Boot API容器无法连接到同一用户定义的Docker网络上的MySQL容器

时间:2019-02-16 17:56:48

标签: mysql spring-boot docker docker-network

我正在运行2个容器。第一个是Java Spring-Boot REST API /服务。第二个是MySQL数据库。我正在尝试从运行中的API容器向运行中的MySQL容器执行一个简单的GET请求,该请求应返回MySQL db容器中的表中的所有记录。

当两个容器都在运行时,我尝试通过浏览器或邮递员向http://localhost:15505/users/allhttp://172.18.0.3:15505/users/all发出简单的GET请求,但出现错误:

{
    "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"
}

当我通过docker logs <container-id>检查API的容器日志时,会看到一条更详细的错误消息,指示连接到MySQL DB容器的问题:

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

我为排除故障所做的事情

我能够从IntelliJ本地运行API,运行MySQL容器,执行GET请求,并接收预期的响应(即,来自users表的所有记录)。

我能够通过MySQL Workbench连接到正在运行的MySQL容器。我可以从此客户端执行任何数据库操作(即INSERT / SELECT / DELETE等)。

我创建了一个Docker用户定义的网络local-network。当我使用docker run创建容器时,我将两者都添加到了该网络。当我检查网络时,我看到该网络上的两个容器。

我为每个容器使用了docker exec <container-id> bash。我能够在两个方向上成功执行ping -通过容器ID和容器名称。

通过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映像的ID

我希望能够打出http://localhost:15505/users/allhttp://172.18.0.3:15505/users/all路线,并收到200条用户表中所有记录的响应。

0 个答案:

没有答案