Amazon ECS で使用するコンテナイメージの作成  - Amazon Elastic Container Service

Amazon ECS で使用するコンテナイメージの作成 

Amazon ECS は、タスク定義で Docker イメージを使用して、コンテナを起動します。Docker は、コンテナ内の分散アプリケーションの構築、実行、テスト、デプロイするためのツールを提供するテクノロジーです。Docker には、Amazon ECS にコンテナをデプロイするためのチュートリアルが用意されています。詳細については、「Deploying Docker containers on Amazon ECS( Amazon ECSでDocker コンテナのデプロイする) を参照してください。

ここでは、最初の Docker イメージを作成し、そのイメージを Amazon ECS タスク定義で使用するために、コンテナレジストリである Amazon ECR にプッシュするステップを説明します。このチュートリアルは、Docker の概念と機能を基本的に理解していることを前提としています。Docker の詳細については、「Docker とは」、「Docker の概要」を参照してください。

重要

AWS と Docker が協力して、Docker ツールを使用して直接 Amazon ECS にコンテナをデプロイおよび管理できる、簡素化されたデベロッパーエクスペリエンスを構築しました。これで、Docker Desktop と Docker Compose を使用してコンテナをローカルで構築およびテストした後、Fargate. の Amazon ECS にコンテナをデプロイできるようになります。Amazon ECSと Docker 統合を開始するには、Docker Desktop をダウンロードし、オプションで Docker ID にサインアップします。詳細については、「Docker Desktop」と「Docker ID サインアップ」を参照してください。

前提条件

開始する前に、以下の前提条件を満たしていることを確認します。

  • Amazon ECR のセットアップステップを完了したことを確認します。詳細については、Amazon Elastic Container Registry ユーザーガイドの「Amazon ECR の設定」を参照してください。

  • ユーザーは、Amazon ECR サービスにアクセスし、使用するために必要な IAM 権限を持ちます。詳細については、「Amazon ECRマネージドポリシー」を参照してください。

  • Docker をインストールします。Amazon Linux 2 の Docker インストールステップについては、「Amazon Linux2 に 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 Desktop は、Mac または Windows 環境に簡単にインストールできるアプリケーションです。これにより、コンテナ化されたアプリケーションとマイクロサービスの構築および共有ができます。Docker Desktop には、Docker Engine、Docker CLI クライアント、Docker Compose、および Amazon ECS で Docker を使用するときに役立つその他のツールが含まれています。使用するオペレーティングシステムに Docker Desktop をインストールする方法の詳細については、「Docker Desktop の概要」を参照してください。

Amazon EC2 インスタンスに Docker をインストールするには
  1. Amazon Linux 2 AMI を使用してインスタンスを起動します。詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイドの「インスタンス起動ウィザードを使用したインスタンスの起動」を参照してください。

  2. SSH を使用してインスタンスに接続します。詳細については、「Linux インスタンス用 Amazon EC2 ユーザーガイド」の「SSH を使用した Linux インスタンスへの接続」を参照してください。

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

    sudo yum update -y
  4. 最新の Docker Engine パッケージをインストールします。

    sudo amazon-linux-extras install docker
    重要

    このステップでは、インスタンスに Amazon Linux 2 AMI を使用していることを前提としています。他のすべてのオペレーティングシステムについては、「Docker デスクトップの概要」を参照してください。

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

    sudo service docker start

    (オプション) システム再起動のたびに Docker デーモンを確実に起動できるように、次のコマンドを実行します。

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

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

  8. 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 イメージを作成するには
  1. Dockerfile という名前のファイルを作成します。Dockerfile は、Docker イメージに使用する基本イメージと、そのイメージにインストールして実行するものを記述するマニフェストです。Dockerfile の詳細については、「Dockerfile リファレンス」を参照してください。

    touch Dockerfile
  2. 前の手順で作成した Dockerfile を編集し、以下のコンテンツを追加します。

    FROM ubuntu:18.04 # Install dependencies RUN apt-get update && \ apt-get -y install apache2 # Install apache and write hello world message RUN echo 'Hello World!' > /var/www/html/index.html # Configure apache RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \ echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \ echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh

    この Dockerfile は Ubuntu 18.04 イメージを使用します。RUN の手順により、パッケージキャッシュが更新され、ウェブ サーバー用のいくつかのソフトウェアがインストールされてから、「Hello World!」 のコンテンツがウェブサーバーのドキュメントルートに書き込みされます。EXPOSE の命令はコンテナ上のポート 80 を公開し、CMD の命令はウェブサーバーを起動します。

  3. Dockerfile から Docker イメージを作成します。

    注記

    Docker の一部のバージョンでは、下に示す相対パスの代わりに、次のコマンドで Dockerfile への完全パスが必要になる場合があります。

    docker build -t hello-world .
  4. docker images を実行して、イメージが正しく作成されたことを確認します。

    docker images --filter reference=hello-world

    出力:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              e9ffedc8c286        4 minutes ago       241MB
  5. 新しく構築されたイメージを実行します。-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 server's fully qualified domain name" メッセージは無視できます。

  6. ブラウザーを開き、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!」が確認できます。表示されます。

  7. [Ctrl + C] キーを押して、Docker コンテナを停止します。

Amazon Elastic Container Registry にイメージをプッシュします

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

イメージにタグを付け、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"
        }
    }
  2. 前のステップの repositoryUri の値で hello-world イメージにタグを付けます。

    docker tag hello-world aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
  3. aws ecr get-login-password コマンドを実行します。認証先のレジストリ URI を指定します。詳細については、Amazon Elastic Container Registry ユーザーガイドの「レジストリの認証」を参照してください。

    docker login -u AWS -p $(aws ecr get-login-password --region REGION) aws_account_id.dkr.ecr.REGION.amazonaws.com

    出力:

    Login Succeeded
    重要

    エラーが発生した場合は、AWS CLI の最新バージョンをインストールまたはアップグレードします。詳細については、AWS Command Line Interface ユーザーガイドの「AWS Command Line Interface のインストール」を参照してください。

  4. 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 --region region --force

次のステップ

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

コンテナイメージを作成し、Amazon ECR にプッシュしたら、以下の次のステップを検討する必要があります。