版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/qq1010885678/article/details/48039361
記得一開始的時候,還隻能在一些網站上看到關于Docker零星的一些消息,之後的不久,有關Docker消息就遍布網絡。
是什麼因素讓Docker火起來的?
或者說什麼原因促使大家都對Docker感興趣并且開始運用的?
本文記錄一下自己對Docker的一點見解,關于Docker是什麼以及基本的操作網絡上有大把大把的文獻,或者參考這裡:
Docker初步介紹系列文章這裡就不再累述了。
首先需要明确的一點是,一個技術從誕生到流行,必定有其原因所在
并不是因為某種技術聽起來叼叼的樣子,或者說大家都在用我不用就跟不上時代
能被大衆所認可,并廣泛使用的,一定是解決了大部分人所煩惱的問題,或者改善了大部分人的應用現狀的
而Docker正是如此,那麼它到底解決了大家的哪些煩惱,如何讓大家在用Docker的過程中感到有質的改善呢?
舉一個簡單的例子,相信很多開發人員都遇到過這樣的問題:
要開發應用,那肯定要寫代碼的啊
要寫代碼,那肯定要配置某個語言的運作環境啊
再搞個好用的IDE,或者可以再裝幾個插件啥七七八八的
于是噼裡啪啦的好不容易裝好了,可以開始愉快地撸代碼了
也許一段時間之内并沒有什麼問題出現
但是就在某一天(也許是很久很久之後的事情了),電腦好卡啊,想重新裝個系統清靜清靜,或者來個更直接的,我要換一台更高配置的機器
那麼問題就來了
是不是還要繼續寫程式咯
那是不是還要繼續搭環境咯
那是不是還要繼續裝各種需要的軟體咯
重新裝?可以啊,下次再換系統再換電腦,每次都重新裝過咯~
雖然現在很多圖形化的工具可以幫人備份、還原、複制系統,但是這一般都是給個人PC機用的,如果是伺服器要進行遷移什麼的,怎麼破?
這是第一個問題,環境配置的重複工作和繁雜性
接下來看看第二個問題
我在伺服器上挂着一個tomcat,裡面跑着一個java web程式在讀着mysql資料庫,原本是好好的沒啥問題是吧
現在問題又來了我要對mysql更新一下,更新就更新吧,但是問題是我這個東西是已經在跑着了,有人用着呢,難道不顧使用者的死活直接就升了嗎,而且更新完敢百分百保證一點問題都沒有嗎
有人就會問了,好好的沒事更新啥啊
= =有時候偏偏就有這種需求,新版本性能更好啊,支援的功能更多啊,巴拉巴拉的。。。
這是第二個問題,局部部件更新或更改的隐患
上面兩個問題是比較切實而且确實是不好解決的
就以這兩個問題為例,開始聊聊Docker是怎麼做的
了解過Docker的人應該都知道Image和Container的概念,簡單的說可以把Image看成是一個壓縮包(生活中很常見的把,rar、zip、gz神馬的)
你要用的時候呢,就解壓縮,很簡單,然後就開始愉快的使用裡面的文檔資料啥的
可能你覺得光看很不爽,因為這個文檔寫的太糟糕,是以你就發揮才華狠狠地修改了一通,然後又壓縮變成另外一個壓縮包
so,Image就是壓縮包,Container就是解壓縮出來的文檔,修改之後還可以再次變成Image,然後Image又可以再次使用。。。此處無限循環自行腦補~
那麼第一個問題就解決了啊
啥?沒看懂?
對于第一個問題,Docker是這麼幹的:
你拉一個最基本的Image嘛,run一個Container出來,愛裝啥裝啥,跟自己的伺服器一樣操作,裝好了再儲存為一個Image不就完事了嘛
伺服器要遷移?
你把這個Image拷過去再run一個Container不就是一個一模一樣的環境了嘛
OK,搞定一個
還是看mysql更新的問題
之前我可能是這麼幹的:
搞一台Linux伺服器,搭個tomcat、裝個mysql,然後把java web程式部署到tomcat上面去,搞定走你~
再來看看Docker是怎麼做的:
還是整一台伺服器是吧,這是必須的
但是我不直接裝tomcat、mysql啥的了
我先裝Docker!
run一個Container是吧,關鍵的時刻來了,哎呀,一個Container也,那我就可以在裡面裝各種各樣的東西了,跟自己的伺服器操作一樣嘛~
真這麼幹就完了,那你還是直接裝在伺服器上面吧= =
我要run出三個Container出來!
Container1:
搭tomcat,把webapps(放網站程式的地方)挂載在伺服器上的某個路徑(放程式的地方)
為何這麼做?
首先,直接把程式放到Container中也不是不行,但是程式是會經常變化的,而Docker提供了可以直接将實體路徑映射到Container中的方法,将會變化的程式放在實體路徑上,Container再去通路豈不更好?
Container2:
安裝mysql,其他啥都不做了
Container3:
這個更徹底了,我就挂載mysql的資料庫檔案的那個路徑,啥都沒有了
Container1中的tomcat跑着java web程式
java web程式通過Container之間互相暴露的IP和端口通路Container2中的mysql
Container2中的mysql的資料庫檔案是讀Container3中的
Container3其實又是挂載着伺服器的實體路徑的(存放mysql資料庫檔案的真實路徑)
那麼看起來很複雜的一個流程,現在關鍵點來了,mysql要更新了
呵呵,我直接更新Container2中的mysql
我在run一個跟Container2一樣的Container,我對這個新的Container裡面的mysql更新!更新完連Container3中的資料庫檔案!
原來的mysql沒有受到任何影響,資料庫檔案也不會因為更新受到牽連,
更新完事之後,Container1連到新版本mysql所在的Container,萬事大吉~就算真的真的新版本出毛病了,重新切回去Container2就是了呗~
Docker就是這麼被用來解決問題的,處理方式和傳統的方式大有差別,但是确實能夠帶來友善和快捷
想想這樣一個應用場景:
一個分布式叢集不夠用了,原本我需要在搞幾台機器或者虛拟機裝啊配啊地擴充(而且就算是配置強大的機器,虛拟機起的個數也是少少的,數的過來的)
現在不用了,我刷地一下起了N個Container!
然後就沒有然後了…
再想想這樣一個應用場景:
開發的時候一個環境,如果測試的人不是你,然後測試人員又要搭一個一樣的環境來測試程式,更恐怖的是,釋出上線的時候又要保持這個環境的問題
現在也不用這麼幹了,一個Image,開發的時候run一個Container,測試的時候、釋出上線的時候…
這裡的目的也不是想一下子就成為Docker磚家啊啥的
僅僅是作為一個引子,指出Docker為什麼會被廣泛接受,其應用場景可以是哪些
至于對Docker的應用
反正大家都是是八仙過海各顯神通
能玩成什麼樣就看你想玩什麼樣~