情景简述

docker容器之间可以通过link参数互连。容器也可以将内部端口映射到宿主机上。假设,宿主机ip为192.168.10.1,将一个Spring Boot应用将端口映射到宿主机8080:58080;该应用对应的MySQL数据库容器端口映射到宿主机3306:13306

问题描述

基于上述情景,将SpringBoot应用配置文件中jdbc连接的url改为jdbc:mysql://192.168.10.1:13306xxxx。这样的修改实际看起来可行,然而实际却会出现
no route to host的错误。

问题重现

(1)启动一个MySQL容器
$ docker run -d -p 3306:13306 -e MYSQL_ROOT_PASSWORD=123456 --name=sql mysql
此时使用第三方软件连接MySQL数据库是成功的,说明端口映射是成功的。
(2)启动一个SpringBoot应用镜像生成的容器(application.yml中数据库链接为jdbc:mysql://192.168.10.1:13306xxxx)
$ docker run -d -p 8080:58080 -e db=192.168.10.1:13306 --name=app app:1.0
此时我们会发现应用无法启动,查看日志出现java.net.NoRouteToHostExeeption: No route to host

解决方法

(1)修改Spring Boot应用的启动命令:
docker run -d -p 8080:58080 -e db=tomysql:3306 --link sql:tomysql --name=app app:1.0
此时spring boot应用正常连接数据库,启动成功。
(2)解决方式2
修改docker的配置⽂件,新增配置--userland-proxy=true,如
OPTIONS='--userland-proxy=true

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐