程序基于spring cloud框架,docker部署,docker内的程序死活连接不到docker内的MySQL。但是用Navicat可以连接。写个简单的jdbc也能连接成功。
心路历程:
1.猜想是MySQL问题:
- 连接超时问题?网上说用到durid连接池时设置超时太短,会出现连接失败情况,配置.cnf文件
connect_timeout = 43200,wait_timeout=86400 interactive_timeout=86400,bind-address = 0.0.0.0 发现均不起作用。
- 然后怀疑docker的MySQL镜像有问题?遂将程序连接字符串改为我们阿里云上的mysql地址,打包,部署程序ok
- 将程序连接字符串改为localhost不行,改为127.0.0.1不行。最后发现用本机ipv4程序正常运行
- 那MySQL没问题,会不会是docker问题,docker无法用localhost访问docker内的mysql服务。docker内每个程序都是单独隔离的!!!
2.猜想是docker配置问题。百度了一圈发现大意是docker-compose 为内部网络,没有回路,所以用localhost不行。而通过docker部署的mysql3306为容器的外部端口(即宿主主机端口),不是mysql的端口。
3.最后解决方法:
- 配置docker-compose,用-links将应用与mysql连接。注意不要用depends_on(按依赖顺序启动)。
axe-upms-admin: build: context: ./ dockerfile: ./axe-upms/axe-upms-admin/Dockerfile restart: always environment: - TZ=Asia/Shanghai ports: - 9101:9101 links: - axe-mysql:axe-mysql container_name: axe-upms-admin hostname: axe-upms-admin image: axe-upms-admin
2.改写程序连接字符串
datasource: driver-class-name: com.p6spy.engine.spy.P6SpyDriver username: 1 password: 2 # url: jdbc:p6spy:mysql://localhost:3306/axe_admin?characterEncoding=utf8&allowPublicKeyRetrieval=true&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai url: jdbc:p6spy:mysql://axe-mysql:3306/axe_admin?characterEncoding=utf8&allowPublicKeyRetrieval=true&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai type: com.zaxxer.hikari.HikariDataSource
注意将localhost改为MySQL的docker实例名axe-mysql。困扰一整天的问题搞定。