(一)容器化技術與Docker

logo.png

我們都知道Docker是一個容器化工具,那么什么是容器呢,Docker和容器有什么關系,Docker又能解決什么問題呢?

麻煩的環境配置

軟件開發最大的麻煩事之一就是環境配置,在開發之前我們需要準備各種運行環境、IDE、輔助工具。就像我們要使用電腦前,先要安裝操作系統一樣。

而一個可用軟件的交付過程通常包含兩個部分 - 開發和維護。不幸的是,我們很難保證軟件開發測試和運行維護階段的軟件能運行在一模一樣的環境下。開發常說:"It works on my machine",很多時候我們都要花大量的時間去配置環境和教別人配置環境。

現在的應用程序

  • 以前的應用程序:
    • 幾乎都是單塊應用: 大系統, 多模塊
    • 緊耦合: 內部調用
    • 不常變更: 需求穩定(改動成本高)
  • 如今的應用程序:
    • 解耦: 微服務/異步
    • 經常變更: 快速迭代
    • 動態創建和部署: 服務化
applications.jpg

新架構的挑戰

  • 多樣化的技術棧
  • 需要動態創建機器
  • 很多活動組件
  • 運維人員需要管理復雜的架構

在新的應用程序架構下,我們部署應用的成本大大增加。
不但要搭建不同語言、不同技術棧適配的運行環境,還要部署到多個服務器主機上;并且這些主機還可能來自不同地方(公/私有云主機、物理主機)。

統一的管理

其實在軟件開發的過程中我們就思考過類似的問題 - 如何統一的管理我們的代碼包。例如,Maven、Gradle、NPM,我們使用一個相同的格式(規范)將我們的代碼劃分成模塊,并使用一套工具去管理他們。在此之后我們不需要重復的copy代碼、復制文件,只需要聲明式的引入我們需要的代碼包就可以了。

當然,我們希望我們的應用部署也能如此簡單。

“容器”

good-container.png

app-container.png

“容器”是一個黑盒,對于它的使用者來說:

  • 無需關心里面有什么:只關注“容器”能做什么
  • 有一套工具來管理黑盒:打包、運輸、運行
  • 減少了部署單元的數量,從而減少了花銷:多個工具聚集在一個“容器”內
  • 更容易管理多個環境:以“容器”為單位進行部署和管理

虛擬化技術

  • 虛擬機

    • 精心配置的虛擬機也是滿足我們(基本)要求的容器,我們能夠通過虛擬機鏡像來打包我們的應用。但是,龐大的操作系統占用了大量的系統資源,使運行成本大大上升。


      VM.png
  • 容器

    • (作為進程)共用內核并提供額外的隔離手段,避免虛擬的操作系統占用。


      container.png

虛擬機

  • 應用
  • 運行環境(Java/數據庫/libs...)
  • 客戶機操作系統(Guest Operating System)
  • 虛擬機管理系統(Hypervisor)
    • 操作系統級:MacOS(HyperKit),Windows的Hyper-V
    • 應用軟件級:VirtualBox,VMWare Workstation
  • 主操作系統(Host Operating System)
  • 硬件(Infrastructure)/云主機

容器

  • 應用
  • 運行環境(Java/數據庫/libs...)
  • Docker守護進程(Docker Daemon): 類似虛擬機管理系統
  • 主操作系統(Host Operating System)
  • 硬件(Infrastructure)/云主機

容器技術

容器技術已經發展了一段時間了, 例如, LXC, BSD Jails, Solaris Zones...


history.png
  • 看起來像虛擬機
    • 可以SSH到容器
    • 具有root的訪問權限
    • 可以安裝包
    • 可以mount文件系統
    • 擁有自己的eth0接口
    • 可以修改iptables 規則和routing table
  • 共享宿主機的內核
  • 隔離 cgroups (memory, cpu, blkio)
  • 擁有進程空間 (pid, mnt, net, ipc, uts)
    • pid - 隔離進程PID
    • mnt - 允許創建不同的文件系統層級
    • net - 隔離網絡控制、iptables、防火墻、路由
    • ipc - 定義內部進程交流的范圍
    • uts - 允許修改hostname

容器技術的局限

  • 容器沒有標準的格式
  • 所以容器是不可移植的
  • 沒有標準的工具,所以比如要自己管理網絡
  • 沒有可重用的模塊和API

Docker

what-is-docker.png
  • 使容器變得更容易使用
  • 容器鏡像的商品化
  • 可插拔的模塊易于吸引供應商加入
  • 適當的API可用來創建高層次抽象的工具
  • 和微服務誕生在同一個時代

Docker架構

docker-architecture.png
  • Docker Client:接收命令和Docker Host進行交互的客戶端
  • Docker Host:運行Docker服務的主機
    • Docker Daemon:守護進程,用于管理所有鏡像和容器
    • Docker Images/Containers:鏡像和容器實例
  • Registry(Hub):鏡像倉庫
docker-architecture2.png

Docker底層實現

docker-tech.png

底層實現原理詳解見

Docker核心技術

core-tech.png
  • Namespace 命名空間
    Linux 的命名空間機制提供了以下七種不同的命名空間,包括 CLONE_NEWCGROUP、CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS,通過這七個選項我們能在創建新的進程時設置新進程應該在哪些資源上與宿主機器進行隔離。因此容器只能感知內部的進程,而對宿主機和其他容器一無所知。
  • CGroups (Control Groups)
    Linux 的 CGroup 能夠為一組進程分配資源,也就是我們在上面提到的 CPU、內存、網絡帶寬等資源.
  • UnionFS


    union-fs.png

    Docker中的每一個鏡像都是由一系列的只讀層組成的,Dockerfile 中的每一個命令都會在已有的只讀層上創建一個新的層。通過 docker run 命令可以在鏡像的最上層添加一個可寫的層 - 容器層,所有對于運行時容器的修改其實都是對這個容器讀寫層的修改。
    容器和鏡像的區別就在于,所有的鏡像都是只讀的,而每一個容器其實等于鏡像加上一個可讀寫的層,也就是同一個鏡像可以對應多個容器。同時已構建的每一層鏡像也可以作為其他鏡像的基礎層進行共用。

Docker VS VM

VM-vs-docker.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容

  • 轉載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,520評論 0 120
  • Docker — 云時代的程序分發方式 要說最近一年云計算業界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,562評論 15 147
  • 我的寶寶一出生沒有母乳喝,美國醫院和中國不同,寶寶出生2天如果檢查健康即要安排出院。2天的時間,護士會教媽媽日常寶...
    Lucas的未來閱讀 1,939評論 0 2
  • 一只貓,忌諱任何聲音?;钪?,只為讓世界忘記我的存在,白日,也醞釀黑暗。 我愛夏天,到處都宣泄沸騰,沒有誰會注意平緩...
    徐墀閱讀 265評論 0 0
  • 如何將山峰翻轉 猶如松針落地 需要一些時間 何時山峰翻轉 山頂便不再尖 夕陽時候 大片光景難見 可是哪有山峰翻轉 ...
    伍丁零閱讀 162評論 1 3