ローカルPCでビルドしたDockerコンテナイメージをAmazon ECRにデプロイしてみた

ローカルのPCでコンテナのイメージをビルドし、Amazon ECRのプライベートリポジトリにデプロイします。ECRのリポジトリ名とコンテナイメージ名を合わせるなど、実際にデプロイ作業を実施して手順を整理していきます。
2024.05.22

手元のPCでビルドしたコンテナイメージをAmazon ECRにデプロイしたい

おのやんです。

みなさん、AWSで独自のコンテナイメージを使いたいと思ったことはありませんか?私はあります。

Amazon ECS(以下、ECS)などのコンテナオーケストレーションサービスにタスクを追加する場合、Amazon ECR(以下、ECR)にデプロイしたイメージを元にコンテナを作成することが多いです。

今回、手元のPCにてApacheのイメージをビルドして、ECRにデプロイする機会がありましたので、そちらを紹介していきたいと思います。

Rancher Desktopについて

今回紹介するコンテナイメージデプロイ手順ですが、コンテナイメージのビルドの際に使用しているDockerコマンドはRancher Desktopのものとなります。

Rancher Desktopのコンテナランタイムはdockerdであり、コマンド実行時はnerdctlコマンドにdockerのエイリアスを当てているため、実際の処理はdocker-cliのものになります。Docker Desktopなどを経由して実行しているわけではない点、ご了承ください。

コンテナイメージを作成する

まずローカルのPCにてDockerfileを作成し、実際にコンテナを起動させたいと思います。こちらの構成は、カレントディレクトリにDockerfileindex.htmlが存在している状態になります。

.
├── Dockerfile
└── index.html

Dockerfileの内容は最小限にしてあります。元となるDockerイメージとしてApacheを使用しており、index.htmlをコンテナ内のドキュメントルート直下にコピーしています。

FROM httpd:2.4
 
COPY ./index.html /usr/local/apache2/htdocs/

index.htmlの内容も最小限にしています。カスタムのコンテナイメージだと分かるように、ECS用のコンテナだよ〜というテキストを残しています。

index.html

<h2>ECS test!</h2>

この状態で以下のコマンドを実行し、コンテナイメージをビルドして作成します。-t--tagの短縮形で、ビルドするイメージにタグ(名前)を付けるためのオプションです。この場合、タグとしてaws-test-apache-imageが指定されています。これにより、ビルドされたイメージはこの名前で識別されます。

また.はコンテキストのディレクトリを示しています。この場合、現在のディレクトリがビルドコンテキストとして使用されます。ビルドコンテキストには、Dockerfileと、そのDockerfileが参照するすべてのファイルが含まれるようになっています。

$ docker build -t aws-test-apache-image .

こちらを実行すると、Dockerによるコンテナイメージのビルドが始まります。正常にイメージが作成されると、このようなログが表示されます。

$ docker build -t aws-test-apache-image 
...
 => => extracting sha256:***************************************     0.1s
 => => extracting sha256:***************************************     0.7s
 => => extracting sha256:***************************************     0.0s
 => [2/2] COPY ./index.html /usr/local/apache2/htdocs/               0.1s
 => exporting to image                                               0.0s
 => => exporting layers                                              0.0s
 => => writing image sha256:***************************************  0.0s
 => => naming to docker.io/library/aws-test-apache-image

これでイメージを作成は完了です。実際にコンテナイメージが作成されているのが確認できます。

$ docker images          
REPOSITORY                                          TAG                    IMAGE ID       CREATED          SIZE
aws-test-apache-image                               latest                 ************   25 seconds ago   177MB

念のため、ローカルのPCでコンテナを起動できるか確認してみます。以下のコマンドを実行して、Apacheコンテナを起動します。これにより、aws-test-apache-imageのイメージを指定して、aws-test-apache-containerというコンテナを起動しています。

また、ローカルのPCのポート8080をコンテナ内のポート80にマッピングします。これにより、ローカルのPCでhttp://localhost:8080にアクセスすると、コンテナ内の80番ポートにリクエストが転送されます。

$ docker run -d --name aws-test-apache-container -p 8080:80 aws-test-apache-image

これにより、WebブラウザでHTMLが描画されていれば、正常にコンテナが動作しています。

コンテナイメージをECRにデプロイする

ローカルのPCにてコンテナイメージが作成できましたので、こちらをECRにデプロイしていきます。

今回はAWS CLIを使用してデプロイ作業を実施します。ローカルのPCにてAWS CLIの認証設定などは済んでいるものとします。詳しくはこちらのブログに詳しく書かれているので、よければ参考にしてください。

ECRのマネジメントコンソール画面にて、「リポジトリを作成」を押下します。

リポジトリは「プライベート」を選択しておきます。またリポジトリ名として、先ほど作成したコンテナイメージの名前であるaws-test-apache-imageを入力しておきます。

このようにリポジトリが作成できていたらOKです。

それでは、ローカルのPCでコマンドを実行して、コンテナイメージをリポジトリにpushします。

以下のコマンドを実行することで、ECRのログインパスワードを取得し、そのパスワードをDockerクライアントに渡してECRリポジトリにログインできるようになります。またDockerクライアントがECRリポジトリに対して認証され、イメージのプッシュやプルが可能になります。

$  aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com

Login Succeeded

次に、ローカルのPCに作成したDockerイメージに対して、ECRデプロイ用のタグを付与します。

$ docker tag aws-test-apache-image:latest <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/aws-test-apache-image:latest

実際にローカルPC中のコンテナイメージを見てみると、新しいタグを経由してさきほどのコンテナイメージを参照できるのがわかります。

$ docker images          

REPOSITORY                                                                TAG                    IMAGE ID       CREATED         SIZE
<コンテナID>.dkr.ecr.ap-northeast-1.amazonaws.com/aws-test-apache-image   latest                 ************   3 hours ago     177MB
aws-test-apache-image                                                     latest                 ************   3 hours ago     177MB

最後に、こちらのコマンドを実行してコンテナイメージをECRにpushしましょう。

% docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/aws-test-apache-image:latest

The push refers to repository [<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/aws-test-apache-image]
************: Pushed 
************: Pushed 
************: Pushed 
************: Pushed 
************: Pushed 
************: Pushed 
************: Pushed 
latest: digest: sha256:**************************************** size: 1779

こちらで、ECRにコンテナイメージをデプロイできました!

コマンドはECR画面からも分かる

実際にAWS上でリポジトリを作成してみると、コンテナイメージを作成からpushまで、ひととおりのコマンドを参照することができます。

実際にこちらの手順を繰り返し実行する場合、このコマンドを参照いただくと、作業効率も上がっていいと思います。では!