iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
DevOps

從0開始學習DevOps,並部署CICD至Java專案中系列 第 10

配置Java Web 連接MySQL Container

  • 分享至 

  • xImage
  •  

Docker 中 執行 Java Web 產生資料庫連線異常

承上篇,如果直接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.

https://ithelp.ithome.com.tw/upload/images/20230925/201620581R2WTxoogt.png

  • 如果你使用localhost或127.0.0.1,在啟動時對於docker來說會是尋找Java container內自己網路內的mysql連接,所以這邊會找不到,因為前幾則在構建MySQL container時,只有把它映射為本地的port 3307,並沒有特別處理這兩個container的網路(network)。

    (不同的container是相互隔離的,無法連接到不同的container,除非把他們設為同一個網路中)

如何配置Docker run Java Web 的 MySQL URL 呢?

最簡單的方式就是去查詢本機環境的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

關於MySQL的使用者權限

通常從Docker 中構建的MySQL root權限都會是全部開放的,並且外部拜訪權限也會是’%’,表示可以由任何主機拜訪到這個資料庫,所以從docker中的java container 才能不用特別跟MySQL container在同一個網路中,就能使用本機IP連線。
https://ithelp.ithome.com.tw/upload/images/20230925/20162058U4E877eikV.png

而原先使用MySQL Workbench 建立的本機3306,通常都會是綁定僅限於localhost連線,可額外新增一個使用者來設定外部拜訪的權限。

測試初期為了方便才這樣配置,但在未來正式環境中,可針對權限設定指定的IP才能正常連接資料庫,取得資料。


上一篇
專案中建立Dockerfile並執行
下一篇
Docker 的 network 是什麼呢?
系列文
從0開始學習DevOps,並部署CICD至Java專案中30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言