公司技術同事在討論搭建一個Docker鏡像自動構建系統,該怎麼做?

急速馬力快de源碼客


一個非常好的問題。我是工作多年的Web應用架構師,來回答一下這個問題。歡迎關注我,瞭解更多IT專業知識。


Docker是一個開源的應用容器引擎,將應用以及依賴打包到一個可移植的鏡像中,部署到服務器並運行在Container容器實例中。


構建Docker鏡像時,在實際使用中有一些誤區:

1,Docker鏡像由工程師在本地構建,然後推送到Docker hub或者其他鏡像倉庫。

2,程序編譯打包使用Jenkins自動構建,得到運行包後上傳到代碼庫中,手動或者自動構建Docker鏡像。

3,。。。


Docker鏡像應該通過自動構建系統,從源代碼開始,編譯打包,構建鏡像,不應該手動上傳下載運行包,也不應該使用預先編譯好的運行包。


阿里雲容器鏡像服務提供Docker鏡像倉庫託管,配置項目代碼Git倉庫和構建規則,輕鬆實現自動化。進一步結合Dockerfile強大功能實現雲端編譯打包。


操作演示:https://www.ixigua.com/i6802181124291461639/

詳細配置步驟:https://www.toutiao.com/i6802179342320271879/


急速馬力快de源碼客


關於Docker裡面的幾個主要概念

這裡用個不太恰當的比方來說明。

大家肯定安裝過ghost系統,鏡像就像是ghost文件,容器就像是ghost系統。你可以拿別人的ghost文件安裝系統(使用鏡像運行容器),也可以把自己現有的系統製作成ghost文件(從容器構建鏡像)。Dockerfile則像是一個生成ghost文件的腳本(鏡像構建腳本),這個腳本會指定去哪裡下載哪個版本的window系統,再去哪裡下載哪些軟件並安裝,再修改哪些配置文件,等等。本文主要講的是,如何從容器構建鏡像(把現有系統製作成ghost文件),和如何使用Dockerfile構建鏡像(使用腳本生成ghost文件)。

兩種方式構建鏡像的主要步驟:

從容器構建鏡像(以下簡稱容器鏡像)

創建一個容器,比如使用 tomcat:latest 鏡像創建一個tomcat-test容器

修改tomcat-test容器的文件系統,比如修改tomcat的server.xml文件中的默認端口

使用commit命令提交鏡像

使用Dockerfile構建鏡像(以下簡稱Dockerfile鏡像)

編寫Dockerfile文件

使用build命令構建鏡像

兩種構建方式的區別:

容器鏡像的構建者可以任意修改容器的文件系統後進行發佈,這種修改對於鏡像使用者來說是不透明的,鏡像構建者一般也不會將對容器文件系統的每一步修改,記錄進文檔中,供鏡像使用者參考。

容器鏡像不能(更準確地說是不建議)通過修改,生成新的容器鏡像。

從鏡像運行容器,實際上是在鏡像頂部上加了一層可寫層,所有對容器文件系統的修改,都在這一層中進行,不影響已經存在的層。比如在容器中刪除一個1G的文件,從用戶的角度看,容器中該文件已經沒有了,但從文件系統的角度看,文件其實還在,只不過在頂層中標記該文件已被刪除,當然這個標記為已刪除的文件還會佔用鏡像空間。從容器構建鏡像,實際上是把容器的頂層固化到鏡像中。

也就是說, 對容器鏡像進行修改後,生成新的容器鏡像,會多一層,而且鏡像的體積只會增大,不會減小。長此以往,鏡像將變得越來越臃腫。Docker提供的 export 和 import 命令可以一定程度上處理該問題,但也並不是沒有缺點。

容器鏡像依賴的父鏡像變化時,容器鏡像必須進行重新構建。如果沒有編寫自動化構建腳本,而是手工構建的,那麼又要重新修改容器的文件系統,再進行構建,這些重複勞動其實是沒有價值的。

Dockerfile鏡像是完全透明的,所有用於構建鏡像的指令都可以通過Dockerfile看到。甚至你還可以遞歸找到本鏡像的任何父鏡像的構建指令。也就是說,你可以完全瞭解一個鏡像是如何從零開始,通過一條條指令構建出來的。

Dockerfile鏡像需要修改時,可以通過修改Dockerfile中的指令,再重新構建生成,沒有任何問題。

Dockerfile可以在GitHub等源碼管理網站上進行託管,DockerHub自動關聯源碼進行構建。當你的Dockerfile變動,或者依賴的父鏡像變動,都會觸發鏡像的自動構建,非常方便。

** 不管是官方還是我個人,都推薦使用第二種方式構建鏡像。**

關於Dockerfile裡面指令的詳細說明,這裡就不一一列出了,大家可以參考官方文檔,當然網上也是一搜一大堆。




通信人的自我修養


兩種方式構建鏡像,一種是使用Dockerfile構建鏡像,通過編寫dockerfile文件,使用build命令來構建。

另一種是直接從容器構建鏡像,首先創建一個容器,比如使用tomcat:latest鏡像創建一個tomcat-test容器,然後通過修改容器的文件系統,使用commit提交鏡像。

dockerfile鏡像是完全透明的,所有構建的指令都能看到,只需要改dockerfile裡面的指令就能修改鏡像,再重新構建生成就行。重點是可以託管在GitHub上,dockerhub自動關聯源碼進行構建,dockerfile或者父鏡像發生變化時,都會觸發鏡像的自動構建。推薦使用這個。

從容器構建的話,都是要自己手動修改容器的文件系統再發布,操作者不會把每一步記錄,都記錄下來,要不然太麻煩了。總之相當於全程手動配置,平常自己搭建測試測試無所謂,真正項目的時候還是算了吧。就相當於別人寫個腳本,服務器自動運行,然後就可以休息了。而你使用容器鏡像,全程手動,只能看著別人休息,服務器鏡像還會越來越臃腫。


果蔬烘乾機


docker官方提供這個功能,關聯github賬號裡的項repository,選擇好branch,只要有提交就可以自動build


龍天63730502


shell 腳本大法好,加上linux的定時任務系統,把腳本寫好,也可以用一些隊列系統,比如python的celery,再寫個web界面看數據


校園微距離


像 gitlab ,自帶這種功能,還有很多類似的CI,CD系統,都帶這種功能


阿爾法軟件測評


多試試,多實踐,有問題了查就OK


分享到:


相關文章: