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

前言:

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

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

什麼是docker?

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

Docker的主要目標是「Build,Ship and Run Any App,Anywhere」,也就是經過對應用組件的封裝、分發、部署、運行等生命週期的管理,使用戶的APP(能夠是一個WEB應用或數據庫應用等等)及其運行環境可以作到「一次封裝,處處運行」。git

一句話歸納,Docker的出現解決了運行環境和配置環境不一致的狀況,從而更方便的作持續集成並有助於應用的總體發佈。程序員

爲何是Docker?

要了解這個問題,咱們就須要瞭解在Docker以前的傳統的虛擬機技術是怎樣的,我相信你們都有使用過虛擬機軟件在本身電腦上虛擬出另一個操做系統的經歷,好比在win上經過vm安裝一個linux系統,傳統的虛擬機實際上是一種帶環境安裝的解決方案,也就是說,我模擬的是一套完整的操做系統環境,這個系統依然是有它獨立的內核,驅動等等。github

如圖所示:sql

對於虛擬機中運行的程序而言,因爲虛擬機模擬了一整套系統的環境,那麼在虛擬機中運行的應用程序是感知不到本身是在虛擬機中運行的,就像和在真實的操做系統中運行同樣。docker

固然,看到這,不少人可能會以爲,這不是挺好的嗎,的確,在需求不是很大,好比只須要額外開兩三臺虛擬機的狀況下,這種作法並無什麼明顯的短板,可是,因爲咱們模擬的是一整套操做系統的環境,這就致使了什麼問題呢,咱們每開一個虛擬機都會額外佔用很大一部分資源,儘管你可能兩臺虛擬機中的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…

相關文章
相關標籤/搜索