1. 程式人生 > 程式設計 >寫給後端的Docker初級入門教程:基礎篇

寫給後端的Docker初級入門教程:基礎篇

前言:

之前很早就對Docker有所耳聞,但是礙於時間(就是懶得學)的關係,就一直沒有開始行動,直到最近這個學期課比較少,實在不知道該幹啥了,算了,學習吧。所以就開始了我漫長Docker學習之旅。當然,寫這篇筆記的時候,我對Docker已經大概有了一個初步的瞭解,所以就有了這個面向初學者的Docker學習筆記系列,為什麼是初學者呢,因為我自認為我對Docker的瞭解依然處在一個比較初級的階段,更高階的內容怕說不明白,以至於誤導了別人,寫這系列的筆記主要初衷有兩個,一來是為了對自己這個階段所學的知識做一個全面的梳理和總結,二來順便將這些知識用我風騷的寫法做成筆記,幫助後面學習Docker的小夥伴更加通俗易懂的去理解Docker相關的知識和概念,本篇文章作為基礎篇第一篇,將圍繞下面這三個問題來展開:

  1. 什麼是Docker?
  2. 為什麼是Docker?
  3. Docker 具體解決了什麼樣的問題?

什麼是docker?

Docker是基於Go語言實現的在2013年釋出的雲開源專案,它利用了圍繞容器這個現有的計算概念,特別是在Linux世界中,這些原始概念被稱為cgroups和名稱空間。Docker的技術之所以獨特是因為它專注於開發人員和系統操作員的需求,以將應用程式依賴項與基礎架構分開。

Docker的主要目標是“Build,Ship and Run Any App,Anywhere”,也就是通過對應用元件的封裝、分發、部署、執行等生命週期的管理,使使用者的APP(可以是一個WEB應用或資料庫應用等等)及其執行環境能夠做到“一次封裝,到處執行”。

一句話概括,Docker的出現解決了執行環境和配置環境不一致的情況,從而更方便的做持續整合並有助於應用的整體釋出。

為什麼是Docker?

要了解這個問題,我們就需要了解在Docker之前的傳統的虛擬機器器技術是怎樣的,我相信大家都有使用過虛擬機器器軟體在自己電腦上虛擬出另外一個作業系統的經歷,比如在win上通過vm安裝一個linux系統,傳統的虛擬機器器其實是一種帶環境安裝的解決方案,也就是說,我模擬的是一套完整的作業系統環境,這個系統依然是有它獨立的核心,驅動等等。

如圖所示:

對於虛擬機器器中執行的程式而言,由於虛擬機器器模擬了一整套系統的環境,那麼在虛擬機器器中執行的應用程式是感知不到自己是在虛擬機器器中執行的,就像和在真實的作業系統中執行一樣。

當然,看到這,很多人可能會覺得,這不是挺好的嗎,的確,在需求不是很大,比如只需要額外開兩三臺虛擬機器器的情況下,這種做法並沒有什麼明顯的短板,但是,由於我們模擬的是一整套作業系統的環境,這就導致了什麼問題呢,我們每開一個虛擬機器器都會額外佔用很大一部分資源,儘管你可能兩臺虛擬機器器中的linux系統核心是一模一樣的,這就造成了對資源的一個很大的浪費,同時呢,由於我們啟動虛擬機器器的時候啟動的是一整套作業系統,這就會導致啟動變得非常的慢,可能需要幾分鐘,當然,幾分鐘並不是很長,可是如果有很多臺虛擬機器器呢?可能當運維工程師好不容易把所有虛擬機器器啟動完成了,發現秒殺活動已經結束了,如此長的啟動時間對於很多大規模的應用來說是不能忍的,第三點,就是步驟非常繁瑣,我們現在總結一下傳統虛擬機器器最主要的三個缺點:

  • 資源佔用比較多
  • 啟動比較慢
  • 步驟繁瑣

當然,時代再進步,linux也不能看著這些問題放任不管啊,於是linux發展出了另外一項虛擬化技術,即linux容器技術。

linux容器技術是怎麼一回事呢,這點和我們在實際開發中抽取公共邏輯的思路是類似的,之前不是開很多虛擬機器器核心什麼的都一樣造成資源浪費嗎,那我這下把核心單獨抽離出來,大家公用,所以linux容器實際上執行的並不是一個完整的作業系統,而是通過程式對不同的容器進行了隔離,容器與虛擬機器器不同,不需要捆綁一整套作業系統,只需要軟體工作所需的庫資源和設定。系統因此而變得高效輕量並保證部署在任何環境中的軟體都能始終如一地執行。

如同所示:

由於啟動的時候,啟動的並不是整套作業系統環境,僅僅是啟動應用所需的環境就行了,啟動速度自然就比傳統的虛擬機器器快了很多,甚至說可以做到秒啟動,同時又解決了資源浪費的問題,而Docker正是基於linux容器技術而衍生出來的開源專案,使其對於廣大開發者來說更容易上手,降低了使用的門檻。

Docker 具體解決了什麼樣的問題?

這個就要從很久很久以前說起了。

故事發生在9012年全球最偉大的網際網路公司阿里奶奶次世代產品免費版某寶的上線前夕,程式設計師阿呆把自己多日以來嘔心瀝血呼呼大睡上班摸魚下班蹦迪寫的程式程式碼交付給了運維二呆,本以為自己將程式碼給了二呆就可以滿面春光如釋重負邁著六親不認的步伐深夜買醉癱倒在燈紅酒綠紙醉金迷的酒吧,但是正當阿呆準備開始這嶄新的生活的時候,二呆攔住了他:

阿呆,你這程式碼有問題吧,我怎麼跑不起來?

阿呆:WTF ?我沒聽錯吧,你竟然說我的程式碼有問題,呵呵,某人運維技術不行,還好意思說我菜?

二呆:我運維技術不行,我運維技術不行,你行你上啊,開玩笑,你程式碼寫的沒問題我能跑不起來?

阿呆:你睜大你的24k鈦合金x眼看看,我電腦上是不是跑的好好的,是你運維技術不行,ok?

二呆:我&%¥%&,你程式碼沒問題是吧,你程式碼沒問題是吧,你來啊,有本事你跑起來,你要能跑起來我直播女裝,臭弟弟。

阿呆:我今天就讓你看看,我是怎麼把它完美的部署上去的,你給我好好看著,知道嗎?!

此時,阿呆的女朋友打來電話:阿呆,不是說好了一起去醉生夢死的嗎?

阿呆:滾,現在沒空搭理你。

注:以上皆為節目效果,大家請勿當真。

傳統的開發中總是會很容易出現這類開發環境和生產環境不一致的問題,而Docker的出現毫無疑問極大地簡化了運維工程師的工作量,也大大降低了開發和運維之間撕逼的概率。大家這麼來理解:

我們以搬家為例,傳統的流程就可以看作是把所有傢俱一件一件地搬到新的地方,萬一哪個傢俱的擺放位置沒記清楚,就有可能導致新家執行不起來(??什麼鬼),比如mysql版本沒說清楚,而Docker就很簡單粗暴,Docker採取的方式就是把整套環境打包給你,也就是直接把整個樓都給你搬過去,問題完美解決

同時呢,Docker是核心級虛擬化,不像傳統的虛擬化技術一樣需要額外的Hypervisor支援,所以在一臺物理機上可以執行很多個容器例項,可大大提升物理伺服器的CPU和記憶體的利用率。

總結起來,docker大概就是以下四個優點:

  • 更快的應用交付和部署
  • 更便捷的升級和擴縮容
  • 更簡單的系統運維
  • 更高效的計算資源利用

不得不說,實在是太香了。

總結:

本篇筆記簡單地講了一下docker的一個基本情況,相信看到這裡的小夥伴已經對docker有了一個基本的認識,至少知道docker是什麼了,下一篇筆記呢,將圍繞 Docker 三要素 映象 容器 和倉庫這三個概念展開,預知後事如何,點個贊再走吧。

我是韓數,我們下一篇筆記《Docker三要素:映象,容器和倉庫》再見。

PS:更多筆記歡迎大家去我的github上下載(歡迎star):

github.com/hanshuaikan…