Amazon ECS で使用するコンテナイメージの作成
Amazon ECS は、タスク定義で Docker イメージを使用して、コンテナを起動します。Docker は、コンテナ内の分散アプリケーションの構築、実行、テスト、デプロイするためのツールを提供するテクノロジーです。
ここでは、最初の Docker イメージを作成し、そのイメージを Amazon ECS タスク定義で使用するために、コンテナレジストリである Amazon ECR にプッシュするステップを説明します。このチュートリアルは、Docker の概念と機能を基本的に理解していることを前提としています。Docker の詳細については、「Docker とは
前提条件
開始する前に、以下の前提条件を満たしていることを確認します。
-
Amazon ECR のセットアップステップを完了したことを確認します。詳細については、Amazon Elastic Container Registry ユーザーガイドの「Amazon ECR の設定」を参照してください。
-
ユーザーは、Amazon ECR サービスにアクセスし、使用するために必要な IAM 権限を持ちます。詳細については、「Amazon ECRマネージドポリシー」を参照してください。
-
Docker をインストールします。Amazon Linux 2 の Docker インストールステップについては、「AL2023 に Docker をインストールする」を参照してください。他のすべてのオペレーティングシステムについては、[Docker Desktop overview]
(Docker デスクトップの概要) の Docker ドキュメントを参照してください。 -
AWS CLI がインストールされ、設定されている。詳細については、「AWS Command Line Interface ユーザーガイド」の「AWS Command Line Interface のインストール」を参照してください。
ローカル開発環境がない、または不要で、Amazon EC2 インスタンスを使って Docker を使用したい場合は、Amazon Linux 2 を使用してAmazon EC2 インスタンスを起動し、Docker Engine と Docker CLI をインストールするためのステップを以下に示します。
Docker は、Ubuntu のような最新の Linux ディストリビューションから macOS や Windows まで、さまざまなオペレーティングシステムで使用できます。特定のオペレーティングシステムに Docker をインストールする方法の詳細については、Docker インストールガイド
Docker を使用するには、ローカルの開発システムは必要ありません。Amazon EC2 をすでに使用している場合は、Amazon Linux 2023 インスタンスを起動し、Docker をインストールして開始できます。
Docker をインストール済みの場合は、この手順をスキップして「「Docker イメージの作成」」に進んでください。
Amazon Linux 2023 AMI を使用して Amazon EC2 インスタンスに Docker をインストールするには
-
最新の Amazon Linux 2023 AMI を使用してインスタンスを起動します。詳細については、「Amazon EC2 ユーザーガイド」の「Launching an instance」を参照してください。
-
インスタンスに接続します。詳細については、「Amazon EC2 ユーザーガイド」の「Linux インスタンスへの接続」を参照してください。
-
インスタンスでインストールされているパッケージとパッケージキャッシュを更新します。
sudo yum update -y
-
最新の Docker Community Edition パッケージをインストールします。
sudo yum install docker
-
Docker サービスを開始します。
sudo service docker start
-
ec2-user
をdocker
グループに追加すると、sudo
を使用せずに Docker コマンドを実行できます。sudo usermod -a -G docker ec2-user
-
ログアウトし、再びログインして、新しい
docker
グループアクセス権限を取得します。これは、現在の SSH ターミナルウィンドウを閉じて、新しいウィンドウでインスタンスに再接続することで達成できます。新しい SSH セッションには適切なdocker
グループ権限があります。 -
ec2-user
がsudo
を使用せずに Docker コマンドを実行できることを確認します。docker info
注記
場合によっては、Docker デーモンにアクセスするための
ec2-user
に対するアクセス権限を提供するため、インスタンスを再起動する必要があります。次のエラーが表示された場合は、インスタンスを再起動してください。Cannot connect to the Docker daemon. Is the docker daemon running on this host?
「Docker イメージの作成」
Amazon ECS のタスク定義では、Docker イメージを使用してクラスター内のコンテナインスタンスでコンテナを起動します。このセクションでは、シンプルなウェブアプリケーションの Docker イメージを作成し、ローカルシステムまたは Amazon EC2 インスタンスでテストしてから、そのイメージを Amazon ECR コンテナレジストリにプッシュして、Amazon ECS タスク定義で使用できるようにします。
シンプルなウェブアプリケーションの Docker イメージを作成するには
-
Dockerfile
という名前のファイルを作成します。Dockerfile は、Docker イメージに使用する基本イメージと、そのイメージにインストールして実行するものを記述するマニフェストです。Dockerfile の詳細については、「Dockerfile リファレンス」を参照してください。 touch Dockerfile
-
前の手順で作成した
Dockerfile
を編集し、以下のコンテンツを追加します。FROM public.ecr.aws/amazonlinux/amazonlinux:latest # Update installed packages and install Apache RUN yum update -y && \ yum install -y httpd # Write hello world message RUN echo 'Hello World!' > /var/www/html/index.html # Configure Apache RUN echo 'mkdir -p /var/run/httpd' >> /root/run_apache.sh && \ echo 'mkdir -p /var/lock/httpd' >> /root/run_apache.sh && \ echo '/usr/sbin/httpd -D FOREGROUND' >> /root/run_apache.sh && \ chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh
この Dockerfile は、Amazon ECR パブリックでホストされているパブリック Amazon Linux 2 イメージを使用します。
RUN
の手順により、パッケージキャッシュが更新され、ウェブ サーバー用のいくつかのソフトウェアがインストールされてから、「Hello World!」 のコンテンツがウェブサーバーのドキュメントルートに書き込みされます。EXPOSE
の命令でコンテナ上のポート 80 がリッスン中のものになり、CMD
の命令でウェブサーバーが起動します。 -
Dockerfile から Docker イメージを作成します。
注記
Docker の一部のバージョンでは、下に示す相対パスの代わりに、次のコマンドで Dockerfile への完全パスが必要になる場合があります。
docker build -t hello-world .
-
コンテナイメージを一覧表示します。
docker images --filter reference=hello-world
出力:
REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest e9ffedc8c286 4 minutes ago 194MB
-
新しく構築されたイメージを実行します。
-p 80:80
オプションは、コンテナ上の公開されたポート 80 をホストシステム上のポート 80 にマッピングします。docker run の詳細については、「Docker run reference」を参照してください。 docker run -t -i -p 80:80 hello-world
注記
Apache ウェブサーバーからの出力はターミナルウィンドウに表示されます。"
Could not reliably determine the fully qualified domain name
" メッセージは無視できます。 -
ブラウザーを開き、Docker を実行している、コンテナのホストサーバーを参照します。
-
EC2 インスタンスを使用している場合、これはサーバーの [Public DNS] 値であり、SSH でインスタンスに接続するときに使用するアドレスと同じです。インスタンスのセキュリティグループでポート 80 上の受信トラフィックを許可していることを確認します。
-
Docker をローカルに実行している場合は、ブラウザで http://localhost/
を参照します。 -
Windows または Mac コンピューターで docker-machine を使用している場合は、docker-machine ip コマンドを使用して Docker のホスト VirtualBox VM の IP アドレスを見つけ、
machine-name
を、使用中の Docker マシンの名前に置き換えます。docker-machine ip
machine-name
ウェブページに「Hello, World!」が確認できます。表示されます。
-
-
[Ctrl + C] キーを押して、Docker コンテナを停止します。
Amazon Elastic Container Registry にイメージをプッシュします
Amazon ECR はマネージド型 AWS Docker レジストリサービスです。Docker CLI を使用して、Amazon ECR リポジトリ内のイメージをプッシュ、プル、および管理できます。Amazon ECR 製品の詳細、主なお客様導入事例、FAQ については、Amazon Elastic コンテナレジストリ 製品の詳細ページ
イメージにタグを付け、Amazon ECR にプッシュするには
-
hello-world
イメージを保存する Amazon ECR リポジトリを作成します。出力のrepositoryUri
に注目してください。region
を、AWS リージョン に置き換えます (例えばus-east-1
)。aws ecr create-repository --repository-name
hello-repository
--regionregion
出力:
{ "repository": { "registryId": "
aws_account_id
", "repositoryName": "hello-repository", "repositoryArn": "arn:aws:ecr:region
:aws_account_id
:repository/hello-repository", "createdAt": 1505337806.0, "repositoryUri": "aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-repository" } } -
前のステップの
repositoryUri
の値でhello-world
イメージにタグを付けます。docker tag hello-world
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-repository
-
aws ecr get-login-password コマンドを実行します。認証先のレジストリ URI を指定します。詳細については、Amazon Elastic Container Registry ユーザーガイドの「レジストリの認証」を参照してください。
aws ecr get-login-password --region
region
| docker login --username AWS --password-stdinaws_account_id
.dkr.ecr.region
.amazonaws.com出力:
Login Succeeded
重要
エラーが発生した場合は、AWS CLI の最新バージョンをインストールまたはアップグレードします。詳細については、AWS Command Line Interface ユーザーガイドの「AWS Command Line Interface のインストール」を参照してください。
-
repositoryUri
前のステップの値 を使用して、Amazon ECR にイメージをプッシュします。docker push
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-repository
クリーンアップ
Amazon ECS タスク定義の作成、およびコンテナイメージを使用したタスク起動を続行するには、次のステップ に進んでください。Amazon ECR イメージの試用を終了したら、レポジトリを削除し、イメージストレージに対して課金されないようにします。
aws ecr delete-repository --repository-name
hello-repository
--regionregion
--force
次のステップ
タスク定義にはタスク実行ロールが必要です。詳細については、「Amazon ECS タスク実行IAM ロール」を参照してください。
コンテナイメージを作成して Amazon ECR にプッシュしたら、そのイメージをタスク定義で使用できます。詳細については、以下のいずれかを参照してください。