2017-06-27 99 views
1

我有一個在Dockers容器中運行的Spring Boot應用程序。該應用程序提供REST端點,可以使用http://localhost:8080/endpoint從主機成功調用該端點。以前,當此應用程序在主機上運行而不在Dockers中時,我可以使用jdbc:mariadb:// localhost:3308/fi?user = userName & password =來自應用程序內的密碼來調用本地MariaDB。現在應用程序在Dockers中運行,連接返回錯誤:「無法連接到地址=(host = localhost)(port = 3308)(type = master):連接被拒絕(連接被拒絕)」在Docker容器中訪問主機上的MySQL數據庫

代碼段進行連接如下:

Connection connection = DriverManager.getConnection("jdbc:mariadb://localhost:3308/fi?user=username&password=thePassword"); 
     Statement stmt = connection.createStatement(); 
     String query = ""; 
     ResultSet rs = stmt.executeQuery("SELECT * ....;"); 

我已經有公佈,接受REST從主機調用的8080端口,並試圖發佈或揭露3308端口,允許數據庫調用在沒有幫助的情況下製作。

預先感謝您!

+0

我建議你在另一個容器中運行你的數據庫 - 它建議從碼頭的方式。 – giaco

+0

除了創建其他容器並重新設置數據庫以外,是否還有其他特殊更改需要進行以允許一個泊塢窗中的應用程序在另一個泊塢窗中調用數據庫? – dFrancisco

回答

1

與docker一起使用數據庫的建議方法是在單獨的容器中運行它。 Docker容器在同一個(docker)網絡中,所以你只需要link他們。 Here你有MariaDB的形象和指導如何使用它。你可以將你現有的數據庫轉儲到你的映像中(這樣你就不需要再把它全部做完)。

要做到這一點,你必須:

  1. 創建新的數據庫圖像(在它轉儲數據庫)
  2. 運行數據庫容器(!集名)
  3. 與鏈接運行您的REST容器做數據庫容器
+0

鏈接模式是舊模式。相反,建議使用網絡服務發現。基本上,只要你的容器都連接到同一個'docker network create'類型的網絡,它們將能夠通過它們的'--name'來解析對方。 – programmerq

+1

你是對的 - 我從我的記憶中寫下來,我總是用--link :) – giaco

1

如果您只是爲了開發而開發,您可以鏈接容器或更好地使用docker-compose。但要小心:容器中的數據庫不適合生產!

從您可以ip route show

# ip route show 
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2 

檢索泊塢窗主機IP容器然後默認路由是你的主機IP(這裏172.17.0.1)

在這一點上,要注意主機的可以阻止連接的防火牆

在您的入口點腳本中,您可以使用ip route show | awk '/default/ {print $3}'檢索主機IP。然後,您可以通過環境變量傳遞此IP並在應用程序中檢索它。

相關問題