承上篇,如果直接build出原本的Java Web 專案 jar 檔,沒有調整MySQL的配置的話,使用SpringDataJPA 或 Hibernate 等 ORM框架配置的情況下,應該都會產生問題,會連線不到資料庫,導致在啟動時無法init DB相關配置,產生錯誤,無法正常啟動成功。
會產生類似這樣的錯誤訊息
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
如果你使用localhost或127.0.0.1,在啟動時對於docker來說會是尋找Java container內自己網路內的mysql連接,所以這邊會找不到,因為前幾則在構建MySQL container時,只有把它映射為本地的port 3307,並沒有特別處理這兩個container的網路(network)。
(不同的container是相互隔離的,無法連接到不同的container,除非把他們設為同一個網路中)
最簡單的方式就是去查詢本機環境的IP位址
Mac 使用:ipconfig getifaddr en0
Windows 使用:ipconfig
接下來在java的application.properties datasource.url 使用本地ip連接mysql port
(把以下橘色的部分換成你實際的內容)
spring.datasource.url=jdbc:mysql://**<ip>**:**<port>**/**<database>**?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Taipei&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=**<your_name>**
spring.datasource.password=**<password>**
只要從這邊配置即可,重新mvn install jar 檔案,再重新 build 構建 image後,執行的時候不需要再特別做其他設定處理,就可以正常連接資料庫連線,並啟動成功!
docker build -t goal-life:latest .
docker run -d -p 8081:8080 --name goal-life-8081 goal-life
通常從Docker 中構建的MySQL root權限都會是全部開放的,並且外部拜訪權限也會是’%’,表示可以由任何主機拜訪到這個資料庫,所以從docker中的java container 才能不用特別跟MySQL container在同一個網路中,就能使用本機IP連線。
而原先使用MySQL Workbench 建立的本機3306,通常都會是綁定僅限於localhost連線,可額外新增一個使用者來設定外部拜訪的權限。
測試初期為了方便才這樣配置,但在未來正式環境中,可針對權限設定指定的IP才能正常連接資料庫,取得資料。