【docker專欄1】docker解決的實際問題及應用場景
Docker是一個開源的容器引擎,它輕巧,且易移植,「build once, configure once and run anywhere」。使用go語言開發,並遵從apache2.0協議。
一、 傳統軟體行業中存在的問題
- 開發、生產、測試環境不一致,開發環境下可用的服務挪到生產上不可用。
- 不同環境之間遷移成本太高,沒有統一的軟體部署封裝標準及封裝環境。
- 對於分散式軟體持續集成(測試、打包、發布、部署、管理)周期很長,難以自動化、工程化。
- 面臨瞬時用戶流量增大的場景,很難實現分散式應用服務實例的快速部署。

二、集裝箱與docker之間的關係
通常稱docker為軟體行業的集裝箱技術,那麼docker和集裝箱有什麼相似之處呢?
| 傳統行業集裝箱 | 軟體行業Docker |
|---|---|
| 裝載實體貨物 | 裝載並運行應用服務 |
| 具有統一的規格,便於搬運 | 封裝環境的統一性(JDK、環境變數都可以封裝在一個docker鏡像裡面),可以遵從一定規則反覆的、快速的自動化安裝部署 |
| 環境隔離,每個公司的集裝箱貨物與其他的公司的貨物不混在一起。 | 在linux中採用namespace技術進行資源隔離,cgroups技術進行資源限制。容器之間互不影響。 |
| 資源共享,一個運送集裝箱的船舶,搭載多個集裝箱 | 一台伺服器可以啟動多個docker容器,達到共享伺服器資源的目的 |
| 具備完整的物流倉儲系統 | docker鏡像倉庫中的鏡像,可以導出導入,上傳下載 |
可以參考我的另一篇文章《【大話雲原生】煮餃子與docker之間的關係》,我覺得這篇文章對於您理解docker將有非常大的幫助。
三、docker與虛擬機的區別
docker和虛擬機在某些應用場景下比較像,但是docker不是虛擬機。

docker是一種虛擬化容器技術,他和虛擬機最根本的區別是:docker容器和宿主機共用linux作業系統內核,不會在宿主機上再次安裝作業系統。docker容器運行狀態下的本質是宿主機上的進程,通過namespace資源隔離,cgroups資源限制,使它看上去像是一個獨立的虛擬機.
| 對比項 | 虛擬機 | docker容器 |
|---|---|---|
| 啟動速度 | 龜速(本質是啟動作業系統) | 秒速(本質是啟動一個進程) |
| 鏡像大小 | 以Ubuntu為例,1G以上 | Ubuntu:195M |
| 應用部署集成 | 通常是手動安裝 | 下載鏡像+啟動鏡像(自動) |
| 記憶體訪問效率 | 慢,先訪問虛擬地址 | 基本等同於宿主機 |
| CPU損耗 | 虛擬作業系統造成的損耗較大 | 接近於0 |
四、docker的應用場景
- docker鏡像一旦構建,就已經一次性完成了應用自動打包、集成。docker鏡像可以進行版本管理、複製、分享、修改,就像管理程式碼一樣。
- 通過統一的docker環境封裝(比如鏡像中封裝了同一版本的JDK、同樣的環境變數等等),保證應用服務運行環境的一致性。避免出現在測試環境上好用,挪到生產環境下運行失敗的問題。
- docker可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。
- 因為鏡像可下載、可復用,docker容器可快速啟動等特性,結合容器編排服務(k8s)可以實現大型分散式部署的彈性伸縮,快速擴展。
五、總結
如果初學者對於本節內容理解起來有困難,也不要氣餒。其實docker的學習難度很低,隨著學習的深入,上面的這些概念很容易理解的。
覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力!。更多精彩內容公眾號:字母哥雜談。字母哥部落格:zimug.com

