[微服務] Docker基礎(2) - 什麼是Docker容器

前言

在介紹Docker之前我們需要知道,正常的OS(Operate System)是如何運作的。

如果今天有多個應用程式在機器上運行時,整體流程會如下圖

  • 每個Process(程式)接收使用者的命令
  • 使用System Call呼叫底層OS kernel操控記憶體、CPU和硬碟

狀況
假設今天我們的Chrome和NodeJS程式需要使用不同版本的Python去做操控,而機器目前只可以運轉的Python 2的版本,那就尷尬了,這樣代表Chrome和NodeJS使用Python3的應用與我們機器不相容。

解決方法
按照邏輯來說,我們只要想辦法讓Chorme和NodeJS都有個可以判別的標籤,讓他操控OS Kernel時知道他要使用哪一個Python版本。如下圖對硬碟做區隔並且設定對應的版本

通常在Linux上的處理方法是使用Namespacing和Control Groups(cgroups)去對機器資源做區隔與貼上標籤。讓Kernel知道這個Process要使用哪一個資源。

而Namespacing和Control Groups分別是甚麼呢?

  • Namespacing
    • 可以將Process需要的資源和其他資源分割獨立出來
  • Control Groups
    • 可以控管每個Process可以使用多少個資源

這代表美當我們遇到類似這樣不相容的問題時,我們都要去設定Namespacing和Contrl Groups。如果今天有上百個不相容的問題的話,那我們對資源的控管也會天下大亂

Docker Container

而Docker的出現,解放了我們原本的作法,我們不在需要去設定與花心思做額外的資源管理,因為Docker Container直接幫我們做掉了。

每當我們開啟一個Container,就代表Docker已經幫我們對系統做到資源與Process的區隔,如下圖

而每個Container都是一個獨立的Process並且有自己獨立的資源集合,而他的呼叫方式還是依賴我們機器上的作業系統Kernel呼叫。

結論

所以Docker容器的出現

  • 讓我們直接從資源與Process的管理中解放
  • 他只是對現有的作業系統做資源區隔,而不像是VM完全在創立一個新的OS系統,所以他是輕量級虛擬化

留言

這個網誌中的熱門文章

Java Lambda Map篇

(InterviewBit) System Design - Design Cache System

設計模式 - 享元模式 (Structural Patterns - Flyweight Design Pattern)