我正在运行2个容器。第一个是Java Spring-Boot REST API /服务。第二个是MySQL数据库。我正在尝试从运行中的API容器向运行中的MySQL容器执行一个简单的GET请求,该请求应返回MySQL db容器中的表中的所有记录。
当两个容器都在运行时,我尝试通过浏览器或邮递员向http://localhost:15505/users/all
或http://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/all
或http://172.18.0.3:15505/users/all
路线,并收到200条用户表中所有记录的响应。