0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS CloudShellでDockerイメージを作成してAmazonECRプライべートリポジトリにpushしてみる

Last updated at Posted at 2024-12-26

記事の概要

コンテナで動くアプリケーションをAWSでデプロイするために、ECRへコンテナイメージをプッシュしなければいけない、というシチュエーションは度々あると思います。(AppRunnerとか)
今回は開発環境でDockerイメージを作成し、ECRプライベートリポジトリへプッシュするまでの手順を記載します。開発環境はCloudShellを使っていきます。

※ CloudShellのディスク容量は1GBで拡張もできないため、イメージのサイズが大きくなる場合は別の環境を利用する必要があります。 Cloud9…

それぞれ 1 GB の永続ストレージ AWS リージョン を無料で利用できます

出典:https://docs.aws.amazon.com/ja_jp/cloudshell/latest/userguide/limits.html

Amazon ECRプライベートの作成

push先のリポジトリがある場合はスキップしてよいですが、今回はリポジトリの作成から行います。

ECRの画面で 「Private registry」 の「repositories」を選択し、「リポジトリを作成」ボタンをクリック

image (4).png

任意のリポジトリ名を入力(プライベートなリソースなので重複などは気にしなくてよいです)

image (5).png

これで「作成」ボタンを作成するとリポジトリが作成されます。リポジトリ名がリンクになっているので、そこをクリックすると画面遷移して、リポジトリ内のイメージ一覧が表示されます。

image (10).png

今回はリポジトリ新規作成のため空っぽです。

開発環境(CloudShell)へのアクセス

ここからコンテナイメージ作成の準備です。Dockerを動かすための開発環境を用意する必要がありますが、今回ははじめからDockerコマンドが使えるCloudShellを使っていきます。
使い方は簡単で、AWSマネジメントコンソールの上部のバーにあるコマンドプロンプトっぽいアイコンをクリックします。

image (6).png

するとAWS上に自動でコンピューティング環境が用意され、AWSマネジメントコンソールの下部にターミナルが表示されます。
試しに docker --version を実行するとDockerがインストール済だと分かります。

自分のノートパソコンで実行しようとすると、Dockerをインストールするところからはじめる必要がありますが、CloudShellだとアイコンをクリックするだけで完了します。これでディスクサイズがもっと大きければ…

ソースコードの準備

今回はFlaskを使って簡単なWebサイトを公開するソースコードを用意します。ファイル名はapp.pyにしました。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
        str_out = '<h2>Hello world</h2>'
        return str_out
        
app.run(host='0.0.0.0',port=80)

app.pyファイルはローカル環境で作成してもいいですし、cloudshellで作成してもよいです。(cloudshellは cloud9と違って IDE機能がないのでローカル環境で作成するのがおすすめです)

ローカル環境で作成した場合、CloudShellのファイルアップロード機能でファイルをアップロードする必要がありますので忘れずに。
ターミナル右上の「アクション」ボタンをクリックすると「ファイルのアップロード」が選択できます。

image (7).png

Dockerイメージの作成

コンテナで動かすソースコードが準備できたので、コンテナイメージを作成するためのDockerfileを準備します。

Dockerfile

Dockerfileの記述は以下です。注意点として、app.pyのapp.run(host='0.0.0.0',port=80)で公開ポートとして80番を指定しているので、DockerfileのEXPOSE 80でも同じく80番を指定します。

#ベースイメージとして pythonn v3.12 を指定
FROM python:3.12

# 以降の RUN, CMDコマンドを実行する作業ディレクトリを指定
WORKDIR /app

# カレントディレクトリにあるファイルをコンテナ上の 「/app」 ディレクトリにコピー
ADD . /app

# Flaskインストール
RUN pip install flask

# ポートの指定
EXPOSE 80

# コンテナ起動時に実行するコマンドを指定
CMD ["python", "app.py"]

ECRのプッシュコマンドを実行する(Dockerイメージの作成~ECRへのプッシュ)

さて、ここからコマンドを実行してDockerイメージの作成とECRへのプッシュを行います。実は必要なコマンドはECRのリポジトリを表示したときの「プッシュコマンドを表示」をクリックすると表示されるようになっています。

image (10).png

このコマンドを一つずつ実行していけばOKです。

image (8).png

以下、簡単なコマンドの説明になります。

  • 1つめのコマンドはECRリポジトリへの認証を行っています。CloudShell上でイメージを作成したあと、ECRリポジトリへイメージをpushする(いわゆる書込み操作をする)ため認証が必要になります。
    aws ecr get-login-password —region <リージョン> | docker login —username AWS —password-stdin <アカウントID>.dkr.ecr.<リージョン>.amazonaws.com

  • 2つめのコマンドでCloudShell上でイメージを作成します。体感2,3分かかります。イメージが作成されていることを確認したい場合は、作成後にdocker image lsでイメージ一覧を確認できます
    docker build -t test .

  • 3つめのコマンドでは先ほど作成したイメージにタグを付与します。タグを付与しなくてもpushできるようですが、管理性の観点でイメージタグの付与が推奨されています
    docker tag test:latest <アカウントID>.dkr.ecr.<リージョン>.amazonaws.com/test:latest

  • 最後のコマンドでECRリポジトリへのpushを行っています。1分ほどかかるかと思います
    docker push <アカウントID>.dkr.ecr.<リージョン>.amazonaws.com/test:latest

ECRにイメージが追加されたことを確認する

「プッシュコマンド」の実行により、ECRリポジトリへイメージが追加されているはずなのでマネジメントコンソール上で確認してみます。

image (9)-1.png

先ほど空だったイメージ一覧にイメージが追加されており、latestタグが付与されていることが分かりました。


この記事はここまでとなります。

Next:
DockerイメージをAppRunnerにデプロイする▼
AWS AppRunnerを使ってAWS ECRに配置したDockerイメージをAWSにデプロイする

手動で行ったコマンド実行をCIっぽく自動化する▼
DockerイメージのビルドとAmazon ECRへのプッシュをCodeBuildで自動化する

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?