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 デスクトップの概要」にある 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. インスタンスに接続します。詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイドの「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 ユーザーガイドの「レジストリの認証」を参照してください。

    aws ecr get-login-password | docker login --username AWS --password-stdin 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 ECR にプッシュしたら、次のステップを検討する必要があります。