
最近去上了小賴老師的 Docker 課程,在課程過程中,雖然有少許的一些部份對於身為前端的我來說有點不太好懂,會需要稍微花點時間消化一下、思考一下,但在這堂課程中,依然還是收穫滿滿,也發現到自己以前誤解的部分,趁著還有記憶的時候,就來一篇算是上課後的不專業複習文吧!
Container 是容器?
從底層概念來看的話,所謂的 Container 其實是運用兩個 linux 技術所產生的,而這兩個 linux 技術分別是 :
- Namespace(負責隔離)
- cgroups(負責管理資源)
再更白話一點地透過產生一個 Container 的流程下去說明什麼是容器的話,也就是「利用 Namespace 技術,創建一個新的 PID Namespace,為 Process 提供獨立的空間」。
還記得自己第一次聽到 Container 這個詞是在轉職後的第一份工作的時候,那時候真的完全對 Container 這個詞一點概念也沒有,當然如果不懂其實好像對我當時的前端工作也不會太大的影響,但是還是很好奇這個是什麼東西,於是就問了後端同事「Container 是什麼?」,那時候得到的答案是:「Container 就是容器的意思,有點像是一個虛擬的電腦」,於是我對於 Container 的理解也就變成是 Container 是一個虛擬的主機,裡面會安裝一些我要用的程式。
上完這堂課之後,才發現自己當初的理解有些錯誤!
其實更正確的說法應該是,Container 是「一個被隔離的 Process」,而不單純只是一個空空的容器。而在這之中會導出一個核心特性,那就是「 Container 的生命週期與 Process 的生命週期一致,且每個 Container 都會有一個主要的 Process」。
Process 指的是什麼?
Process 指的是進行中的程式,這樣說可能聽起來很抽象,再更具體一點,可以是執行一個 Bash Shell 讓自己可以在這個指令介面中下指令,也可以是一個 node server 的運作,這兩個都是會佔據記憶體的實體,而非靜態的程式碼。
這裡也透過兩個不同的小例子來看一下什麼是 Process。
[持續在背景進行中的程式]
先執行
docker container run -d nginx
執行後會印出這個 Container 的 ID
![]()
再執行
docker container ls
可以看到一個運行中的 Container
![]()
[進行完成後結束的程式]
先執行
docker container run alpine echo "hello my Container"
執行之後會看到畫面上印出 hello my Container

接下來執行
docker container ls
會發現沒有任何 Container

再透過執行
docker container ls -a
可以發現到其實剛剛真的有一個執行 hello my Container 的 Container,只是它的狀態是 Exited
![]()
從上面這兩個小例子,不難發現到我們前面提到過的特性,「Container 的生命週期與 Process 的生命週期一致,且每個 Container 都會有一個主要的 Process」。因為在第一個例子中,Container 一直存在著,而在第二個例子中,因為 Process 已經在指令完成後結束了,所以 Container 也就呈現 Exited 的狀態了,但透過加上 -a 查看 Container 清單,還是可以發現到他曾經存在過的痕跡。
被隔離的 Process 是什麼?
被隔離的部分指的是 「Process 被限制在一個受控的環境中,這個環境與主機(Host)以及其他容器相互隔離」。這樣說還是一樣很難懂,那就一樣直接用實際的案例來看看吧!
首先,先跑兩個指令,建立兩個 container
docker container run --name my-container-1 -it -d alpine
docker container run --name my-container-2 -it -d alpine
跑完指令,就可以看到有兩個 Container 正在運行中

接下來在 my-container-1 創建一個文件檔案,確認 my-container-1 內有 my-file 這個檔案。

再前往 my-container-2 查看這個 container,可以發現沒有 my-container-1 中的檔案。

雖然這兩個 container 都是運行在我的電腦上,但是從創建檔案這件事可以發現,兩個 Container 是各自獨立的存在。
也可以透過下面的指令,來檢查這兩個 Container 的 PID 資訊
docker ps --quiet | xargs -n 1 docker inspect --format 'Container: {{.Name}}, PID: {{.State.Pid}}'
會發現兩個的 PID 確實也不相同。
![]()
Container 不是虛擬主機(VM)?
前面有提到我原本把 Container 理解成是一個類似虛擬主機的東西,但實際理解之後才知道 Container 並不等同於 VM,只是在某些用途上有點相似。其實在使用的技術及特性上,Container 和 VM 都不一樣。
技術的部分 VM 是透過 Hypervisor 創建,Container 則是透過前面提到過的 Namespace 及 cgroups 創建。Container 是共用電腦主機本身的核心,VM 則是模擬整個完整的作業系統。另外, Container 的部分就如之前提到的一樣,一定會有一個 Process 存在,且生命週期與 Process 綁定在一起,VM 則是與 Process 是互相獨立,沒有關聯性。
重點回顧
最後讓我們回想一下今天說到了哪些重點:
- Container 並不是單純的空空的容器,而是一個被 Namespace 技術隔離的 Process。
- Container 是各自獨立的空間。
- 一個 Container 一定會存在一個 Process。
- Container 的生命週期和 Process 一致,當 Process 結束,Container 也會結束運行。
- Process 指的是運行中的程式,例如:一個跑起來的 node server。
- Container 不等於 VM。
今天現大概複習了一下在課堂上學到的 Container 的部分,下次預計從 Docker Image 來複習在課堂上所學到的 Docker。
這次就先到這裡囉!
