容器化-Docker介紹

容器化-Docker介紹

3 人贊了文章

一、前言

  2014年春天,我進入一家電商公司做反應式編程研究和落地工作,因為做的是平台工作,希望通過平台去滿足不通的業務場景,業務部門只需要進行簡單的適配和封裝就能進行產品創新。此時就需要一種工具去快速搭建基礎環境,環境之間不能相互干擾,業務部門還能方面使用。就這樣和Docker進行了第一次偶遇,基於它我們將基礎環境、公共組件等封裝到鏡像中,業務部門只需要將代碼放入Docker中就可以輕鬆使用,原來需要1-2周的環境準備,現在只需要幾分鐘,太神奇了!

二、什麼是docker?

  Docker 是PaaS 提供商 dotCloud, 基於容器技術的輕量級虛擬化解決方案,誕生於2013年初,基於Google公司推出的Go 語言實現,加入了 Linux 基金會,遵從Apache 2.0 協議,原始碼在GitHub上進行維護;2017年Docker進行商業化運作,原來在github上開源項目正式改名為moby,docker變成了一家商業化公司。說到Docker,我們就不得不說容器技術了,Docker是一種容器化技術的落地。容器作為一類操作系統層面的虛擬化技術,其目標是在單一Linux主機交付多套隔離性環境,容器共享同一套主機操作系統內核。

三、Docker技術發展歷程

  • 2011年 — Warden:由CloudFoundry公司於2011年所建立,其利用LXC 作為初始階段,隨後又將其替換為自家實現方案。與LXC不同,Warden並不會與Linux緊密耦合。相反,其能夠運行在任意能夠提供多種隔離環境方式的操作系統之上
  • 2013年 — LMCTFY:「Let Me Contain That For You(幫你實現容器化)」。它其實屬於谷歌容器技術堆棧的開源版本,負責提供Linux應用程序容器,Kubernetes目前所使用的cAdvisor工具最初就來源於lmctfy項目
  • 2013年 — Docker:起步階段使用LXC,而後利用自己的libcontainer庫將其替換下來。與其它容器平台不同,Docker引入了一整套與容器管理相關的生態系統。其中包括一套高效的分層式容器鏡像模型、一套全局及本地容器註冊表、一個精簡化REST API以及一套命令行界面等等。在後期發展階段,Docker公司還構建起一套名為Docker Swarm的容器集群管理解決方案
  • 2014年 — Rocket:解決部分Docker當中存在的缺陷,開發目標是在安全性與生產要求滿足能力上超越Docker,其基於App Container規範並使其成為一項更為開放的標準
  • 2015年—Docker進行大家視線,開源社區得到前所未有的發展
  • 2016年 — Windows容器發布,docker新技術架構升級
  • 2017年—Docker:正式進行商業化運作,docker與moby分家
  • 2018年-Docker在企業中快速落地

四、容器與虛擬機差異

  容器為應用程序提供了隔離的運行空間:每個容器內都包含一個獨享的完整用戶環境空間,並且一個容器內的變動不會影響其他容器的運行環境。容器技術使用了namespaces來進行空間隔離,通過文件系統的掛載點來決定容器可以訪問哪些文件,通過cgroups來確定每個容器可以利用多少資源。此外容器之間共享同一個系統內核,這樣當同一個庫被多個容器使用時,內存的使用效率會得到提升。

  對於系統虛擬化技術來說,虛擬層為用戶提供了一個完整的虛擬機:包括內核在內的一個完整的系統鏡像。CPU虛擬化技術可以為每個用戶提供一個獨享且和其他用戶隔離的系統環境,虛擬層可以為每個用戶分配虛擬化後的CPU、內存和IO設備資源

  基於docker容器虛擬化與傳統虛擬化對比

五、Docker原理

  Docker是容器引擎,把linux的cgroup、namespace等容器底層技術進行封裝抽象,為用戶提供了創建和管理容器的便捷界面(命令行和API)

六、Docker特點

  一次構建,可以運行在任何地方;很好的釋全了跨平台和強一致性

七、Docker三組件

  鏡像:鏡像可以用來創建Docker容器的。一個鏡像可以包含一個完整的操作系統環境和用戶需要的其它應用程序,docker的鏡像是只可讀的,一個鏡像可以創建多個容器。

  容器:容器是鏡像創建的實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台。

  倉庫:倉庫是集中存放鏡像文件的場所。每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤(tag)。

八、Docker帶來的影響

  • 優化資源使用:
  • 以前我們一台32C128G物理機最多虛擬20台左右的4C4G虛機,每台虛擬機啟動一個程序,一共部署20多個程序,機器平均利用率不超過20%,導致大量資源浪費;現在通過docker容器方式啟動應用,由於容器共享操作系統網路,內存、cpu,我們一台物理機機器平均可以啟動60個左右的容器,相當於跑60個左右的應用,經生產驗證,應用的性能並沒有實際損耗。容器停掉後,資源自動釋放;避免資源定期回收
  • 運維效率提升
  • 以前我們對每個應用部署流程:申請資源——》創建虛機——》初始化運行環境——》部署應用程序包——》啟動應用,整個流程需要5-7天;如果需要擴展實例時,需要同樣的操作流程。容器化帶來的變革:編寫Dockerfile——》構建鏡像——》拉去鏡像並運行;Dockerfile中包含運行環境,只需要編寫一次;容器運行在資源池中(提前預製好的),整個流程需要幾分鐘完成
  • 環境一致性
  • 傳統方式中每一步可能會出現問題(人工或程序);容器化後構建的鏡像始終如一,任何地方運行都不受影響
  • 交付流程的改變
  • 開發——》編譯成war/jar——》提交運維部署申請——》運維定期處理——》通知業務上線成功——》業務驗證——》發現問題——》通知運維回退;整個過程耗時較長,涉及開發、運維強耦合,任何一步失誤導致服務不可用。?容器化變革:開發——》源代碼/war/jar——》一鍵部署——》業務驗證——》發現問題——》一鍵回滾;整個過程幾分鐘內完成,開發者、項目經理、產品經理等都可以獨立完成
  • 加速微服務落地
  • 微服務化後,隨著業務的增加、服務的拆分,服務的個數回暴增,以前可能幾十個服務,現在變成了幾百個服務甚至更多;服務的迭代上線、監控對傳統的運維挑戰更大,需要投入更多的人力物力去支持;容器化後,每個微服務就是一個容器,容器擴縮可以在秒級內實現,容器的監控有專門的監控工具,業務運行環境在容器中已經初始化好了,目前的運維團隊可以更方便的去管理更多的服務。
  • 以應用為中心
  • 傳統的應用部署需要先申請機器,考慮物理資源;容器化後,所有容器跑在一個資源池中,只需一次行初始化資源池,後面可以方便使用;業務開發者更聚焦在應用開發層面
  • 加速混合雲或多雲數據中心建設
  • 應用程序最終通過Dockerfile生成鏡像,鏡像存儲在鏡像倉庫,由於docker的特性(一次構建、隨處運行),在雲端或其它數據中心只要安裝簡單的環境就可以拉去鏡像鏡像運行。

推薦閱讀:

TAG:科技 | 計算機科學 | Docker |