Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

如何將 Docker Image(映像檔)推送到 AWS ECR?完整步驟教學

最後更新:2026年4月8日基礎概念

你已經在本機上建好了一個 Docker Image(映像檔),接下來想把它推上雲端,讓其他服務可以直接使用。

但問題來了——Image 要傳到雲端的「哪裡」?

這篇文章會先帶你認識存放 Image 的地方,然後一步一步完成整個推送流程。

全程會使用 AWS 管理主控台搭配 AWS CLI 和 Docker CLI 來操作。

什麼是 Container Registry?

你不能把 Image 隨便丟到雲端的某個資料夾就好,你需要一個「專門存放容器映像檔」的地方。

這個地方就叫做 Container Registry(容器映像檔登錄庫)。

這個名字其實藏了兩個重要的概念,我們從英文拆開來看:

Registry 的意思:登記讓別人能找到

在英文裡,Registry 有「登記處」的意思,像是你去戶政事務所登記資料,登記完之後別人就能查到你的紀錄。

Container Registry 的概念也是一樣的:你把 Image 推上去「登記」,其他服務或團隊成員就能找到它、拉下來使用。

所以它不只是一個放檔案的空間,它更像是一個「Image 的集散中心」——你登記上架,別人就能來取用。

而且每次登記時,Registry 會幫你記錄版本、標籤和來源,確保大家拉到的都是正確的版本。

為什麼叫 Container Registry 而不是 Image Registry?

你可能會覺得奇怪:裡面存的明明是靜態的 Image,為什麼不叫 Image Registry?

這是因為這個名字反映的是「最終目的」。

Image 只是一個靜態的藍圖,而 Container 才是最終跑起來的服務。

叫做 Container Registry,是為了強調:「這裡存放的東西,都是為了產生容器而存在的。」

同時,這個命名也能跟傳統存照片或備份檔的「Image(鏡像)」服務區隔開來,讓人一聽就知道這是專門為雲端容器生態系設計的基礎設施。

理解了這兩個概念之後,你可以把 Container Registry 想像成「Docker Image 專用的倉庫」。

就像你把程式碼推到 GitHub 來管理和分享一樣,Container Registry 就是用來存放、管理和分享 Docker Image 的地方。

把映像檔推上去之後,雲端上的其他服務就可以從這個倉庫把 Image 拉下來使用。

各家雲端平台都有自己的 Container Registry 服務,例如 Google Cloud 有 Artifact Registry、Azure 有 Azure Container Registry。

而在 AWS 的世界裡,這個服務叫做 ECR(Elastic Container Registry)。

所以接下來的目標很簡單:把本機的 Docker Image,推送到 AWS ECR 上。

安裝 Docker 環境

在開始之前,你的電腦上需要先安裝 Docker。

請到 Docker 官方網站 下載並安裝 Docker。

安裝完成後,你就會同時擁有 Docker CLI(命令列工具),可以在終端機中使用 docker 指令。

如果你想要一個更直觀的圖形介面,也可以額外下載 Docker Desktop。

它可以讓你用視覺化的方式查看目前有哪些 Image、哪些容器正在運行。

不過這篇文章會以 Docker CLI 為主來操作。

用 docker pull 拉取測試用的 Docker Image

在推送 Image 到 ECR 之前,我們得先有一個映像檔對吧?

這裡我們用一個最簡單的 hello-world Image 來做示範,因為重點是讓你學會推送的流程,映像檔本身是什麼內容並不重要。

打開終端機,輸入以下指令來拉取 Image:

docker pull hello-world

執行完成後,你應該會看到類似「Pull complete」的訊息,代表映像檔已經下載到本機了。

接著,你可以用這個指令確認 Image 是否真的存在:

docker images

你應該會在列表中看到 hello-world,標籤是 latest。

如果你有安裝 Docker Desktop,也可以打開它來確認。

想進一步測試 Image 能不能正常運作,可以執行:

docker run hello-world

如果你看到「Hello from Docker!」的訊息,就代表一切正常,Docker 環境沒有問題。

建立 AWS ECR 儲存庫

現在我們有 Image 了,接下來要在 AWS 上建一個地方來存放它。

這個地方就是 ECR 儲存庫(Repository)。

登入 AWS 管理主控台

首先,打開瀏覽器進入 AWS 管理主控台。

確認你已經有一個 AWS 帳號,並且選擇了正確的 Region(區域)。

建議選擇離你比較近的區域,例如 ap-northeast-1(東京)或 ap-southeast-1(新加坡)。

建立 ECR 儲存庫

在主控台的搜尋欄輸入「ECR」或「Elastic Container Registry」,點進去。

然後點擊「Create repository」來建立一個新的儲存庫。

你需要填寫以下資訊:

欄位說明範例
Visibility settings選擇公開或私有選擇 Private
Repository name儲存庫名稱hello-world
說明選擇公開或私有
範例選擇 Private
說明儲存庫名稱
範例hello-world

其他設定維持預設即可,然後點擊「Create repository」。

建立完成後,你會在儲存庫列表中看到你剛建的 hello-world。

請記下這個儲存庫的 URI,它的格式長這樣:

<你的AWS帳號ID>.dkr.ecr.<區域>.amazonaws.com/hello-world

舉個例子,如果你的 AWS 帳號 ID 是 123456789012,區域選的是東京(ap-northeast-1),那 URI 就會長這樣:

123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world

拆開來看每一段的意思:

區段範例說明
AWS 帳號 ID123456789012你的 AWS 帳號專屬 ID
固定前綴dkr.ecr代表這是 ECR 的 Docker Registry
區域ap-northeast-1你建立儲存庫時選的 Region
網域amazonaws.comAWS 的網域
儲存庫名稱hello-world你剛剛建立的 Repository 名稱
範例123456789012
說明你的 AWS 帳號專屬 ID
範例dkr.ecr
說明代表這是 ECR 的 Docker Registry
範例ap-northeast-1
說明你建立儲存庫時選的 Region
範例amazonaws.com
說明AWS 的網域
範例hello-world
說明你剛剛建立的 Repository 名稱

這個 URI 等一下會用到,非常重要。

用 AWS CLI 登入 ECR 取得推送權限

等一下我們要用 Docker CLI 的 docker push 指令,把 Image 推送到 ECR。

但問題是,ECR 是一個「私有的」儲存庫,不是誰都能推東西上去的。

所以在推送之前,你電腦上的 Docker CLI 需要先「登入」ECR。

因為 docker push 這個指令是由你本機的 Docker CLI 執行的,但 ECR 不認識你的 Docker CLI,它不知道你是誰、有沒有權限推東西上來。

所以你要先讓 Docker CLI 跟 ECR 做一次身分驗證,驗證通過後,Docker CLI 才能把 Image 推上去。

這個流程分成兩步:先設定 AWS CLI 的憑證,再用它來幫 Docker 取得 ECR 的登入權限。

安裝並設定 AWS CLI

如果你還沒有安裝 AWS CLI,請先到 AWS CLI 官方頁面 下載並安裝。

安裝完成後,你需要設定你的 AWS 憑證:

aws configure

它會要求你輸入四個資訊:

項目說明
AWS Access Key ID你的存取金鑰 ID
AWS Secret Access Key你的私密存取金鑰
Default region name預設區域,例如 ap-northeast-1
Default output format輸出格式,填 json 即可
說明你的存取金鑰 ID
說明你的私密存取金鑰
說明預設區域,例如 ap-northeast-1
說明輸出格式,填 json 即可

這些金鑰可以在 AWS 主控台的 IAM 服務中建立。

用 docker login 登入 ECR

設定好 AWS CLI 之後,執行以下指令來登入 ECR:

aws ecr get-login-password --region <你的區域> | docker login --username AWS --password-stdin <你的AWS帳號ID>.dkr.ecr.<你的區域>.amazonaws.com

這串指令看起來很長,其實是兩個指令用 |(pipe)串在一起。

我們拆開來看:

區段說明
aws ecr get-login-password向 AWS 要一組臨時密碼
--region <你的區域>指定你的 ECR 在哪個區域
|把前面拿到的密碼,直接傳給後面的指令
docker login讓 Docker 登入到指定的 Registry
--username AWS使用者名稱固定填 AWS
--password-stdin密碼從前面的指令自動帶入,不用手動輸入
<你的AWS帳號ID>.dkr.ecr.<你的區域>.amazonaws.com你的 ECR 登入位址
說明向 AWS 要一組臨時密碼
說明指定你的 ECR 在哪個區域
說明把前面拿到的密碼,直接傳給後面的指令
說明讓 Docker 登入到指定的 Registry
說明使用者名稱固定填 AWS
說明密碼從前面的指令自動帶入,不用手動輸入
說明你的 ECR 登入位址

簡單來說,就是:「先跟 AWS 要一組臨時密碼,再用這組密碼讓 Docker 登入你的 ECR,這樣等一下 Docker 才有權限把 Image 推上去。」

把 <你的區域> 和 <你的AWS帳號ID> 替換成你自己的資訊。

舉個實際的例子:

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com

如果你看到 「Login Succeeded」 的訊息,就代表登入成功了。

這一步非常關鍵,如果登入失敗,後面的推送一定會失敗。

常見的失敗原因包括:AWS CLI 憑證過期、Region 不對、或是 IAM 使用者沒有 ECR 的權限。

docker tag:幫 Image 建立包含 ECR 位址的新名稱

登入成功之後,在推送之前,我們要先處理一件事:幫 Image 建立一個新的名稱。

為什麼要這樣做?因為 Docker Image 的名稱不是隨便取的,它有一套固定格式,用 / 和 : 來分隔不同的資訊:

[Registry 位址]/[Image 名稱]:[版本]

這個格式是 Docker 規定的,不能自己改順序或換符號。

因為 Docker 就是靠這個格式來解析:「這個 Image 存在哪個 Registry、叫什麼名字、是哪個版本。」

區段說明範例
Registry 位址Image 存放在哪個 Registry123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
Image 名稱這個映像檔叫什麼hello-world
版本哪一個版本latest、v1.0
說明Image 存放在哪個 Registry
範例123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
說明這個映像檔叫什麼
範例hello-world
說明哪一個版本
範例latest、v1.0

不過,這個格式裡的「Registry 位址」和「版本」都可以省略:

  • 省略 Registry 位址 → Docker 會預設指向 Docker Hub(Docker 官方的公開 Registry)
  • 省略版本 → Docker 會預設使用 latest

所以當我們前面執行 docker pull hello-world 時,Docker 其實是把它當成完整名稱來處理的:

但現在我們要推送到的是 AWS ECR,不是 Docker Hub。

如果你直接執行 docker push hello-world,Docker 會因為名稱裡沒有 Registry 位址,預設把它推到 Docker Hub 去,而不是你的 ECR。

所以我們需要幫這個 Image 建立一個包含 ECR 位址的完整名稱,這樣 Docker 才知道要推到 ECR。

docker tag 在做什麼?

雖然叫做「tag」,但它做的事情不只是改版本號。

docker tag 其實是幫一個 Image 建立一個「全新的完整名稱」。

它的結構是:

docker tag <目前的名稱> <新的完整名稱>

以我們的情況來說,就是把 hello-world 加上 ECR 的 Registry 位址,變成一個全新的名稱:

所以完整的指令會長這樣:

docker tag hello-world:latest <你的AWS帳號ID>.dkr.ecr.<你的區域>.amazonaws.com/hello-world:latest

執行完之後,畫面上可能不會顯示任何訊息,這是正常的。

你可以再次執行 docker images 來確認:

docker images

這時候你應該會看到多了一筆紀錄,REPOSITORY 欄位顯示的是完整的 ECR URI。

這就是你等一下要推送的那個 Image。

docker push:推送 Image 到 ECR

名稱準備好了,現在可以正式推送了。

推送的指令是 docker push,它的運作方式是:讀取 Image 名稱裡的 Registry 位址,然後把 Image 推到那個 Registry。

這也是為什麼前面要先用 docker tag 把 ECR 的位址寫進名稱裡——因為 docker push 就是靠名稱來決定推去哪裡的。

如果名稱裡沒有 Registry 位址(像是單純的 hello-world),Docker 會預設推到 Docker Hub(Docker 官方的公開 Registry),而不是你的 ECR。

現在我們的 Image 已經有了包含 ECR 位址的名稱,直接把它推上去就好。

docker push 的用法很單純:

docker push <重新命名後的 Image 名稱>

也就是把前面 docker tag 產生的那個新名稱,直接貼上來:

docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world:latest

推送過程中,你會看到進度條在跑。

完成後,你應該會看到類似「Pushed」和「latest: digest: sha256:…」的訊息。

這就代表推送成功了。

在 AWS 主控台確認 ECR 推送結果

回到 AWS 主控台,進入 ECR 服務。

點進你建立的 hello-world 儲存庫。

你應該會看到裡面多了一個 Image,標籤是 latest。

恭喜你,你已經成功把本機的 Docker Image 推送到 AWS ECR 了!

這個映像檔現在可以被其他 AWS 服務使用,例如 ECS(Elastic Container Service)或 EKS(Elastic Kubernetes Service)。

Docker Image 推送到 AWS ECR 完整流程小結

讓我們快速回顧一下整個流程:

  1. 安裝 Docker:下載並安裝 Docker CLI(和選配的 Docker Desktop)。
  2. 拉取 Image:用 docker pull hello-world 把映像檔下載到本機。
  3. 建立 ECR 儲存庫:在 AWS 主控台上建立一個 Private 的 ECR 儲存庫。
  4. 登入 ECR:用 aws ecr get-login-password 搭配 docker login 完成認證。
  5. 重新命名 Image:用 docker tag 幫 Image 建立一個包含 ECR 位址的新名稱。
  6. 推送 Image:用 docker push 把映像檔推送到 ECR。
  7. 確認結果:回到 AWS 主控台檢查 Image 是否出現在儲存庫中。

如果你的團隊需要更自動化的部署方式,可以考慮搭配 CI/CD pipeline(例如 AWS CodePipeline 或 GitHub Actions),讓每次程式碼更新時自動建置並推送 Image 到 ECR。

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

基礎概念

目錄

  • 什麼是 Container Registry?
  • Registry 的意思:登記讓別人能找到
  • 為什麼叫 Container Registry 而不是 Image Registry?
  • 安裝 Docker 環境
  • 用 docker pull 拉取測試用的 Docker Image
  • 建立 AWS ECR 儲存庫
  • 登入 AWS 管理主控台
  • 建立 ECR 儲存庫
  • 用 AWS CLI 登入 ECR 取得推送權限
  • 安裝並設定 AWS CLI
  • 用 docker login 登入 ECR
  • docker tag:幫 Image 建立包含 ECR 位址的新名稱
  • docker tag 在做什麼?
  • docker push:推送 Image 到 ECR
  • 在 AWS 主控台確認 ECR 推送結果
  • Docker Image 推送到 AWS ECR 完整流程小結