はじめに
AWSのサービス群の中で、Amazon Elastic Container Registry (ECR) は、Dockerイメージを安全に保存・共有するための強力なツールです。
ECRを使用することで、オンプレミスやクラウドのインフラにまたがって効率的にコンテナアプリケーションをデプロイできます。
この記事では、ECRの学習を始めたばかりの私が、将来の自分への備忘録として、学んだことをまとめていきます。
ECRについて
Amazon Elastic Container Registry (ECR) は、完全マネージド型のコンテナレジストリサービスです。
引用画像:https://zenn.dev/yoshii0110/articles/1de56128d7be2c
さらに詳しく学習されたい方は、AWSの公式サイトをご参照ください。
主な機能
ECRの主な機能は以下の通りです。
-
イメージの保存と管理
Dockerイメージを安全に保存し、アクセス制御も容易です。 -
セキュリティ
AWS Identity and Access Management (IAM) を使って、細かなアクセス制御が可能です。 -
高可用性と統合性
他のAWSサービス(CodePipeline、CodeBuildなど)とスムーズに連携できます。
ユースケース
ECRの利用例として、以下のシナリオがあります。
- CI/CDパイプラインでのイメージ管理
- 複数環境でのDockerイメージ共有
- コンテナアプリケーションのセキュアなデプロイメント
レポジトリの作成
ECRにDockerイメージを保存するには、まずレポジトリを作成する必要があります。
AWSコンソールで「ECR」サービスにアクセスし、「レポジトリを作成」をクリックします。
(ここでは、プライベートレポジトリを作成します。)
「レポジトリ名」に任意の名前を入力(例: my-app-repo
)し、必要に応じてオプション(暗号化、イミュータブル設定)を設定します。
ここでは、特に変更せずデフォルト設定で作成します。
余談ですが、CLIを使ってレポジトリを作成する場合は、以下のコマンドを使用します。
aws ecr create-repository --repository-name my-app-repo
これで、ECR上に空のレポジトリが作成されていることが確認できました。
Dockerイメージのプッシュとプル
ここでは、以下のようなプロジェクト構成を使用します。
├── Dockerfile
└── html/
└── index.html
CloudShellを使用して、以下のようなシンプルなDockerfileを作成します。
FROM nginx:latest
COPY ./html /usr/share/nginx/html
/usr/share/nginx/html
は、nginxのデフォルトの静的コンテンツディレクトリです。
次に、以下のようなサンプルHTMLファイルを準備します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Web App</title>
</head>
<body>
<h1>Welcome to My Web App!</h1>
</body>
</html>
その後、以下のコマンドを使用してDockerイメージをビルドします。
docker build -t my-app .
ECRにログイン
CloudShellを使用して、ECRにログインします。
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account_id>.dkr.ecr.<region>.amazonaws.com
リージョンやアカウントIDは、ご自身のものに置き換えてください。
例えば、以下のように実行します。
[cloudshell-user@ip-10-134-28-216 ~]$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxx.dkr.ecr.ap-northeast-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /home/cloudshell-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
ECRへのログインが成功し、Login Succeeded
と表示されることが確認できました!
Dockerイメージをプッシュ
ECRにDockerイメージをプッシュするには、まずイメージにタグを付けます。
docker tag my-app:latest <account_id>.dkr.ecr.<region>.amazonaws.com/my-app-repo:latest
リージョンやアカウントIDは、ご自身のものに置き換えてください。
タグ付けが完了したら、次にそのイメージをECRにプッシュします。
docker push <account_id>.dkr.ecr.<region>.amazonaws.com/my-app-repo:latest
ここでは、CloudShellを使い作成したECRのリポジトリにプッシュしています。
ECRのサービス画面からも、正常にプッシュされていることが確認できました。
ECRからローカル環境にDockerイメージをpull
ここでは、AWS CLIのインストールと設定、およびECRへのログインが完了していることを前提に進めます。
ECRに保存されたイメージを別の環境で使用するには、以下のコマンドを実行してプルします。
docker pull <account_id>.dkr.ecr.<region>.amazonaws.com/my-app-repo:latest
これで、プライベートリポジトリから my-app-repo
の最新イメージが私のローカル環境のMacBookにダウンロードされます。
ダウンロードされたイメージを確認するには、以下のコマンドを実行して、ローカルのDockerイメージをリスト表示します。
docker images | grep my-app-repo
以下のように表示されれば、イメージが正常にpullされたことが確認できます。
ECRに保存したイメージを利用することで、他のAWSサービス(例: ECS、EKS)やローカル環境で簡単にコンテナを展開できます。
まとめ
AWSのクラウド環境では、コンテナを簡単に展開したりスケールさせたりできるので、今後の自分にも役立つと感じています。
次回は、ECRにプッシュしたイメージをECSにデプロイして、実際にコンテナ管理をさらに深掘りしていきます。
ECRとECSを組み合わせることで、もっとスムーズにコンテナを運用できるようになるので、継続してキャッチアップしていきたいです!
関連記事