AWS ECRとは?料金・ECSとの違いとDockerイメージのpush手順【2026年版】
AWS ECR(Amazon Elastic Container Registry)は、Dockerコンテナイメージを保存・管理するためのフルマネージドなコンテナレジストリです。自前でレジストリサーバーを運用せずに、Amazon ECSやEKS、AWS Lambdaへそのままイメージを配布できます。この記事では、ECRの基本とECS・Docker Hubとの違い、料金、リポジトリ作成からdocker loginとイメージのpush・pull、そして運用で外せないライフサイクルポリシーまでを、ap-northeast-1(東京リージョン)の実コマンド付きで解説します。
まとめ:ECRの全体像と最短のpush手順
ECRはコンテナイメージ専用の倉庫で、Docker Hubの代わりにAWS内へイメージを置く場所だと考えると分かりやすいです。イメージを置く相手がECS・EKS・Lambdaなら、認証・権限・通信がすべてAWS内で完結するため、ECRが第一候補になります。
イメージをpushする流れは「リポジトリ作成 → get-login-passwordでログイン → build → tag → push」の4ステップです。最短のコマンドは次のとおりで、詳しい前提と各手順は本文で順に説明します。
| ステップ | コマンドの要点 |
|---|---|
| 1. ログイン | get-login-passwordでdocker login |
| 2. ビルド | docker build -t my-app . |
| 3. タグ付け | docker tag my-app:latest <ECR URI> |
| 4. プッシュ | docker push <ECR URI> |
AWS ECRの基本概念と主な特徴
ECRはAmazon Elastic Container Registryの略で、Dockerイメージ(およびOCIイメージ、Helmチャート)を保存するレジストリサービスです。レジストリ・リポジトリ・イメージの3階層で構成され、1つのAWSアカウントに対して既定のプライベートレジストリが1つ用意され、その中にリポジトリを複数作り、各リポジトリにタグ付きのイメージを格納します。
特徴は大きく3つです。第一に、サーバー管理が不要なフルマネージドである点。第二に、IAMポリシーで誰がどのリポジトリをpush・pullできるかを細かく制御できる点。第三に、ECS・EKS・Lambdaが認証情報なしで直接pullできる点。とくに3つ目が効くのは、デプロイ先がAWSにそろっている場合です。AWS外へ配るだけならDocker Hubでも足りますが、AWS内で完結するならECRが素直な選択になります。
用語の混同に注意したい点として、ECRは「イメージを置く場所」であり、イメージを「動かす場所」ではありません。動かす役割はECSやEKSが担います。この役割分担を次の章で整理します。
ECRとECS・EKS・Docker Hubとの違い
「ecr ecs 違い」で検索する人が多いとおり、ECRとECSは名前が似ていて混同されやすいサービスです。結論から言うと、ECRは保管庫、ECSは実行環境で、役割がまったく異なります。下表で対比します。
| サービス | 役割 | 扱う対象 |
|---|---|---|
| ECR | イメージの保存・配布 | コンテナイメージ |
| ECS | コンテナの実行・運用 | 稼働中のコンテナ |
| EKS | Kubernetesでの実行 | 稼働中のPod |
実際のデプロイでは、ECRに置いたイメージをECSのタスク定義やEKSのマニフェストから参照します。つまりECRとECSは競合ではなく、ECR→ECSの順で連携する関係です。ECS側の詳細はAWSのコンテナオーケストレーションサービスECSの解説記事で扱っています。
保管庫としての比較相手はDocker Hubです。Docker Hubは公開イメージの入手に強く、オープンソースの公式イメージはまずここから取得します。一方、自社の非公開イメージをAWS上のECS・EKSへ配布するならECRが有利です。理由は、Docker Hubの匿名pullに課されるレート制限を避けられること、そしてイメージ転送がAWSネットワーク内で完結することの2点にあります。社外公開しない業務用イメージはECR、汎用の公開イメージはDocker Hub、と使い分けるのが実務上の基本です。Azure側の対応物として、Azure Container Registry(ACR)の仕組みと料金プランを解説した記事と読み比べると、どのクラウドのレジストリに寄せるかの判断材料になります。
ECRの料金体系(無料枠・ストレージ・データ転送)
ECRの課金はシンプルで、保存したイメージのストレージ量と、AWS外へ出ていくデータ転送量で決まります。プライベートリポジトリのストレージは1GBあたり月0.10USDで、新規アカウントには12か月間・月500MBまでの無料枠があります(Amazon ECR Pricing、2026年時点)。
転送料金は方向で変わります。同一リージョン内のAWSサービス(同リージョンのECSなど)へのpullは転送料金がかからない一方、インターネット向けの送信データには通常のAWSデータ転送料金が発生します。デプロイ先のECSとECRのリージョンを揃えるだけで、転送コストもレイテンシも下げられるということです。
2026年1月以降は、同一リージョンの同一プライベートレジストリ内で、共通レイヤーをリポジトリ間で共有できるようになりました。50個のマイクロサービスが共通のベースイメージを使う場合でも、共有されたベースレイヤーは1回分のストレージ課金で済みます。料金の最新値と各リージョンの差は変動するため、見積もりの最終確認は公式の料金ページで行ってください。
ECRリポジトリの作成手順(コンソール/AWS CLI)
イメージをpushする前に、受け皿となるリポジトリを作成します。GUIで作るならマネジメントコンソールのECR画面で「リポジトリを作成」を選び、リポジトリ名を入力するだけです。手順を自動化したい場合はAWS CLIが速く、次のコマンドで東京リージョンに作成できます。
aws ecr create-repository --repository-name my-app --region ap-northeast-1
作成後、後続のtag・pushで使うリポジトリURI(<account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/my-app の形式)を控えておきます。URIは次のコマンドで取得できます。
aws ecr describe-repositories --repository-names my-app --query "repositories[0].repositoryUri" --output text
事前条件はAWS CLIとDockerのインストール、そしてaws configureでの認証情報設定の3点です。CLIはget-login-passwordを使うためにバージョン2を推奨します(理由は次章で述べます)。
ECRへのログインとDockerイメージのpush手順
ここが本題で、GSC上でも「ecr push」「docker push」は順位が30位台にとどまり、最も改善余地が大きい領域です。ログインとpushを順に確実に押さえます。
aws ecr get-login-passwordによるdocker login
ECRへの認証は、一時パスワードを発行するget-login-passwordをdocker loginにパイプする方法が標準です。発行されるトークンは12時間有効で、期限が切れたら再実行します(AWS公式 get-login-password リファレンス)。このコマンドはAWS CLIバージョン2、またはバージョン1なら1.17.10以降で利用できます。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com
「Login Succeeded」と表示されれば成功です。旧来のaws ecr get-loginはパスワードがコマンド履歴に残るなどのリスクがあり、現在はget-login-passwordに置き換えるのが推奨です。CI/CDの中で毎回ログインを自動化する場合も、この1行をスクリプト先頭に置くだけで済みます。
docker build・tag・pushの手順
ログイン後は、ローカルでイメージをビルドし、ECRのURIをタグとして付与してからpushします。タグ付けを忘れるとpush先がDocker Hubになってしまうため、URIの付与が要点です。
docker build -t my-app .
docker tag my-app:latest <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest
docker push <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest
pushが完了すると、コンソールのリポジトリ一覧に新しいタグのイメージが表示されます。CI/CDではlatest固定ではなく、コミットハッシュやビルド番号をタグに使うとロールバックが容易になります。Dockerfileの書き方やイメージ最適化はDockerでFastAPIとReactをコンテナ化する解説記事が参考になります。
ECRからイメージをpullする手順
pushしたイメージを別環境で使うときはpullします。pull前にもget-login-passwordでのログインが必要で、ログイン済みであれば次の1行で取得できます。
docker pull <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest
誰でも使える公開イメージを配布したい場合は、プライベートのECRではなくAmazon ECR Publicを使います。ECR Publicのイメージはログイン不要でpullでき、たとえばAmazon Linuxの公式イメージは public.ecr.aws/amazonlinux/amazonlinux:latest のように取得します。社内配布はプライベート、広く配布したいOSSイメージはPublic、と置き場所を分けて考えます。
ECR運用のベストプラクティス(ライフサイクルポリシー・脆弱性スキャン)
pushできた後に放置するとストレージ課金が膨らみ、古い脆弱なイメージが残り続けます。競合記事の多くがpush手順で終わっている中で、運用の作り込みこそ差がつく部分です。最低限、次の2つは初期設定で入れておくことを推奨します。
1つ目はライフサイクルポリシーです。「タグなしイメージは1日後に削除」「同一プレフィックスのイメージは最新10世代のみ保持」といったルールを設定すると、古いイメージが自動で消え、ストレージコストが青天井になりません。マイクロサービスのように毎日pushする構成では、これが無いと半年でリポジトリが肥大化します。
2つ目はイメージスキャンです。ECRは脆弱性スキャン機能を備え、リポジトリで「プッシュ時スキャン」を有効化すると、pushのたびにベーシックスキャン(CVEベース)が走って既知脆弱性を検出します。より深い検査が必要なら、Amazon Inspectorと連携する拡張スキャンに切り替えます。「push後にCriticalな脆弱性が出たらデプロイを止める」という運用を組み込めば、脆弱なイメージが本番へ流れるのを防げます。デプロイ自動化と組み合わせるなら、AWSが移行先として案内するECS Express Modeでデプロイを自動化する解説記事が出発点になります(旧来のAWS Copilotは2026年6月12日にサポート終了済みのため、新規採用は避け参考にとどめてください)。
ECRのpush・loginでよくあるエラーと対処
つまずきやすいのは認証とリージョンの2点に集中します。代表的なエラーと原因を整理します。
| 症状 | 主な原因 | 対処 |
|---|---|---|
| no basic auth credentials | 未ログイン/トークン期限切れ | get-login-passwordを再実行 |
| get-login-passwordが無い | AWS CLIが古い | CLIをv2へ更新 |
| denied / not authorized | IAM権限不足 | ecr:対象権限をポリシー付与 |
| repository does not exist | リージョン違い/未作成 | –regionとURIを再確認 |
とくに多いのが、ログインしたリージョンとpush先URIのリージョンが食い違うケースです。aws --versionでCLIのバージョンを、aws sts get-caller-identityで使っているアカウントを確認すると、原因の切り分けが速く済みます。トークン期限切れは時間経過で必ず起きるので、CI/CDでは毎回ログインから始める前提で組んでおくと安定します。
よくある質問
ECRとECSの違いは何ですか?
ECRはコンテナイメージを保存・配布するレジストリで、ECSはそのイメージを実際に動かす実行サービスです。役割が分かれており、ECRに置いたイメージをECSのタスク定義から参照してデプロイする、という連携で使います。両者は競合せず、ECR→ECSの順で組み合わせます。
ECRの料金はいくらですか?無料枠を超えると高いですか?
プライベートリポジトリのストレージは1GBあたり月0.10USDで、新規アカウントは12か月間・月500MBまで無料です。無料枠を超えても、たとえば常時10GBを保存して月1USD程度とストレージ自体は小さく、コストは主にインターネット向けのデータ転送が占めます。同一リージョンのAWSサービスへのpullは転送無料なので、ECSとリージョンを揃えるのがコスト面の基本です。最新の正確な金額は公式の料金ページで確認してください。
get-login-passwordとget-loginはどちらを使うべきですか?
get-login-passwordを使います。旧来のget-loginはパスワードがコマンド履歴に残るなどのリスクがあり、現在は非推奨です。get-login-passwordはAWS CLIバージョン2(またはv1.17.10以降)で利用でき、標準入力経由でDockerに渡すためより安全です。
docker loginのトークンはどれくらい有効ですか?
ECRの認証トークンは発行から12時間有効です。期限が切れると「no basic auth credentials」などのエラーになるため、再度get-login-passwordを実行してログインし直します。CI/CDではジョブ実行のたびにログインから始める構成にしておくと安定します。
ECR Publicとプライベートリポジトリの違いは何ですか?
プライベートリポジトリはIAMで権限管理された非公開のイメージ置き場で、社内やAWS内のデプロイに使います。ECR Publicは誰でもログイン不要でpullできる公開ギャラリーで、OSSイメージの配布に向きます。社外公開しないイメージはプライベート、広く配布したいイメージはPublic、と使い分けます。