開發與網路

Docker Container 容器是什麼?同一份環境到哪都跑得起來

Docker Container(容器)是把程式跟它執行所需要的環境,包含函式庫、設定與相依套件,一起打包成一份映像檔(Image),再從映像檔啟動的執行單位。它的價值是環境一致:同一份映像檔在你的電腦、同事的電腦、正式伺服器上跑起來都一樣,徹底解決「在我電腦上明明可以」的問題。
Docker Container 容器是什麼?同一份環境到哪都跑得起來:文章重點卡

Docker Container 容器是什麼?同一份環境到哪都跑得起來

「在我電腦上明明可以跑」是軟體業最經典的一句話,而容器就是為了讓這句話消失而生的。

你不用會寫 Dockerfile,但自架任何 AI 工具幾乎都會遇到它,看得懂能省下很多時間。

你將學到什麼

一句話定義

把程式跟它需要的環境打包在一起,到哪台機器都跑得起來。

白話比喻

像貨櫃:裡面裝什麼不重要,尺寸統一,任何船任何港口都能接。

兩個關鍵詞

映像檔是打包好的模板,容器是從模板啟動的執行體。

跟誰容易搞混

容器共用作業系統核心,比虛擬機輕量很多,開機以秒計。

定義

Docker Container(容器)是把程式跟它執行所需要的環境一起打包起來的執行單位。

打包好的成品叫映像檔(Image),是一份唯讀的模板;從映像檔啟動起來、正在運行的那一個,才叫容器。

容器共用宿主機的作業系統核心,只隔離應用層,因此比虛擬機輕量許多,啟動速度以秒計。

白話比喻

貨櫃改變了全球運輸,不是因為它能裝更多東西,而是因為它尺寸統一。任何船、任何吊車、任何港口都能接。

容器對軟體做的是同一件事:把「裡面裝什麼」跟「外面怎麼搬」分開,於是同一份程式到哪都跑得起來。

容器解決了什麼問題

問題容器怎麼解
在我電腦可以跑,別人跑不起來環境跟程式一起打包,各處執行結果一致
安裝相依套件很麻煩映像檔裡已經裝好,拉下來就能跑
多個服務互相污染各自跑在獨立容器裡,版本不互相干擾
搬到新機器要重設一次同一份映像檔換台機器照樣啟動
改壞了要復原刪掉容器重新建立,回到乾淨狀態

實際用例

自架一套自動化流程工具或本地模型服務時,官方文件給的通常就是一行容器啟動指令,你不需要自己處理相依套件。

多個服務要一起跑的時候,會用一份設定檔描述每個容器、連接埠與掛載目錄,一次啟動整組。要把成品放到線上,接的就是 Deploy 部署 那一段。

常見誤解三個很常見的坑:以為容器等於安全,實際上容器隔離的是環境不是權限,預設用最高權限跑的話被打進去就等於整台淪陷,該建立非特權使用者。以為改了掛載進去的設定檔重新建置就會生效,實際上通常要明確重啟那個容器。以為容器裡的檔案會留著,實際上沒掛載出來的東西刪掉就沒了。想在受限環境裡執行不信任的程式,另見 Sandbox 沙箱
本文源起本文為酒Ann 的 AI 名詞彙編系列,用白話把常見名詞一次講清楚。歡迎追蹤 酒Ann 的 Facebook

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

容器跟虛擬機差在哪?
虛擬機是把整套作業系統都虛擬出來,每一台都要自己開機、佔用大量記憶體與磁碟。容器則共用宿主機的作業系統核心,只隔離應用層,因此體積小很多、啟動快到以秒計,同一台機器可以跑很多個。代價是隔離程度不如虛擬機徹底。
映像檔跟容器是同一個東西嗎?
不是。映像檔是打包好的唯讀模板,像是安裝光碟;容器是從映像檔啟動起來、正在跑的那個執行單位,像是安裝好正在用的系統。同一份映像檔可以同時啟動很多個容器,各自獨立互不干擾。
容器裡的資料會不會不見?
會。容器本身是可拋棄的,刪掉重建裡面的檔案就沒了,這是設計如此。需要保存的資料要掛載到容器外面的儲存空間,也就是常說的資料卷(Volume)。這是新手最常踩的坑:以為重建容器只是重開機,結果把資料一起清掉了。