雲端容器化技術與資源調度
認識無狀態化
前面我們用 Volume
的方式來運行了一個 Nginx Server。 透過改動容器外的資料夾內容就可以改動網站的內容。
然而這種作法,仍是屬於傳統的架站思維:
- 我們先有一個作業系統
- 我們在作業系統安裝一個 Nginx Server 會 serve
/usr/share/nginx/html
目錄 - 我們透過不斷改動
/usr/share/nginx/html
的內容來更換網站的版本,呈現新的內容
當我們會 改動 作業系統內的檔案的時候,我們就稱這個環境是一個為
有狀態
的環境。
什麼都不會被改變的環境就是最穩定環境
Docker Container 的服務思維就是讓環境不會變動,任何時候這個環境都是一樣的。
因此前面我們透過撰寫 Dockerfile
,在原先的 Nginx Image 之上進行擴展做出另一個含有我們整個網頁目錄的新 Image。
這個 Image 內就自帶著一個網站目錄。
重點是這個 Image 被跑起來成為容器後,就直接帶有我們寫好的網頁,爾後我們就不再去變更這個目錄的內容了!
無狀態有什麼好處?
- 穩定: 前面我們一再強調,如果沒人可以動這個環境,說明這個環境很穩定。不會被『玩壞』。
- 可攜帶: 這個 Image 在什麼地方,跑起來成為容器後,都該正常運行,得到一模一樣、可預期的同一個網站。
- 可擴展: 我們對這個 Image 多跑幾次
docker run ...
指令,就可瞬間多好幾台 Nginx,而且還都是我們的網站內容。 - 可回朔: 退版變得很輕鬆
關於可擴展的這件事情,我們後面會再進一步說明。
等等,那我要怎麼變更網站內容?
如果什麼都不能動,那我們該怎麼變更網站的內容呢?網頁不可永遠不變化吧?
其實 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