從零開始部署發布Java項目到服務器的Docker中


本以為很簡單,由於沒用過docker和java,本文將會闡述一路遇到的攔路虎。

 首先,寫好Java項目,本地跑通。

 

可能會遇到的問題:

1.jar包正常運行,war包404:

如何打包很多教程都有介紹,本文不重復贅述。

如果jar包正常,war包404,大概率是由於打包錯誤導致的(假如你不使用xml文件。需要在啟動程序中添加extends spriingbootservletInitializer,並繼承。

 

2.tomcat404

tomcat404除了上面的問題,那就是路徑的問題。

war包放在waeapps中后會自動生成文件夾,如果war包名為root就可以在localhost:8080/根路徑直接訪問。否則就需要在localhost:8080/war包名/下訪問程序。

 

3.tomcat404

tomcat版本問題,如果是jdk1.8就建議tomcat8以上版本

 

4.還是404,自己程序Idea可以運行,但是放在tomcat報錯

可能是tomcat版本問題,如果tomcat版本比較低,只要數據庫連接有問題,直接所有頁面無法訪問,然而新的版本tomcat,不連數據庫的連接可以正常訪問,連數據庫的頁面會報Whitelabel Error Page

因此建議jdk8用tomcat8.5

 

5.依然是404

打包問題,確保pom文件中,build包含你你所需的文件。例如如果你是theamleaf編寫前端,必須要包含相關的teaamleaf文件。自然配置文件也必須包含在包里。可以通過解壓縮觀察包文件結構來判斷是否為打包問題。

 

6.本地tomcat正常,但是docker無法訪問8080端口

如果自己本地不是linux,docker run -p 無法完成映射,需要指定端口號映射,例如-p 8080:8080

例如我的:

docker  build  -t  demo-image:v1  .

docker run -d -p 8080:8080 demo-image:v1

 

7.docker可以訪問,但是數據庫無法訪問

mysql不可對外開放。在mysql狀態下運行如下:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密碼' WITH GRANT OPTION;

flush privileges;

 

8.宿主機器的數據庫無法訪問

宿主機器在docker中無法通過localhost這類方式訪問。

如果不是linux電腦,docker0也不存在。

可以使用host.docker.internal訪問

本人mac,用docker.for.mac.host.internal也可以訪問。

host.docker.internal如下:

url: jdbc:mysql://host.docker.internal:3306/javaDemo?allowPublicKeyRetrieval=true

9.Public Key Retrieval is not allowed錯誤解決方法

見問題7,?后增加allowPublicKeyRetrieval=true即可

 

10.docker無法push,報錯denied: requested access to the resource is denied

docker頁面中創建倉庫

docker tag demo-image:v1  賬號/test-image:v1

docker push  賬號/tdemo-image:v1

我是在docker頁面中創建倉庫,然后執行相關指令,然后給自己本地鏡像改名,解決此報錯信息。

 

11.linux中docker 無法訪問本地數據庫

可能是我服務器centos無法host.docker.internal這種dns地址,所以使用ifconfig,找docker0的ip地址。

吧連接改為docker地址對於的ip。重新發布一下程序。

 

 

如何檢索問題:

1.報錯404

如果404,檢查路徑,是否能夠正確對應上;檢查打的包有沒有問題。檢查webapps里文件是否存在。

如果在docker中

docker exec -it 容器名 /bin/bash

可以進入容器目錄的tomcat文件夾。容器名可以通過docker ps來查看

進入webapps文件夾查看自己的路徑是否有文件。

 

2.如何確定打包問題

除了問題1外,打包問題都是缺少文件,直接解壓縮war包,確定你所需要的文件都在war包中。尤其是配置文件,以及靜態文件。

 

3.如何確定docker網絡問題

可以通過docker exec -it 容器名 sh進入容器。

然后通過ping ip,比如你數據庫連接

url: jdbc:mysql://host.docker.internal:3306/javaDemo?allowPublicKeyRetrieval=true

可以在docker內部ping  host.docker.internal

判斷docker是否正常連接相應ip,

如果 ip可以連,還需要確定是否能連接數據庫。可以在其他任何計算機上

mysql -h IP -u test -P

來判斷服務器數據庫是否可以連接。

 

 

最后附上本人的dockerfile:

from tomcat:8.5
copy test.war /usr/local/tomcat/webapps/
expose 8080

其中,war包名字叫做test.war.

然后就可以使用IP:8080/test/來訪問了。

如果名字是Root.war,就可以通過IP:8080/來訪問。



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM