上一篇我們認識了 Container(容器),知道它像一個封裝好的可攜式執行盒子。
但你有沒有想過:Container 本身是怎麼來的?
答案是——Image(映像檔)。
這篇文章會帶你搞懂 Image 是什麼、怎麼自己做一個,以及如何上傳到雲端讓團隊共用。
Docker Image vs Docker Container:先搞清楚關係
學習 Container 技術時,最容易搞混的兩個名詞就是 Image 和 Container。
它們雖然密切相關,但本質上是完全不同的角色。
先記住一句話:
Image 是靜態的檔案組合,Container 是動態的執行過程。
Docker Image 和 Container 分別是什麼?
Docker Image 是一個打包好的檔案,裡面包含你的程式碼、需要的套件、執行環境設定。
它本身不能執行,只是一份「模板」。
Docker Container 則是根據這個 Image 建立出來的執行實體,真正在跑的東西。
一個 Image 可以重複建立多個 Container,每個 Container 都是獨立的,互不影響。
Docker Image 和 Container 的技術差異
用一張表格來整理兩者的區別:
簡單來說:Image 是靜態的模板,Container 是動態的執行實體。
Image 和 Container 分開設計的好處
Image 與 Container 分開的設計,在實務上帶來四個重要好處:
第一,開發一致性
所有開發人員用同一份 Image 來跑,不會再出現「我這裡可以跑,你那裡卻跑不起來」的問題。
第二,快速部署
每次只要下載 Image、執行 Container,就能在幾秒鐘內啟動服務,適合快速上線和擴展。
第三,彈性測試與還原
Image 可以做版本控管,每次測試可以指定不同版本的 Image,一鍵回滾也變得非常容易。
第四,CI/CD 自動化友善
建構完 Image 後,上傳到 Docker Hub 或 AWS ECR,後續只要「拉取 + 啟動」就能完成部署,自動化流程大幅簡化。
如何用 Dockerfile 製作 Image?
了解了 Image 和 Container 的差別之後,接下來最重要的就是:自己動手做一個 Image。
回想一下,如果你今天要在一台全新的電腦上跑一個 Node.js 專案,你通常會做這些事:
- 先安裝 Node.js
- 把程式碼放到某個資料夾
- 打開終端機,執行
node index.js啟動程式
這些步驟你已經很熟悉了,但問題是:每換一台電腦、每換一個同事,就要重新做一次。
而且每個人裝的 Node.js 版本可能不同,導致「我的電腦可以跑,你的卻不行」。
Docker 的做法是:把上面這些步驟全部寫進一份叫做 Dockerfile 的檔案裡。
什麼是 Dockerfile?
Dockerfile 是一份純文字檔案,裡面寫的是「製作 Image 的步驟」。
Docker 會從上到下逐行執行這些步驟,最後產生出一個完整的 Image。
不過,Container 是一個完全隔離的環境,裡面什麼都沒有——沒有作業系統的工具,也沒有程式語言的執行環境。
所以 Dockerfile 的第一步,一定是先選一個「已經裝好基本環境」的現成 Image 當作起點,再把你的程式碼放進去。
這個現成的 Image 就叫做基礎 Image(Base Image)。
Dockerfile 範例:建立一個 Node.js Image
假設我們有一個非常簡單的 JavaScript 程式,只有一個 index.js:
// index.js
console.log("Hello from Docker!");這個程式需要 Node.js 才能執行,所以我們的基礎 Image 要選一個「已經裝好 Node.js」的版本。
我們來寫一份 Dockerfile,一步步看它在做什麼。
第一步:選一個基礎 Image
FROM node:18FROM 是 Dockerfile 的第一行,用來指定「要以哪個現成的 Image 為起點」。
node:18 是 Docker Hub 上官方提供的 Image,裡面已經裝好了 Node.js 18 版和它需要的執行環境。
選了這個基礎 Image 之後,Container 裡就有了能跑 JavaScript 的環境。
如果你寫的是 Python 程式,這裡就會改成 FROM python:3.12;如果是 Java,就可能是 FROM openjdk:21。
第二步:設定工作目錄
FROM node:18
WORKDIR /appWORKDIR 的作用就像 cd 指令,告訴 Docker「接下來的操作都在 Container 內的 /app 這個資料夾裡進行」。
如果這個資料夾不存在,Docker 會自動建立它。
第三步:把程式碼複製進去
FROM node:18
WORKDIR /app
COPY index.js .COPY 會把你電腦上的 index.js,複製到 Container 內的工作目錄(也就是上一步設定的 /app)。
. 代表「目前的工作目錄」,所以這行的意思是:把 index.js 複製到 /app/index.js。
第四步:指定啟動指令
FROM node:18
WORKDIR /app
COPY index.js .
CMD ["node", "index.js"]CMD 告訴 Docker「當 Container 啟動時,要自動執行什麼指令」。
這裡就是執行 node index.js,也就是用 Node.js 跑我們的程式。
到這裡,完整的 Dockerfile 就寫好了。
整個流程就是:選一個有 Node.js 的基礎環境 → 建立工作資料夾 → 把程式碼放進去 → 告訴 Docker 啟動時要跑什麼。
執行 docker build 建立 Image
完成 Dockerfile 之後,在同一個資料夾打開終端機,輸入:
docker build -t myuser/hello-docker:1.0 .這個指令拆開來看:
執行後你會看到類似這樣的輸出:
Step 1/4 : FROM node:18
---> 8d1897ac9a6d
Step 2/4 : WORKDIR /app
---> Using cache
Step 3/4 : COPY index.js .
---> 319234f92ed1
Step 4/4 : CMD ["node", "index.js"]
---> Running in 5a9eaa3ddcae
Successfully built 32e30441a7c2
Successfully tagged myuser/hello-docker:1.0看到 Successfully built 就代表 Image 建立成功了。
用 docker run 測試 Image 是否正常
接下來用這個 Image 建立一個 Container 並執行:
docker run myuser/hello-docker:1.0你應該會看到:
Hello from Docker!這表示 Container 啟動成功,並且正確執行了我們的 Node.js 程式。
到這裡,你已經在自己的電腦上成功建立了一個 Image,也驗證它可以正常運作。
因為 Image 裡面已經包含了裝好的 Node.js、複製好的程式碼、設定好的啟動指令——所有東西都準備好了。
別人拿到這個 Image 之後,只要執行 docker run,Docker 就會根據這個 Image 建立一個 Container 並直接啟動,不需要再安裝任何東西。
而且因為大家用的是同一個 Image,每個人跑起來的環境和結果都一模一樣。
但這個 Image 目前只存在你自己的電腦上。
如果要讓團隊的其他人使用,或是部署到正式的伺服器上執行,你需要一個地方來存放和分享這個 Image。
這就是 Docker Hub 的角色。
Docker Hub:Image 的分享倉庫
Docker Hub 是什麼?
Docker Hub 是由 Docker 官方維運的一個線上平台,專門用來存放和分享 Docker Image。
任何人都可以把自己做好的 Image 上傳到這裡,也可以從上面下載別人分享的 Image 來用。
如果你用過 GitHub 或 npm,概念是一樣的:
- GitHub 是儲存「程式碼」的地方
- npm 是儲存「JavaScript 套件」的地方
- Docker Hub 就是儲存「Docker Image」的地方
你可以在上面做三件事:
上傳(Push)自製的 Image
把你在本機用 docker build 製作好的 Image,上傳到自己的帳號底下,團隊成員就能用 docker pull 下載使用。
延伸閱讀:如何將 Docker Image(映像檔)推送到 AWS ECR?完整步驟教學
下載(Pull)社群與官方提供的 Image
大多數常用的開發環境都有官方維護的版本,像是 node、mysql、nginx、python 等,省去從頭安裝的時間。
結合 CI/CD 自動化流程
每次專案打包完畢,自動推送 Image 到 Docker Hub,伺服器再從 Docker Hub 拉取最新版本來部署。
公開 vs 私人倉庫
Docker Hub 預設會將你的倉庫設為公開(Public),任何人都可以下載。
如果你不想讓其他人看到,可以手動改為私人(Private),不過免費帳號只能建立 1 個私人倉庫。
除了 Docker Hub 還有哪些選擇?
雖然 Docker Hub 是最廣泛使用的平台,但在企業環境中也有常見的替代方案:
這一篇你學會了什麼?
- Image 是 Container 的藍圖,Container 是執行實體——Image 是靜態模板,Container 是根據它跑起來的東西。
- Docker Hub 是全球的 Image 分享倉庫——你可以上傳自己的 Image,也可以下載別人做好的。
- 用 Dockerfile 製作 Image——寫好 Dockerfile →
docker build建立 Image →docker run驗證執行。 - 這些技能是進入 AWS ECS 的基礎——ECS Task 就是根據 Image 來啟動 Container。
下一篇我們將介紹 AWS ECS 中的 Task Definition,也就是告訴 ECS「要用哪個 Image、給多少資源、環境變數是什麼」的設定檔。