

# Amazon ECS で使用するコンテナイメージの作成　
<a name="create-container-image"></a>

Amazon ECS は、タスク定義で Docker イメージを使用して、コンテナを起動します。Docker は、コンテナ内の分散アプリケーションの構築、実行、テスト、デプロイするためのツールを提供するテクノロジーです。

Amazon ECS は、コンテナ化されたアプリケーションをコンテナインスタンスまたは AWS Fargate にスケジュールします。コンテナ化されたアプリケーションは、コンテナイメージとしてパッケージ化されます。この例では、ウェブサーバーのコンテナイメージを作成します。

最初の Docker イメージを作成し、そのイメージを Amazon ECS タスク定義で使用するために、コンテナレジストリである Amazon ECR にプッシュできます。このチュートリアルは、Docker の概念と機能を基本的に理解していることを前提としています。Docker の詳細については、「[Docker とは](https://aws.amazon.com/docker/)」および「[Docker ドキュメント](https://docs.docker.com/get-started/docker-overview/)」を参照してください。

## 前提条件
<a name="create-container-image-prerequisites"></a>

開始する前に、以下の前提条件を満たしていることを確認します。
+ Amazon ECR のセットアップステップを完了したことを確認します。詳細については、「*Amazon Elastic Container Registry ユーザーガイド*」の「[Amazon でのライフサイクルを通じたイメージの移動 ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)」を参照してください。
+ ユーザーは、Amazon ECR サービスにアクセスし、使用するために必要な IAM 権限を持ちます。詳細については、「[Amazon ECRマネージドポリシー](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security-iam-awsmanpol.html)」を参照してください。
+ Docker をインストールします。Amazon Linux 2023 の Docker インストールステップについては、「[AL2023 に Docker をインストールする](#create-container-image-install-docker)」を参照してください。他のすべてのオペレーティングシステムについては、[[Docker Desktop overview]](https://docs.docker.com/desktop/) (Docker デスクトップの概要) の Docker ドキュメントを参照してください。
+ AWS CLI がインストールされ、設定されている。詳細については、「*AWS Command Line Interfaceユーザーガイド*」の「[AWS CLI の最新バージョンのインストールまたは更新](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」を参照してください。

ローカル開発環境がない、または不要で、Amazon EC2 インスタンスを使って Docker を使用したい場合は、Amazon Linux 2023 を使用して Amazon EC2 インスタンスを起動し、Docker Engine と Docker CLI をインストールするためのステップを以下に示します。

### AL2023 に Docker をインストールする
<a name="create-container-image-install-docker"></a>

Docker は、Ubuntu のような最新の Linux ディストリビューションから macOS や Windows まで、さまざまなオペレーティングシステムで使用できます。特定のオペレーティングシステムに Docker をインストールする方法の詳細については、[Docker インストールガイド](https://docs.docker.com/engine/installation/#installation) を参照してください。

Docker を使用するには、ローカルの開発システムは必要ありません。Amazon EC2 をすでに使用している場合は、Amazon Linux 2023 インスタンスを起動し、Docker をインストールして開始できます。

Docker をインストール済みの場合は、この手順をスキップして「[Docker イメージの作成](#create-container-image-create-image)」に進んでください。

**Amazon Linux 2023 AMI を使用して Amazon EC2 インスタンスに Docker をインストールするには**

1. 最新の Amazon Linux 2023 AMI を使用してインスタンスを起動します。詳細については、「*Amazon EC2 ユーザーガイド*」の「[コンソールのインスタンス起動ウィザードを使用して EC2 インスタンスを起動する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)」を参照してください。

1. インスタンスに接続します。詳細については、「*Amazon EC2 ユーザーガイド*」の「[EC2 インスタンスへの接続](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect.html)」を参照してください。

1. インスタンスでインストールされているパッケージとパッケージキャッシュを更新します。

   ```
   sudo yum update -y
   ```

1. 最新の Docker Community Edition パッケージをインストールします。

   ```
   sudo yum install docker
   ```

1. Docker サービスを開始します。

   ```
   sudo service docker start
   ```

1. `ec2-user` を `docker` グループに追加すると、`sudo` を使用せずに Docker コマンドを実行できます。

   ```
   sudo usermod -a -G docker ec2-user
   ```

1. ログアウトし、再びログインして、新しい `docker` グループアクセス権限を取得します。これは、現在の SSH ターミナルウィンドウを閉じて、新しいウィンドウでインスタンスに再接続することで達成できます。新しい SSH セッションには適切な `docker` グループ権限があります。

1. `ec2-user` が `sudo` を使用せずに Docker コマンドを実行できることを確認します。

   ```
   docker info
   ```
**注記**  
場合によっては、Docker デーモンにアクセスするための `ec2-user` に対するアクセス権限を提供するため、インスタンスを再起動する必要があります。次のエラーが表示された場合は、インスタンスを再起動してください。  

   ```
   Cannot connect to the Docker daemon. Is the docker daemon running on this host?
   ```

## Docker イメージの作成
<a name="create-container-image-create-image"></a>

Amazon ECS のタスク定義では、コンテナイメージを使用してクラスター内のコンテナインスタンスでコンテナを起動します。このセクションでは、シンプルなウェブアプリケーションの Docker イメージを作成し、ローカルシステムまたは Amazon EC2 インスタンスでテストしてから、そのイメージを Amazon ECR コンテナレジストリにプッシュして、Amazon ECS タスク定義で使用できるようにします。

**シンプルなウェブアプリケーションの Docker イメージを作成するには**

1. `Dockerfile` という名前のファイルを作成します。Dockerfile は、Docker イメージに使用する基本イメージと、そのイメージにインストールして実行するものを記述するマニフェストです。Dockerfile の詳細については、「[Dockerfile リファレンス](https://docs.docker.com/reference/dockerfile/)」を参照してください。

   ```
   touch Dockerfile
   ```

1. 前の手順で作成した `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 2023 イメージを使用します。`RUN` の手順により、パッケージキャッシュが更新され、ウェブ サーバー用のいくつかのソフトウェアがインストールされてから、「Hello World\$1」 のコンテンツがウェブサーバーのドキュメントルートに書き込みされます。`EXPOSE` の命令でコンテナ上のポート 80 がリッスン中のものになり、`CMD` の命令でウェブサーバーが起動します。

1. <a name="sample-docker-build-step"></a>Dockerfile から Docker イメージを作成します。
**注記**  
Docker の一部のバージョンでは、下に示す相対パスの代わりに、次のコマンドで Dockerfile への完全パスが必要になる場合があります。  
[Apple Silicon](https://support.apple.com/en-gb/116943) などの ARM ベースのシステムでコマンドを実行する場合は、--platform オプション「--platform linux/amd64」を使用します。

   ```
   docker build -t hello-world .
   ```

1. コンテナイメージを一覧表示します。

   ```
   docker images --filter reference=hello-world
   ```

   出力:

   ```
   REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
   hello-world         latest              e9ffedc8c286        4 minutes ago       194MB
   ```

1. 新しく構築されたイメージを実行します。`-p 80:80` オプションは、コンテナ上の公開されたポート 80 をホストシステム上のポート 80 にマッピングします。

   ```
   docker run -t -i -p 80:80 hello-world
   ```
**注記**  
Apache ウェブサーバーからの出力はターミナルウィンドウに表示されます。"`Could not reliably determine the fully qualified domain name`" メッセージは無視できます。

1. ブラウザーを開き、Docker を実行している、コンテナのホストサーバーを参照します。
   + EC2 インスタンスを使用している場合、これはサーバーの [**Public DNS**] 値であり、SSH でインスタンスに接続するときに使用するアドレスと同じです。インスタンスのセキュリティグループでポート 80 上の受信トラフィックを許可していることを確認します。
   + Docker をローカルに実行している場合は、ブラウザで [http://localhost/](http://localhost/) を参照します。

   ウェブページに「Hello, World\$1」が確認できます。表示されます。

1. [**Ctrl \$1 C**] キーを押して、Docker コンテナを停止します。

## Amazon Elastic Container Registry にイメージをプッシュします
<a name="create-container-image-push-ecr"></a>

Amazon ECR は、AWS マネージドイメージレジストリサービスです。Docker CLI を使用して、Amazon ECR リポジトリ内のイメージをプッシュ、プル、および管理できます。Amazon ECR 製品の詳細、主なお客様導入事例、FAQ については、[Amazon Elastic コンテナレジストリ 製品の詳細ページ](https://aws.amazon.com/ecr)を参照してください。

**イメージにタグを付け、Amazon ECR にプッシュするには**

1. `hello-world` イメージを保存する Amazon ECR リポジトリを作成します。出力の `repositoryUri` に注目してください。

   `region` を、AWS リージョン に置き換えます (例えば `us-east-1`)。

   ```
   aws ecr create-repository --repository-name hello-repository --region region
   ```

   出力:

   ```
   {
       "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"
       }
   }
   ```

1. 前のステップの `repositoryUri` の値で `hello-world` イメージにタグを付けます。

   ```
   docker tag hello-world aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
   ```

1. **aws ecr get-login-password** コマンドを実行します。認証先のレジストリ URI を指定します。詳細については、*Amazon Elastic Container Registry ユーザーガイド*の「[レジストリの認証](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth)」を参照してください。

   ```
   aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
   ```

   出力:

   ```
   Login Succeeded
   ```
**重要**  
エラーが発生した場合は、AWS CLI の最新バージョンをインストールまたはアップグレードします。詳細については、「*AWS Command Line Interface ユーザーガイド*」の「[AWS CLI の最新バージョンをインストールまたは更新](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」を参照してください。

1. `repositoryUri`前のステップの値 を使用して、Amazon ECR にイメージをプッシュします。

   ```
   docker push aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
   ```

## クリーンアップ
<a name="create-container-image-cleanup"></a>

Amazon ECS タスク定義の作成、およびコンテナイメージを使用したタスク起動を続行するには、[次のステップ](#create-container-image-next-steps) に進んでください。Amazon ECR イメージの試用を終了したら、レポジトリを削除し、イメージストレージに対して課金されないようにします。

```
aws ecr delete-repository --repository-name hello-repository --region region --force
```

## 次のステップ
<a name="create-container-image-next-steps"></a>

タスク定義にはタスク実行ロールが必要です。詳細については、「[Amazon ECS タスク実行IAM ロール](task_execution_IAM_role.md)」を参照してください。

コンテナイメージを作成して Amazon ECR にプッシュしたら、そのイメージをタスク定義で使用できます。詳細については、以下のいずれかを参照してください。
+ [Fargate 用の Amazon ECS Linux タスクを作成する方法について説明します。](getting-started-fargate.md)
+ [Fargate 用の Amazon ECS Windows タスクを作成する方法について説明します。](Windows_fargate-getting_started.md)
+ [AWS CLI を使用して、Fargate 用の Amazon ECS Linux タスクを作成する](ECS_AWSCLI_Fargate.md)