ローカルPCでビルドしたDockerコンテナイメージをAmazon ECRにデプロイしてみた
手元の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
を作成し、実際にコンテナを起動させたいと思います。こちらの構成は、カレントディレクトリにDockerfile
とindex.html
が存在している状態になります。
. ├── Dockerfile └── index.html
Dockerfile
の内容は最小限にしてあります。元となるDockerイメージとしてApacheを使用しており、index.html
をコンテナ内のドキュメントルート直下にコピーしています。
FROM httpd:2.4 COPY ./index.html /usr/local/apache2/htdocs/
index.html
の内容も最小限にしています。カスタムのコンテナイメージだと分かるように、ECS用のコンテナだよ〜というテキストを残しています。
<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まで、ひととおりのコマンドを参照することができます。
実際にこちらの手順を繰り返し実行する場合、このコマンドを参照いただくと、作業効率も上がっていいと思います。では!