maven build和push image中遇到的坑(學習過程記錄)


最近在做jenkins的持續集成構建,其中一項是要實現docker容器化部署。項目本身是maven項目,我對於maven和docker都沒有什么認知基礎,於是求助百度和官網,從頭開始啃起。遇到了不少的坑,所幸沒有放棄,一點一點地填上來了,在這里把學習過程簡單記錄一下。

什么是maven?

看了不少的解釋,大同小異,但如果你沒接觸,只會覺得抽象和不可理喻。還是把官網的解釋翻譯過來,畢竟這是最權威的。Maven,是一個猶太語詞匯,意思是知識的積累,最初在Jakata Turbine項目中用來簡化構建過程。當時有一些項目(有各自Ant build文件),僅有細微的差別,而JAR文件都由CVS來維護。於是希望有一種標准化的方式構建項目,一個清晰的方式定義項目的組成,一個容易的方式發布項目的信息,以及一種簡單的方式在多個項目中共享JARs。由此產生了一個現在可以被用於構建和管理任何基於java的工程的工具。

簡單地說,Maven是一個工具,用來管理java工程中眾多的依賴jar包,由此簡化java工程的構建和發布。在maven中最重要的就是pom.xml文件,全稱是項目對象模型(Project Object Model),它用來描述具體的項目。maven的生命周期在運行mvn install的時候被調用,然后maven執行一系列有序的步驟,運行許多默認的插件目標,這些目標完成了像編譯和創建一個jar文件這樣的工作。

由此看來,maven並不神秘和復雜,常用的命令也就那么幾個。很多時候maven項目和docker結合在一起使用,一起作為容器發布。

什么是docker?

docker可以說是現今IT行業最熱門的概念了。各行各業都在以容器化部署為目標,它使用方便、高效、輕巧又可靠。引用百度百科的定義:Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。

我用到的docker常用命令有以下:

查看已有的docker鏡像

這個非常好用,可以確認鏡像是否生成成功。

刪除鏡像

docker rmi image_name

使用dockerfile打包鏡像

docker build --no-cache -t image_repository:imageTag .

no-cache表示創建鏡像的過程中不使用緩存,-t表示鏡像的名稱和標簽,注意最后的.一定要有,否則會報錯

push鏡像

#把制作好的docker鏡像推送至指定harbor倉庫
docker push image_repository:dockerTag

docker登錄

docker login -u harbor_username --password harbor_pwd harbor_ip

重啟docker守護進程

systemctl daemon-reload

重啟docker服務

systemctl restart docker

需要注意的是,在每次docker配置信息變更時,都需要刷新,也就是重啟docker守護進程或docker服務。

知識點梳理完畢,說一下這次打包過程中遇到的坑:

1.使用mvn build和mvn push鏡像和docker 的build和push有什么區別?

兩種方法我都試了一下,對比感受是沒有區別,mvn命令打包和push貌似也是調用了docker的打包和push,當然前提是你要安裝maven的docker插件,否則會報錯,類似這樣

這種情況下,可以直接用docker的build和push命令,同樣可以產生鏡像並推送到倉庫成功。

2.在push鏡像時,報錯提示443端口號connection refused

網上百度了很久,解決方案基本上沒有能用的,有說服務端沒有監聽端口,導致連接被拒絕,用netstat -an |grep 443查詢后,結果發現並不是,也有說這個監聽端口被其他的ip占用,如127.0.0.1,結果發現也並不是。最后還是只能去看官網https://docs.docker.com/config/daemon/systemd/,這里提到了docker守護進程的配置,主要的推薦方法是使用/etc/docker/路徑下的daemon.json文件去配置,打開這個文件,發現這里面有一項insecure-registries,網上查了一下,dockerfile上傳鏡像必須通過https的方式,因此這里需要把要上傳的倉庫地址寫到這一項里面。

設置完了之后需要重啟docker服務生效。

3.在push鏡像時,報錯提示unauthorized: authentication required

同樣的是在官網中提示了,這是由於未添加https代理的環境變量,按照官網的方法,創建這個文件

sudo mkdir -p /etc/systemd/system/docker.service.d

然后添加https代理的配置文件

touch /etc/systemd/system/docker.service.d/https-proxy.conf

增加以下環境信息

[Service]
Environment="HTTPS_PROXY=https://proxy.example.com:443/"

最后重啟docker守護進程和docker服務

$ sudo systemctl daemon-reload

$ sudo systemctl restart docker

搞定!終於迎來了期盼中的畫面

這次的經歷很寶貴,從無知到了解,需要的只是不懈的努力而已。在軟件測試的300條忠告中(具體名字不記得了,很好的一本書),提到對於一個很復雜的概念,不要被嚇到,一點點地熟悉它,等你慢慢熟悉后,你會有新的思路,新的認識,新的理解。這是一個不斷靠近的過程,就像敏捷,誰也沒有上帝視角,我們只能做一個不斷提升自己認知的普通人。

 


免責聲明!

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



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