前言:
這句話應該是開發人員經常掛在嘴邊的吧!
“在我的機器上是正常工作的啊,MD,怎么到你這就不行了?”
開發人員就會聯想到:
1. 肯定是你環境有問題;
2. 要么就是你個傻*不會用吧;
帶着這句話進入我們這次的主題,什么是容器?它能解決我們什么問題?
一、什么是容器?
容器這個詞,當我們第一眼看它或許腦子里是這東西:瓶瓶罐罐、裝水、裝其他東西的玩意。
不管是什么,總的來說,容器給我們第一印象就是一個字 —— “裝”。
那么今天我們要說的容器技術是怎么一個概念呢?
其實,我們常說的“容器技術”是英文單詞Linux Container(簡稱LXC)的直譯。Container這個單詞有集裝箱、容器的含義(主要偏集裝箱意思),但是在國內人們說“集裝箱技術”有些拗口,聽起來也不那么高大上,所以國內的人直接把它叫為“容器技術”,這聽起來是不是檔次更高了。
冷笑話:
比如說:今天你出門學東西,女朋友問:你出去干嘛啊?
結果你說:出去學“集裝箱”啊,你女朋友肯定以為你腦子不正常了。
容器的一些特性:
容器就是將軟件打包成標准化單元,以用於開發、交付和部署:
- 容器是一種輕量級、可移植、自包含的軟件打包技術,使應用程序可以在幾乎任何地方以相同的方式運行;
- 開發人員在自己的電腦上創建並測試好的容器,無需任何修改就能夠在生產系統的虛擬機、物理服務器及公有雲上運行;
- 容器賦予了軟件獨立性,使其免受外在環境差異(例如,開發和測試及預發布環境的差異)的影響,從而有助於減少團隊間在相同基礎設施上運行不同軟件時的沖突;
嘮叨幾句,有對比便於理解(可忽略):
物理機世界:
1. 在還沒有虛擬化的時候,我們宿主機上是不是直接裝操作系統,里面部署了很多軟件也打了補丁,當這台宿主機的硬件無法滿足我們業務時怎么辦啊?
2. 我們要將操作系統或者業務進行遷移到更高配置的宿主機,這個工作量是非常大,而且很有技術挑戰。
3. 即便我們將業務遷移成功了,中間是不是有一段時間業務的中斷啊,萬一遷移不成功還得有回退方案;在以前做一個生產環境的遷移工作最少要兩個星期或者半個月,怎么說呢?
4. 第一:要寫業務遷移方案 ——> 第二:在測試環境模擬 ——> 第三:在凌晨進行遷移工作 ——> 第四:如果不成功或者不能按時遷移完成要執行“回退方案”。
虛擬化世界:
后來有了虛擬化技術就相對來說容易一些,因為虛擬化可以做“在線遷移”,所有的虛擬機是放在一個共享存儲上,遷移就比較簡單了,但是還是會有問題。
比如說:
在我們公司搭了個環境做好業務后,總不能把整個虛擬機拷到客戶上吧?一個操作系統動不動都是幾個G、十幾G的容量,遷移起來很麻煩,所以說在你的測試環境是好的,到了客戶環境又出問題了,這個大家應該很常見吧。
或者說:
1. 在你測試環境是系統是CentOS7,但是客戶環境是CentOS6、RedHat6,總不能讓客戶換操作系統吧?客戶原來的業務怎么辦呢?這個不現實吧。那你這些軟件是不是都有可能出現不兼容問題,遷移的問題已經解決了,但是兼容性問題又出現了。
2. 這些都是我們經常在生成環境遇到的問題,即使你們現在還沒遇到這種頭痛的問題,當我們在生產環境玩多了就好體會得到了。
容器技術世界:
1. 有了容器之后,這一切就變得簡單了,容器最大的優點就是:既解決了遷移問題,又解決了軟件不兼容性的問題。
2. 它有點類似於在測試環境把所有的東西導出一個包(容器),將這個包(容器)導入到客戶生產環境上解壓就可以正常使用了。我們不需要關心客戶是什么操作系統,它只需要跑容器軟件就可以了。
3. 本身容器就是個精簡的東西,一個操作系統就一百多M,把軟件封裝在一起也就幾百M,打包出來和遷移都是非常容易的,這就是容器的 輕量級 。
二、為什么需要容器?
一般我們寫程序的,能接觸到好幾個環境:
- 自己寫代碼的環境叫做開發環境。
- 給測試去跑的環境叫做測試環境。
- 測試完可以對外使用的叫做生產環境。
其實我們在學習編程中,很多時間都浪費在“環境”上:
- 如果我現在重裝了系統,我想要跑我的war/jar包,我得去安裝一下JDK、Tomcat、MySQL等配置各種的環境變量才能跑起來。
- 我們跟着網上博主給出的步驟去寫Demo,但總是有Bug。
- 好不容易在測試環境下跑起來了,在生產環境就各種出錯!
所以說:容器使軟件具備了超強的可移植能力!
舉個例子:
在早期運輸貨物是沒有集裝箱這個概念的,那時候的貨物雜亂無章的堆放着,肯定影響貨物完好性和運輸效率;
集裝箱的發明之后極大的改善了全球物品的流轉速度。
假設我們從歐洲進口一些貨物回來,比如:跑車、鋼琴、石油等,如果把它們都堆在一起運輸是不是把貨物給破壞了;
或者這些貨物堆在一起就像快遞,我們從網上購買服務器是不是特別擔心,怕回來的時候服務器已經不是服務器了,被擠扁變成“鋼板”了。
后來有了“集裝箱”的發明,集裝箱規格標准化、各式各樣的貨物都可以裝、不同的交通工具都可以運輸(吊機、卡車、貨輪、火車),使得物流更加的便利;
比如我們是不是可以把石油、汽車、鋼琴分別放到不同的“集裝箱”里面,它們彼此之間就做到了隔離,同時也可以在一個貨輪里面運輸,它們彼此之間保證了獨立性,同時也就更安全。
這就是容器技術,“集裝箱”的優點容器里面都有,所以我們可以說容器技術是借鑒“集裝箱”發明的特點。
三、為什么容器技術現在才火?
Linux Container(簡稱LXC)容器技術的誕生(2008年)就解決了IT世界里“集裝箱運輸”的問題。那么為什么2013年左右容器才火了起來呢?
是因為Docker的出現
四、什么是Docker?
-
我們說“容器”就是Docker嗎?這句話不准確吧!
-
我們“雲“就是OpenStack嗎?這句話也不准確吧!
-
Docker是實現“容器”的一個解決方案而已!
-
就像OpenStack也是實現“雲計算”的一個解決方案!
Docker是基於GO語言實現的開源容器項目,當時Docker技術誕生之后,並沒有引起行業的關注。
正當他們快要堅持不下去的時候,腦子里蹦出了“開源”的想法。
開源后Docker在2013年一炮而紅,幾乎Docker已經成了容器技術的 代名詞 。容器技術早已存在,傳統的容器技術沒有成為主流的原因是未能提供標准化的應用運行時環境,而基於“容器技術”的Docker從一開始就以提供標准化的運行時環境為目標,真正做到“Build once,Run anywhere”(構建一次,到處運行)理念。
- Docker火了之后,dotCloud公司干脆把公司名字也改成了Docker Inc. 。
- Docker和容器技術為什么會這么火爆?說白了,就是因為它“輕量級”。
這是Google對 IT界技術的熱度測評,Docker、OpenStack、Hadoop現在並成為IT界最熱門的三個技術。在容器技術之前,業界的網紅是 虛擬機 。虛擬機技術的代表,是VMWare和OpenStack。
自從Docker火了之后,Docker的熱度超過了OpenStack和Hadoop。並不是說Docker熱度高於這兩個技術,OpenStack和Hadoop就不好了或者說沒那么熱了,是因為他們的技術相對來說比較成熟了,而Docker是2013才出現的,加上它的一些特性,所以它更加吸引人。
Docker特性:
標准化:
- 保證一致的運行環境
1. 在我計算機上運行的這個“容器”,我保證這個“容器”遷到你機器上運行的效果是跟我一樣的效果。
2. 不會因為你機器上的硬件、軟件、操作系統不一樣而導致不一樣的結果,這個在物理機和虛擬化時代是受影響的,但是在“容器”就不受影響。
- 彈性伸縮,快速擴容
如果不能滿足或者不夠了,可以再起幾個容器。
- 方便遷移
方便遷移大家聽了前面的介紹應該能體會得出了。
- 持續集成、持續交付與持續部署
“持續”就是“高可用”的意思,假設我們在一台虛擬機上部署了N個容器,萬一這台虛擬機“宕機”了怎么辦?
講到“高可用”,我們就在這里在嘮叨幾句,便於理解:
虛擬化世界里:
我們會將業務搭建成一個集群模式,如果一台主機“宕”了,那么其他節點會馬上接替業務,從而實現一個“高可用”。
容器世界里是怎么實現的呢?
那就是我們常說的“Docker+k8s”,“k8s”全稱是“kubernetes”,它就是用來解決類似這樣的問題的。
Docker跟kubernetes是什么關系呢?
比如說:
大家聽說過“KVM”吧?它就是“雲”底下開源虛擬化,但是如果你單純去跑“KVM”是很麻煩的,所以后面出現了OpenStack接管“KVM”,並且提供一下管理的機制、監控、運維功能、高可用的解決方案,這些都是OpenStack這層去完成的。
那么Docker就相當於KVM,kubernetes(k8s)就相當於OpenStack。所以說kubernetes(k8s)就是提供這些功能,比如說:這個“容器”在這台機器上出現故障了,它會自動的在另外一台機器啟動你這個“故障容器”(副本),從而實現“高可用”機制。
高性能:
- 不需要進行硬件虛擬以及運行完整的操作系統
輕量級:
- 快速啟動
隔離性:
- 進程隔離
五、Docker VS VM
Docker是內核級的虛擬化,可以實現更高的性能,同時對系統資源需求 非常低 ,所以 資源利用率就高 。
容器減少了“客戶機操作系統”這層,直接在“Docker”這層就跑應用了;
而右邊這個架構,意味着每個“應用”底層都要有一個“操作系統”,這本身就帶來了一定的開銷。
這就是容器為什么 輕量級 的原因。
優勢:
- Docker容器很快,啟動和停止可以在秒級實現,而傳統的虛擬機方式需要數分鍾。
- Docker容器對系統資源需要很少,一台主機上可以跑上千個Docker容器(在IBM服務器上就已經實現了同時運行10K量級的容器實例)。
容器和虛擬機共用
將容器和虛擬機配合使用,為應用的部署和管理提供極大的靈活性。
六、Docker架構圖
Docker 三大核心概念:
-
鏡像 (Image)
-
容器 (Container)
-
倉庫 (Repository)
簡單步驟如下:
Client 執行 “docker run ....” 這條命令時——> 它會查看本地有沒有這個“鏡像”(image),如果沒有就向“鏡像倉庫”拉取到本地 ——> 然后將拉取的“鏡像”運行起來就叫“容器”。
不是很恰當舉例,僅供個人參考:
我們JD購買一台服務器稱為“鏡像”——> JD本地倉庫沒有該服務器 ——>從JD總部倉庫調取打包好的服務器稱為“倉庫”——> 調取回來到本地倉庫的服務器稱為:鏡像——> 我們收到的包裹里面裝着服務器這個包裹叫“容器”。
七、生產環境架構圖
這個框架就是大多數IT公司的業務都想往或者說必須往這個框架去發展以及轉型。如果一個IT公司的業務從一開始就不上“雲”或者不使用“容器”,那么它的業務效率大大的下降,資源浪費也比較大,自然成本也提高。