雲端容器化技術與資源調度

認識無狀態化

前面我們用 Volume 的方式來運行了一個 Nginx Server。 透過改動容器外的資料夾內容就可以改動網站的內容。

然而這種作法,仍是屬於傳統的架站思維:

  • 我們先有一個作業系統
  • 我們在作業系統安裝一個 Nginx Server 會 serve /usr/share/nginx/html 目錄
  • 我們透過不斷改動 /usr/share/nginx/html 的內容來更換網站的版本,呈現新的內容

當我們會 改動 作業系統內的檔案的時候,我們就稱這個環境是一個為有狀態 的環境。

什麼都不會被改變的環境就是最穩定環境

Docker Container 的服務思維就是讓環境不會變動,任何時候這個環境都是一樣的。

因此前面我們透過撰寫 Dockerfile ,在原先的 Nginx Image 之上進行擴展做出另一個含有我們整個網頁目錄的新 Image。 這個 Image 內就自帶著一個網站目錄。

重點是這個 Image 被跑起來成為容器後,就直接帶有我們寫好的網頁,爾後我們就不再去變更這個目錄的內容了!

無狀態有什麼好處?

  1. 穩定: 前面我們一再強調,如果沒人可以動這個環境,說明這個環境很穩定。不會被『玩壞』。
  2. 可攜帶: 這個 Image 在什麼地方,跑起來成為容器後,都該正常運行,得到一模一樣、可預期的同一個網站。
  3. 可擴展: 我們對這個 Image 多跑幾次 docker run ... 指令,就可瞬間多好幾台 Nginx,而且還都是我們的網站內容。
  4. 可回朔: 退版變得很輕鬆

關於可擴展的這件事情,我們後面會再進一步說明。

等等,那我要怎麼變更網站內容?

如果什麼都不能動,那我們該怎麼變更網站的內容呢?網頁不可永遠不變化吧?

其實 Docker 的思維很簡單:重新 Build 一個新的 Image 出來!

$ docker build -t hello-site:v2 .
$ docker images
# 等到我們要換下一個新板的時候:
$ docker stop my-site
$ docker rm my-site
$ docker run --name my-site -d hello-site:v2

無狀態容器怎麼退版?

假設,現在v2網站上線後,發現非常嚴重的問題,想要緊急先退回上個版本:

$ docker stop my-site
$ docker rm my-site
$ docker run --name my-site -d hello-site:v1