你已經在本機上建好了一個 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」來建立一個新的儲存庫。
你需要填寫以下資訊:
其他設定維持預設即可,然後點擊「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拆開來看每一段的意思:
這個 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 主控台的 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 要一組臨時密碼,再用這組密碼讓 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 位址」和「版本」都可以省略:
- 省略 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 完整流程小結
讓我們快速回顧一下整個流程:
- 安裝 Docker:下載並安裝 Docker CLI(和選配的 Docker Desktop)。
- 拉取 Image:用
docker pull hello-world把映像檔下載到本機。 - 建立 ECR 儲存庫:在 AWS 主控台上建立一個 Private 的 ECR 儲存庫。
- 登入 ECR:用
aws ecr get-login-password搭配docker login完成認證。 - 重新命名 Image:用
docker tag幫 Image 建立一個包含 ECR 位址的新名稱。 - 推送 Image:用
docker push把映像檔推送到 ECR。 - 確認結果:回到 AWS 主控台檢查 Image 是否出現在儲存庫中。
如果你的團隊需要更自動化的部署方式,可以考慮搭配 CI/CD pipeline(例如 AWS CodePipeline 或 GitHub Actions),讓每次程式碼更新時自動建置並推送 Image 到 ECR。