Docker最全教程——從理論到實戰(七)

雪雁發表於2018-12-19

在本系列教程中,筆者希望將必要的知識點圍繞理論、流程(工作流程)、方法、實踐來進行講解,而不是單純的為講解知識點而進行講解。也就是說,筆者希望能夠讓大家將理論、知識、思想和指導應用到工作的實際場景和實踐之中,而不是拿著字典寫文章,抱著寶典寫程式碼。至於很多具體的語法、技術細節,除了常用的知識點,筆者更希望大家閱讀官方文件——畢竟看官網比看書靠譜多了,官網會一直更新和改進,而書和教程自出版或釋出之後,基本上就“死“了。

本系列教程預計全部完成還需要2到3個月的時間。在這個過程中,您可以和我們一起討論、交流和分享這一塊的技術。我們也希望得到大家的支援,請多多點贊,你們的支援是我們前進的最大動力!

 

Docker和持續整合(CI)

 什麼是持續整合?

我們先得了解持續整合的相關概念,才能更好地指導開發和使用Docker來改進我們的工作流。和其他教程不一樣,筆者更喜歡將必要的知識點圍繞理論、流程(工作流程)、方法、實踐來進行講解,而不是單純的為講解知識點而進行講解。也就是說,筆者希望為大家打通任督二脈,能夠將理論、知識、思想和指導應用到工作的實際場景和實踐之中,而不是拿著字典寫文章,抱著寶典寫程式碼。至於很多具體的語法、技術細節,除了常用的知識點,筆者更希望大家閱讀官方文件——畢竟看官網比看書靠譜多了,官網會一直更新和改進,而書和教程自出版或釋出之後,基本上就“死“了。

好了,我們回到正題。持續整合是一種軟體開發實踐,即團隊開發成員經常整合他們的工作,通常每個成員每天至少整合一次,也就意味著每天可能會發生多次整合。每次整合都通過自動化的構建(包括編譯,釋出,自動化測試)來驗證,從而儘早地發現整合錯誤。

 

徒弟一臉崇拜道:“師父,為什麼我做出來的飛劍,一念咒語不是碎了就是爆了呢?”。

師父摸了摸鬍子道:“徒兒莫急,冰凍三尺非一日之寒!為師我刻了3年的陣法,練習了3年的咒語,然後又花了3年一起練習,才讓第一把飛劍飛上了太空。我看你天資聰慧,頂多20年就夠了”。

2年後,徒弟邊刻陣法邊唸咒,突然飛劍的劍身嗖的一下不見了,只餘劍柄。

師父:“徒兒,你的飛劍怎麼飛了一截出去了!”

徒弟握著劍柄行禮道:“師父勿怪,這段時間我對飛劍的製作過程進行了改良,一邊刻陣法一邊唸咒,現在我對陣法和咒語的掌控都達到了70%,所以只有前半截飛出去了!“

 

注意:整合軟體的過程不是新問題,如果專案開發的規模比較小,比如一個人的專案,如果它對外部系統的依賴很小,那麼軟體整合不是問題,但是隨著軟體專案複雜度的增加(即使增加一個人),就會對整合和確保軟體元件能夠在一起工作提出了更多的要求-要早整合,常整合。早整合,頻繁的整合幫助專案在早期發現專案風險和質量問題,如果到後期才發現這些問題,解決問題代價很大,很有可能導致專案延期或者專案失敗。

 

核心價值

 

要素

1.統一的程式碼庫

2.自動構建

3.自動測試

4.每個人每天都要向程式碼庫主幹提交程式碼

5.每次程式碼遞交後都會在持續整合伺服器上觸發一次構建

6.保證快速構建

7.模擬生產環境的自動測試

8.每個人都可以很容易的獲取最新可執行的應用程式

9.每個人都清楚正在發生的狀況

10.自動化的部署

 

原則

1. 所有的開發人員需要在本地機器上做本地構建,然後再提交的版本控制庫中,從而確保他們的變更不會導致持續整合失敗。

2. 開發人員每天至少向版本控制庫中提交一次程式碼。

3. 開發人員每天至少需要從版本控制庫中更新一次程式碼到本地機器。

4. 需要有專門的整合伺服器來執行整合構建,每天要執行多次構建。

5. 每次構建都要100%通過。

6. 每次構建都可以生成可釋出的產品。

7. 修復失敗的構建是優先順序最高的事情。

8. 測試是未來,未來是測試

 

持續整合我們就先說到這裡,建議大家也可以瞭解下敏捷開發,畢竟持續整合是敏捷開發的基石,但是敏捷開發是一個大命題,這裡我們順帶提一下,然後我們還是先繼續本篇教程:

師父:“徒兒,你真的在短短3年就讓飛劍飛起來了?”。

徒弟:“弟子愚鈍,在刻劍的過程中倍覺無聊,又不喜歡哼歌,於是索性邊練咒邊刻劍。後面徒兒發現,如果刻錯了或者唸錯了,飛劍就會提前直接爆炸,雖然每次炸的內褲都沒了,但是能夠儘早發現錯誤。所以徒弟才能一日千里”。

師父摸了摸鬍鬚道:“然來如此!不過,這就是你大庭廣眾之下裸奔的藉口!!?”

 

Docker和持續整合(CI)

 

相比其他技術,Docker在持續整合(CI)這塊有著先天的優勢。在通常的情況下,我們要實現持續整合往往會遇到以下問題:

複雜的依賴關係

不同的專案環境,不同的語言,不同的程式包依賴,甚至是作業系統的依賴等等,都會影響到我們持續整合的自動化指令碼的執行。而且依賴包之間的相容性,版本的相容性,間接依賴或者多重依賴等問題等等,對於開發和運維來說,都是一個噩夢。就如以下對話:

徒弟:“師父,我按照您教的方式唸咒,為什麼飛劍飛起來了之後就收不回來了?”。

師父直接一巴掌,說:“兔崽子,上次就和你說了,咒語現在最低的相容級別是——普通話二級乙等!誰教你說長沙話的!”

 

不一致的環境

在通常的環境中,我們需要準備好開發、測試和生產環境,往往開發環境隨便開發人員折騰,有時候作業系統或者依賴軟體的版本的區別、元件的不同、配置不一樣,都足夠讓開發環境正常執行的程式在測試環境上跑不起來,造成測試人員和開發人員的故意傷害事件,導致“行凶人員”後悔終生,感悟到“衝動就是魔鬼”的箴言。我們還是以對話來闡述這個問題:

徒弟拿出普通話二級乙等證書道:“師父,我苦學普通話,終於達到普通話二級乙等。然後按照您教的方式唸咒了,之後為什麼飛劍飛起來了之後還是沒法收回來?”。

師父又是一巴掌,說:“兔崽子,你沒看到下雨了麼?”

徒弟弱弱的問:“這個和下雨有關係麼?是不是雨天法術受雨滴乾擾,咒語的效果受到影響呢?”

師父指著外面道:“瞎了?你丫的不趕緊把被子收回來烘乾,你的飛劍就甭想要了!”

 

應用架構的複雜性和配置的多樣性

現在的系統架構越來越複雜,甚至由多種開發語言組成,而且包含前後端等多方面內容。這些可能會導致其部署方式的不同以及配置的複雜性。並且一個系統維護到後面,往往有很多歷史遺留問題,比如那各種配置檔案和配置方式,各種補丁,各種指令碼等等。這些因素會導致自動化流程會非常麻煩和艱難。我們繼續來一段對話:

 

徒弟:“師父,被子收好了,但是飛劍越飛越遠了,是不是可以教我收回我的飛劍啦!”。

師父張開一隻眼:“小崽子,普通話念完後,用長沙話再念一遍收劍咒!前幾天,為師對收劍咒又進行了改造。”

徒弟用長沙話念完,飛劍還是再天空中亂竄,並沒有降下來的意思。徒弟趕緊問道:“師父,為啥還是不行呢?”

師父彈了彈手指,遠處一根若隱若現的細線展現出來,師父指著那根線說:“看到那邊那根線沒?還不趕緊去追!”

 

相比這些問題,Docker實現持續整合(CI)就方便多了。

首先,Docker可以讓我們非常容易和方便地以“容器化”的方式去部署應用。它就像集裝箱一樣,打包了所有依賴,再在其他伺服器上部署很容易,不至於換伺服器後發現各種配置檔案散落一地,這樣就解決了編譯時依賴和執行時依賴的問題。

其次,Docker的隔離性使得應用在執行時就像處於沙箱中,每個應用都認為自己是在系統中唯一執行的程式,這樣就可以很方便地在一個系統中部署多種不同環境來解決依賴複雜度的問題。

正因為Docker是以應用為中心,映象中打包了應用及應用所需的環境,一次構建,處處執行。這種特性完美解決了傳統模式下應用遷移後面臨的環境不一致問題。

因此使用Docker實現持續整合,我們可以使用一些簡單的免費的工具即可實現,也可以非常方便的自己搭建整合環境或者編寫指令碼實現。比如Azure DevOps、Tencent Hub、Jenkins和TeamCity,接下來我們會逐步進行介紹。

持續整合工作流程

一般情況下,持續整合的流程如下所示:

下面是一個參考流程:

程式碼版本管理,我們推薦使用Git。關於git版本庫的使用,我這裡就不囉嗦了,如果有朋友感興趣,我也可以分享一些內容。

後續,我們將會分享使用相關工具來實施我們的CI流程。

 

往期內容連結

 
我的部落格即將同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=1uzymsc0hstza

相關文章