本以為很簡單,由於沒用過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/來訪問。
