問題
最近使用Docker容器部署Jar包的時候,資料庫一直連不上:
2021-01-08 02:59:31.354 ERROR [eate-1123226989] com.alibaba.druid.pool.DruidDataSource 2507 - create connection SQLException, url: jdbc:mysql://***/***?autoReconnect=true&useUnicode=true&allowMultiQueries=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=CTT&useAffectedRows=true, errorCode 0, state 08001
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
……
com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1572)
……
Caused by: java.net.ConnectException: Connection timed out (Connection timed out)
……
被這個問題困擾了很久,解決問題的方向一直是容器的鏡像。
直到今天,在大佬的幫助下,發現啟動容器的時候有一行
不起眼
的提示:
WARNING: IPv4 forwarding is disabled. Networking will not work
再結合前面的:
java.net.ConnectException: Connection timed out (Connection timed out)
淦!
問題出在了網絡上!
IPv4轉發已禁用。網絡将不起作用。
解決
添加IPv4轉發配置
-
或者vi /etc/sysctl.conf
vi /usr/lib/sysctl.d/00-system.conf
- 添加一行配置
net.ipv4.ip_forward=1
- 使用
重新開機 network服務systemctl restart network
-
檢視是否修改成功 ,如果傳回為sysctl net.ipv4.ip_forward
則表示修改成功net.ipv4.ip_forward = 1
- 重新開機Docker容器,問題解決
啟動容器時指定IP
還可以在啟動容器時通過
-p
參數指定IP(IP為IPv4 位址)的方式來解決,例如:
docker run -p 192.168.216.1:8080