Skip to content

antony@notes:~/container$ cat "Docker-軟體貨櫃堆疊檔案系統架構.md"

Docker 軟體貨櫃堆疊檔案系統架構

2021-10-24· container ·Docker

Docker 軟體貨櫃堆疊檔案系統架構

  • 2個(或多個)container由同一片image產生(使用相同的 *.json檔案 & rootfs檔案系統目錄–

  • 左邊這張圖的OS,是作業系統,我們的首選是linux作業系統,而linux作業系統就是container的出生地,因為container一定有一個一直在前景執行的application,然後他一定有一個相依檔,把他一起隔離在紅色框框裡面,還加上linux的核心kernel技術: chroot、cgroup、overlay2,還有bridge網路架構,就在紅色框框裡形成一台電腦。

  • 左邊這張圖還有一個重點,上面有好多台container,他們共用kernel。

  • container使用的檔案系統架構為"overlay2"(由上而下為mount/upper/lower)

  • 當2個container為同個image所產生的時候,2個container所使用的layer1(lower dir) 會共用同個image中的rootfs ,layer 2(upper dir)則是各自產生,並各自掛載至layer 3 (mount)。

  • 右邊是代表使用光碟片 (image) 來製作出2台 container (overlay2)

    • Layer 1 : lower , 也就是放 rootfs 的內容 (光碟片的所有目錄跟檔案)。
    • Layer 2 : upper , 但畫得不好? 應該要切成兩邊才對,是兩個目錄分別提供給 container 使用的 (rw)。
    • Layer 3 : merge , 就是下面兩層的融合,實際運作的目錄。
  • 兩個upper與最下面的lower會分別各建立一個overlay2的檔案系統,然後掛載到Layer3這個目錄裡面去,這邊的Layer2與Layer1還是檔案系統沒有錯。

  • 什麼是"whiteout"?

    • 立可白,在這個檔案系統裡面要把一個檔案刪掉,那個檔案在lower最底層裡面,而lower這層有一個屬性"read only",代表在裡面的內容是不可能刪除的,所以在lower上面做變動,要把lower的檔案刪掉,它說OK刪掉,但是是在upper這層會產生一個立可白檔。
  • 什麼是"The copy-on-write (CoW) strategy"?

    • 它叫copy up,當你要修改的是最底層的檔案,因為它是"read only",所以只好把這個檔案從最底層的lower拷貝到upper這層。
  • 結論:

    • 因為不管是"whiteout",還是"The copy-on-write (CoW) strategy",都會讓我們的檔案系統變慢,只要在overlay2檔案系統裡面修改檔案,第一件事,一定要到底層(lower)的所有目錄掃描一遍,去看你要修改的檔案底層有沒有,所以代表底層檔案系統的內容和目錄,一天到晚被search,上面只要做一個修改,下面就要search一次看有沒有,有就要做"copy up";如果要刪除,就要到下面的目錄區看檔案有沒有存在,有就要做"whiteout"。

    • 所以overlay2不適合需要高頻率修改的應用系統,例如: 資料庫系統(Oracle、Mysql、Mscql、MariaDB,這種資料庫系統一定對檔案和目錄,高頻率的做修改,有刪、有增和update)、大數據平台、訊息平台


認識 Data Volumes

  • bypasses the Union File System
    • “bypasses”: 中文意思是"跳過",不是消滅
    • “Union File System”: 指的是overlay2,也就是所謂的堆疊檔案系統,在linux講檔案系統不是只有overlay2,還有aufs,還有更之前的…等,他們統稱"Union File System"
  • 現在container要讓資料庫、大數據和kafka …等,這些系統能夠高速並且永存(persist data)
  • 問:問為何要使用Data Volumes?
  • 答:
    • 跳過使用overlay2,避免一層一層找資料。
    • 即便container被刪掉後,Data Volumes一樣作為檔案永存著。
    • 讀取快速,適合拿來高頻率修改的應用系統(如:資料庫、大數據平台…等)。
  • 老師的經驗補充:
    • 把資料存在overlay2檔案系統裡面,container一刪掉,所有資料都不見,嚇死人了,公司的人資系統,如果把資料建構在overlay2的,哪一天不小心輸入Docker rm,還很帥氣的加個-f,Enter鍵按下去的那一剎那,請到人資部門領取辭職單,寫一寫可以走人了,老師教了很多學生,通常稱這種學生為"衝動型的學生",真的當場被開除。
    • 還有一個學生更厲害的,考過Cisso認證,阿唷同學,Cisco是網路的King,他在他朋友圈裡走路是橫著走,有一天他被開除了,因為他去按了一個網路裝置的按鈕,叫做"電源",他把電源給關了,當場被開除。
    • 從這個地方開始,自己要搞清楚,有很多系統,我們絕對不可以亂動的,原因是因為你對它的運作要有所了解,因為有可能做的動作就是傷害它,老師不希望大家在工作上也有這種經驗。

Host-Based Persistence Per Container

  • 左上角的"Host",是我們的虛擬主機ALP
  • 右下角的container,裡面有一個目錄叫content的裡面有一個目錄dir,事實上這個目錄它就是Docekr Host這個主機裡面的3ran506d87om這個資料夾,意思就是說,以後我的container只要使用這個目錄區,container裡面的content裡面的dir,事實上就是使用Docker Host裡面的目錄區。
  • 結論:
    • 現在在右下角的content裡面的dir裡面,做目錄區的產生,檔案的修改、新增和刪除這些動作,就等於在linux系統的檔案系統在操作,與overlay2一點關係都沒有,linux檔案系統用來處理高頻率修改檔案的系統是沒問題的。

MariaDB Image 內建 Data Volume (一)

$ docker pull quay.io/cloudwalker/mariadb


 Host Data Volume 運作架構

  • 在host這台機器,自己建目錄區和目錄結構,目錄的名字自己取,目錄裡有幾層,自己決定。

  • 紅色的線是掛載,方向是由左到右,也就是做好的主機目錄,掛載到conrainer裡面指定的目錄,這裡的名稱剛好跟外面主機的目錄名稱一致,沒有特別規定外面叫web,裡面也要叫web,裡面的web也可以叫作ZZZ,今天這個結構一但做成功,這台container針對目錄作資料存取,就是讀取主機的目錄內容,這種運作架構就是Host Data Volume 。

假設在第一台container 1目錄裡面產生6個檔案,再把container 1刪掉,然後再產生一台container 2,一樣再把web這個目錄產生進去,把它當成Host Data Volume,請問是否會看到剛剛第一台所產生的資料? 答:會。


使用 myderby Image

$ docker run --name d1 -d -p 8888:8888 quay.io/cloudwalker/alpine.derby

  • “derby"這是一個Database的名稱,在台灣知道的人不多,它是全球第一套用java語言開發出來的系統。

  • quay.io/cloudwalker/alpine.derby- 是老師在alpine系統裡面,自己寫的一個java的網站系統,資料庫用的是derby。

  • docker ps -a 檢查d1有沒有成功建立。

  • curl http://localhost:8888/db; echo "" - 連接老師寫的網站應用系統。 用curl連進去,系統會回應Apache Derby資料庫,版本代號10.14.2.0。

  • $ curl http://localhost:8888/hostname; echo "" - 回應container的電腦名稱。 可以看到Hostname亂七八糟。

  • docker rm -f d1 - 刪除剛剛建的d1。

  • docker run --name d1 -h lcs101 -d -p 8888:8888 quay.io/cloudwalker/alpine.derby - 再重建一台container,新增參數 -h lcs101

  • $ curl http://localhost:8888/hostname; echo "" - 再重新curl一次,去問application的電腦名稱。 可以看到名稱改為"lcs101” ,老師開發的網站系統,會回答container叫什麼名字。

  • $ docker rm -f d1 - 最後再把d1刪掉。


Host Data Volumes

  • $ cd ~/wulin; mkdir db - 再wulin建一個目錄叫db

  • ~wulin$ dir - 檢查有沒有建成功

  • $ docker run --name w1 -d -p 8888:8888 -v ~/wulin/db:/derby/db quay.io/cloudwalker/alpine.derby

    • -v ~/wulin/db:/derby/db
      • -v“它的全名叫做"Host Data Volumes”。
      • 也就是把主機產生的目錄區~/wulin/db,掛載到container裡面的目錄區:/derby/db
      • 這個資料夾就是Derby資料庫,它是一個網站應用系統,裡面Derby資料庫就是用/derby/db這個目錄區來儲存所有資料。
      • 把主機的目錄掛載到Derby資料庫的目錄區,代表Derby所產生的所有資料,就會通通永存在Docker Host的家目錄裡面裡面的wulin裡面的db
  • $ ls -alh db - 檢查剛剛創的資料夾裡面是不是有人在使用了。 可以看到裡面有Derby.log在使用。

  • $ curl http://localhost:8888/db/cars/create;echo ""

    • 這行命令是現在的流行,用curl到資料庫裡面去產生一個table,tables的名稱叫cars
    • 這個是現在的一種流行,資料庫的操作到url,也就是網站的url,去下達資料庫的運作命令。
  • 補充:

    • 只要講資料庫,它的名稱就叫"Database”,裡面一定會有各式各樣的"table(表格or資料表)",這個資料表相當excel的工作底稿,而每一個資料表裡面,一定會有很多的"records(紀錄)"。
    • 只要講到資料庫,裡面會有所謂的資料表,很多表單,每個表單裡面會記錄各式各樣的紀錄,譬如:銷貨單、傳票,講庫存管理系統的話,還有進貨單、報廢單,巴拉巴拉一大推工廠管理的單據,也就是我們的資料庫,透過"table"來做管理,一個"表單"代表一個"records"。
  • $ curl 'http://localhost:8888/db/cars/insert?id=123&name=star&price=123';echo ""

    • curl後面加insert,增加一筆資料進去,這筆資料有3個欄位,有idname(名稱)和price,也就是說這個表格裡面有3個欄位,一個是代號,一個是項目的名稱。
    • 老師表示這個叫做"星級"的車系列,因為很快的我們的車子是要飛上天的,,這個也沒甚麼好驚訝的,這是遲早的事,現在大家存錢不一定要買的是電動車,我們要買的是飛行車,因為我們要存10年的錢XD
  • $ curl 'http://localhost:8888/db/cars/insert?id=234&name=sun&price=123';echo ""

    • 再曾加一筆資料進去。
  • $ curl http://localhost:8888/db/cars/list;echo ""

    • 資料加進去,還有一個功能叫做list,到底加了幾筆,show出來看看,一樣用curl這個命令。 可以看到剛剛增加的兩筆資料都有顯示出來
  • 如果想要再增加資料進去的話,可以把$ curl 'http://localhost:8888/db/cars/insert?id=234&name=sun&price=123';echo "" 這段命令裡面的id名稱改一下,name的名稱改一下,price的部分也改一下,就可以增加一筆資料到cars這個表單裡面。

  • $ docker rm -f w1

    • 把w1刪掉
  • $ docker run --name w1 -d -p 9999:8888 -v ~/wulin/db:/derby/db quay.io/cloudwalker/alpine.derby

    • 重新再建一次W1,這次port號改成9999。
  • $ curl http://localhost:9999/db/cars/list;echo ""

    • 驗收剛剛加進去的資料是不是都還在。 可以看到都在、資料永存,而且我們的container是bypass overlayer2。
  • 結論:

    • 今天練習這個,主要告訴我們,資訊界現在流行,對Database增加資料,不一定要再下達傳統的sycall命令,可以用curl來做。
    • 我們的container只要有關於資料,且須高頻率處理的,一蓋都是用host data volune。

tags: Docker