Docker Image (映像檔)是什麼?如何製作與管理?
更新日期: 2025 年 6 月 17 日
在現代開發中,我們常聽到「容器化部署」、「Docker」、「映像檔(Image)」這些詞。
上一章我們介紹了容器的基本概念,知道它像一個封裝好的可攜式執行盒子,但容器本身是怎麼來的?這就得從 映像檔(Image) 說起。
很多人一開始學 Docker,會把「Image」跟「Container」搞混。
這篇文章,我們就要幫你釐清兩者的差別、了解 Docker Hub 的角色,並實際動手打造一個屬於自己的 Docker 映像檔並上傳到雲端。
Docker Image vs Docker Container:先搞清楚關係
在學習容器技術的過程中,最容易搞混的兩個名詞就是 Image 和 Container。
它們雖然密切相關,但本質上是完全不同的角色。
理解這個差異,是使用 Docker 的第一步。
先說重點結論:
概念 | 定義簡介 | 類比概念 |
---|---|---|
Docker Image | 應用程式的「執行模板」,包含程式碼、環境設定與依賴套件,本身不能執行 | 像是「食譜」或「類別 Class」 |
Docker Container | 根據 Image 建立的「執行實體」,可以真正跑起來的應用程式實例 | 像是「一道菜」或「物件 Instance」 |
Image 和 Container 的關係有點像:
👉 Image 是靜態的檔案組合,Container 是動態的執行過程。
生活化比喻:映像檔是食譜,容器是做出來的料理
我們用日常生活中的例子來想像:
- Docker Image 就像一本料理食譜,裡面清楚寫著你要準備哪些食材(library / runtime)、每一個步驟該怎麼做(啟動指令)、烹飪時需要的工具與條件(記憶體 / 環境變數)等等。
- Docker Container 則是你根據這本食譜實際做出來的菜色,這道菜可以端上桌、可以吃,而且你要再做一份也沒問題。
👉 一份 Image 可以重複用來產生多個 Container。
這就像你可以用同一份蛋糕食譜,做出 3 個一模一樣的蛋糕給不同的人吃。
技術實務上的差異
特性 | Docker Image | Docker Container |
---|---|---|
是否可執行 | ❌ 不能執行 | ✅ 可執行 |
存在型態 | 靜態檔案(儲存在磁碟) | 動態執行實體(存在於記憶體中) |
建立方式 | 使用 docker build 建立 | 使用 docker run 或 docker create 建立 |
可否被複製 | ✅ 可以複製並分享給他人 | ✅ 可以複製,但只在本機生效 |
可否版本控管 | ✅ 可透過 tag 管理版本 | ❌ 容器狀態不適合長期保存 |
為什麼這種設計很重要?
這樣 Image 與 Container 分離的設計帶來很多實際好處:
- 開發一致性
所有開發人員可以「照同一份食譜做菜」,不會再出現「我這裡可以跑,你那裡卻跑不起來」的問題。 - 快速部署
每次只要下載映像檔、執行容器,就能在幾秒鐘內啟動服務,適合快速上線和擴展。 - 彈性測試與還原
映像檔可版本控管,每次測試可以指定不同版本的 Image,一鍵回滾也變得非常容易。 - CI/CD 自動化友善
建構完 Image 後,上傳到 Docker Hub 或 AWS ECR,後續只要「拉取 + 啟動」即可完成部署,自動化流程大幅簡化。
Docker Hub:分享與複用 Image 的全球倉庫
當你建立好一個 Docker 映像檔(Image)後,要如何把它分享給團隊使用?
或者在開始一個新專案時,怎麼快速取得一份現成的 Node.js 或 MySQL 執行環境?
這些事情,都可以透過 Docker Hub 來完成。
🗂️ Docker Hub 是什麼?
Docker Hub 是由 Docker 官方維運的公共映像檔倉庫,功能類似:
- GitHub 是儲存程式碼的地方
- npm 是儲存 JavaScript 套件的地方
- 而 Docker Hub 就是儲存 Docker Image 的地方
✅ 你可以透過 Docker Hub 做什麼?
- 上傳(Push)自製的映像檔
- 把你在本機用
docker build
製作好的映像檔,上傳到自己的帳號底下 - 團隊成員就能用
docker pull
指令下載使用
- 下載(Pull)社群與官方提供的映像檔
- 大多數常用的開發環境或資料庫都有官方維護的版本
- 如
node
,mysql
,nginx
,ubuntu
,python
等
- 如
- 節省從頭安裝與設定的時間
- 結合 CI/CD 自動化流程
- 每次專案打包完畢,自動推送映像檔到 Docker Hub
- 伺服器就可以從 Docker Hub 自動拉取最新版本來部署,實現快速迭代
Docker Hub 的基本概念與組成
要有效使用 Docker Hub,你需要理解以下幾個核心概念:
概念 | 說明 |
---|---|
Repository(映像檔倉庫) | 類似 GitHub 的專案,儲存某個應用的所有映像檔版本。例如:node、nginx |
Tag(標籤) | 區分不同版本的映像檔,常見的如 latest、1.0、18-alpine。可以指定你要的版本。 |
Image Name(映像檔名稱) | 完整格式通常為 帳號/倉庫名稱:標籤,例如:myuser/myapp:1.0。若省略帳號,表示是官方的 image。 |
📌 例子解析
假設你執行以下指令:
docker pull node:18-alpine
意思是:
- 從 Docker Hub 上的 官方 node 倉庫 下載
- 版本標籤是 18-alpine(即 Node.js 18 的極簡版)
或者你執行:
docker pull myuser/myapp:1.0
這表示:
- 從使用者
myuser
的帳號底下 - 下載
myapp
這個映像檔倉庫中 - 標籤為
1.0
的版本
🛡️ 公開 vs 私人倉庫
Docker Hub 預設會將你的倉庫設為「公開(Public)」,任何人都可以下載。
如果你不想讓其他人看到這份 Image,也可以將倉庫設為「私人(Private)」,不過免費帳號有數量限制。
🌍 除了 Docker Hub,還有其他替代方案嗎?
是的,雖然 Docker Hub 是最廣泛使用的平台,但在企業環境中,常見的替代方案還包括:
平台名稱 | 說明 |
---|---|
Amazon ECR | AWS 提供的映像檔託管服務,適合搭配 ECS 使用 |
GitHub Container Registry | GitHub 推出的容器倉庫服務,方便與 GitHub Actions 結合 |
GitLab Container Registry | GitLab CI/CD 專案整合式 Image 託管服務 |
Harbor | 開源的企業級私有映像檔註冊中心,企業內部使用居多 |
如何製作一個 Docker 映像檔?從 Dockerfile 開始
你已經了解什麼是 Docker 映像檔(Image)與容器(Container),接下來最重要的,就是學會如何自己動手打造一個映像檔。
在 Docker 中,我們不會手動一個一個指令進去裝套件,而是透過一份叫做 Dockerfile
的檔案,自動建構整個環境。
這讓整個製作流程可重複、可版本控管,也符合 CI/CD 的需求。
什麼是 Dockerfile?
Dockerfile 是一份純文字檔案,內容是用來告訴 Docker:「這份映像檔要怎麼組成」。
它會一步步執行裡面的指令,從一個基礎映像檔出發,加入你的程式碼、設定、安裝套件等,最後產生出一個專屬於你的映像檔。
✅ 可以把它想成:建構映像檔的「做菜步驟清單」。
✅ 範例:建立一個簡單的 Node.js 應用映像檔
假設我們的應用非常簡單,只有一個 index.js
檔案,內容如下:
// index.js
console.log("Hello from Docker!");
我們來撰寫一份對應的 Dockerfile,並逐行說明它的意義:
# 第一步:選擇一個基礎映像檔(這裡選擇官方的 Node.js 18 版)
FROM node:18
# 第二步:設定容器內的工作目錄,所有指令都會以這個資料夾為起點
WORKDIR /app
# 第三步:將 index.js 複製到容器的 /app 資料夾中
COPY index.js .
# 第四步:指定容器啟動時要執行的指令
CMD ["node", "index.js"]
🔍 補充說明:
指令 | 說明 |
---|---|
FROM | 選擇一個現成的映像檔作為建構基礎(如 Ubuntu、node、nginx 等) |
WORKDIR | 相當於 cd 指令,用來切換容器內的工作目錄 |
COPY | 把主機的檔案複製進映像檔內部 |
CMD | 指定容器啟動時要執行的程式或命令(只能有一個) |
這份 Dockerfile 的意思是:以 Node.js 為基底,加入你的 index.js
程式,然後啟動容器時自動執行 node index.js
。
🛠️ 建立映像檔的指令
完成 Dockerfile 之後,在該目錄下打開終端機(Terminal),輸入:
docker build -t myuser/hello-docker:1.0 .
這個指令可以拆解為:
部分 | 意義 |
---|---|
docker build | 啟動建構映像檔流程 |
-t myuser/hello-docker:1.0 | 幫映像檔取一個名字與版本(Tag) |
. | 告訴 Docker 去哪裡找 Dockerfile(. 代表當前資料夾) |
⏱️ 執行過程會看到類似輸出:
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM node:18
---> 8d1897ac9a6d
Step 2/4 : WORKDIR /app
---> Using cache
---> 4538fb56d6c2
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
這代表你已經成功建構出一個新的 Docker 映像檔!
🧪 測試映像檔是否可以正常運行
接下來我們試著用這個 Image 建立並執行一個 Container:
docker run myuser/hello-docker:1.0
你應該會看到:
Hello from Docker!
這表示這個 Container 啟動成功,並且正確執行了我們的 Node.js 程式!
如何把 Image 上傳到 Docker Hub?
當你在本地端建立好一個 Docker 映像檔後,最常見的下一步就是上傳到 Docker Hub。
這樣你就能在任何地方、任何伺服器上下載並重複使用它,團隊也可以一起協作,或搭配自動部署流程使用。
前置準備:你需要一個 Docker Hub 帳號
如果你還沒有帳號,請先到 Docker 官方網站註冊:
👉 https://hub.docker.com/signup
註冊成功後,假設你的帳號名稱為 myuser
,那你上傳的 Image 名稱就必須包含這個帳號名稱,格式如下:
myuser/你的映像檔名稱:版本
登入 Docker Hub 帳號
在終端機中輸入:
docker login
系統會提示你輸入:
- Docker Hub 帳號(Username)
- 密碼(或 Token)
輸入正確後會看到訊息:
Login Succeeded
這表示你已成功驗證,後續可以上傳映像檔。
🧠 小提醒:
- 如果你有開啟兩步驟驗證(2FA),Docker 要求你用 Access Token 取代密碼,從帳戶設定中產生即可。
- 若你登入多次錯誤,Docker 會暫時鎖住 IP,建議確保帳號密碼無誤。
給你的 Image 命名(Tag)
假設你已經有一個本地 Image 名稱為:
hello-docker:1.0
但要推送到 Docker Hub,必須加上「帳號名稱前綴」,所以你要先重新標記(tag)它:
docker tag hello-docker:1.0 myuser/hello-docker:1.0
這條指令的意思是:
- 以
hello-docker:1.0
為基礎 - 再建立一個新的別名
myuser/hello-docker:1.0
,符合 Docker Hub 的命名格式
推送 Image 到 Docker Hub
docker push myuser/hello-docker:1.0
推送過程中會顯示類似:
The push refers to repository [docker.io/myuser/hello-docker]
...
latest: digest: sha256:e1a8e... size: 1573
代表已成功上傳!
✅ 如果第一次上傳會比較慢,Docker 會上傳所有層(Layer);後續只會上傳變動的部分,大幅加快速度。
驗證是否能下載使用
你可以在任何一台電腦上測試:
docker pull myuser/hello-docker:1.0
這會從 Docker Hub 下載剛剛上傳的映像檔。你也可以打開瀏覽器,到:
https://hub.docker.com/repository/docker/myuser/hello-docker
檢查倉庫是否出現在你的帳戶下,並看到已上傳的版本。
🔐 補充:管理倉庫權限(公開 vs 私人)
- 預設建立的 Repository 是 公開的(Public)
- 如果你不希望別人下載,可以手動將其改為 私人(Private)
- 免費帳號可建立最多 1 個私人倉庫
- 進階方案可以無限建立私人倉庫
總結:這一篇你學會了什麼?
- Image 是容器的藍圖,Container 是執行實體
- Docker Hub 是全球的映像檔分享倉庫
- 你可以用 Dockerfile 製作 Image,並推送到雲端
- 這些技能是進入 AWS ECS 的基礎:ECS Task 就是根據映像檔來啟動容器
下一篇我們將介紹 AWS ECS 中的 Task Definition,也就是告訴 ECS「要用哪個 Image、給多少資源、環境變數是什麼」的設定檔。