メニュー
Amazon Elastic Container Service
開発者ガイド (API バージョン 2014-11-13)

Amazon ECS における Docker の基本

Docker は、Linux コンテナに基づいた分散アプリケーションの構築、実行、テスト、デプロイを可能にするテクノロジーです。 Amazon ECS は、タスク定義の Docker イメージを使用して、クラスター内の EC2 インスタンスでコンテナを起動します。Amazon ECS 製品の詳細、主なお客様導入事例、FAQ については、Amazon Elastic Container Service 製品の詳細ページを参照してください。

このガイドのドキュメントは、読者が Docker の概念と機能を基本的に理解していることを前提としています。Docker の詳細については、「Docker とは」および「Docker の概要」を参照してください。

Docker のインストール

注記

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

Docker は、Ubuntu のような最新の Linux ディストリビューションから Mac OSX や Windows まで、さまざまなオペレーティングシステムで使用できます。特定のオペレーティングシステムに Docker をインストールする方法の詳細については、Docker インストールガイド を参照してください。

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

Amazon Linux インスタンスに Docker をインストールするには

  1. Amazon Linux AMI でインスタンスを起動します。詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイド の 「インスタンスの起動」を参照してください。

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

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

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

    sudo yum install -y docker
  5. Docker サービスを開始します。

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

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

  8. ec2-usersudo を使用せずに 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 イメージを作成し、ローカルシステムまたは EC2 インスタンスでテストしてから、コンテナレジストリ (Amazon ECR や Docker Hub など) にプッシュして、ECS タスク定義で使用できるようにします。

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

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

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

    FROM ubuntu:12.04 # Install dependencies RUN apt-get update -y RUN apt-get install -y apache2 # Install apache and write hello world message RUN echo "Hello World!" > /var/www/index.html # Configure apache RUN a2enmod rewrite RUN chown -R www-data:www-data /var/www ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 EXPOSE 80 CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

    この Dockerfile は Ubuntu 12.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 258MB
  5. 新しく構築されたイメージを実行します。-p 80:80 オプションは、コンテナ上の公開されたポート 80 をホストシステム上のポート 80 にマッピングします。docker run の詳細については、「Docker run リファレンス」を参照してください。

    docker run -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!」がstatement.

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

(オプション) イメージの Amazon Elastic Container Registry へのプッシュ

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

注記

このセクションでは AWS CLI が必要です。AWS CLI がシステムにインストールされていない場合は、AWS Command Line Interface ユーザーガイド の「AWS コマンドラインインターフェースのインストール」を参照してください。

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

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

    aws ecr create-repository --repository-name hello-world

    出力:

    { "repository": { "registryId": "aws_account_id", "repositoryName": "hello-world", "repositoryArn": "arn:aws:ecr:us-east-1:aws_account_id:repository/hello-world", "createdAt": 1505337806.0, "repositoryUri": "aws_account_id.dkr.ecr.us-east-1.amazonaws.com/hello-world" } }
  2. 前のステップの repositoryUri の値で hello-world イメージにタグを付けます。

    docker tag hello-world aws_account_id.dkr.ecr.us-east-1.amazonaws.com/hello-world
  3. aws ecr get-login --no-include-email コマンドを実行して、レジストリ用の docker login 認証コマンド文字列を取得します。

    注記

    get-login コマンドは AWS CLI のバージョン 1.9.15 以降で利用できます。ただし、Docker の最新バージョン (17.06 以降) を使用している場合は、バージョン 1.11.91 以降をお勧めします。AWS CLI のバージョンは、aws --version コマンドを使用して確認できます。Docker のバージョン 17.06 以降を使用している場合は、get-login の後に --no-include-email オプションを含めます。Unknown options: --no-include-email エラーが返された場合は、AWS CLI の最新バージョンをインストールします。詳細については、AWS Command Line Interface ユーザーガイド の「AWS コマンドラインインターフェイスのインストール」を参照してください。

    aws ecr get-login --no-include-email
  4. 前のステップで返された docker login コマンドを実行します。このコマンドは、12 時間有効な認証トークンを提供します。

    重要

    docker login コマンドを実行すると、システムの他のユーザーに対して、プロセスリスト表示 (ps -e) でコマンド文字列が表示されます。docker login コマンドには認証情報が含まれているため、システムの他のユーザーがこのようにして認証情報を表示し、それを使ってレポジトリへのプッシュおよびプル権限を取得するリスクがあります。安全なシステムを使用していない場合は、このリスクを考慮してください。-p password オプションを省略してインタラクティブにログインし、求められたときにパスワードを入力することを検討してください。

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

    docker push aws_account_id.dkr.ecr.us-east-1.amazonaws.com/hello-world

次のステップ

イメージのプッシュが完了したら、イメージを、タスクの実行に使用する Amazon ECS タスク定義に登録できます。

注記

このセクションでは AWS CLI が必要です。AWS CLI がシステムにインストールされていない場合は、AWS Command Line Interface ユーザーガイド の「AWS コマンドラインインターフェースのインストール」を参照してください。

hello-world イメージをタスク定義に登録するには

  1. 次の内容で hello-world-task-def.json という名前のファイルを作成し、repositoryUriimage フィールドの前のセクションから置き換えます。

    { "family": "hello-world", "containerDefinitions": [ { "name": "hello-world", "image": "aws_account_id.dkr.ecr.us-east-1.amazonaws.com/hello-world", "cpu": 10, "memory": 500, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "entryPoint": [ "/usr/sbin/apache2", "-D", "FOREGROUND" ], "essential": true } ] }
  2. タスク定義を hello-world-task-def.json ファイルに登録します。

    aws ecs register-task-definition --cli-input-json file://hello-world-task-def.json

    タスク定義は、JSON ファイルで定義されている hello-world ファミリに登録されます。

hello-world タスク定義を使用してタスクを実行するには

重要

Amazon ECS でタスクを実行する前に、コンテナインスタンスをデフォルトクラスターで起動する必要があります。コンテナインスタンスの設定およびセットアップ方法の詳細については、「Amazon ECS でのセットアップ」と「Fargate を使用した Amazon ECS の使用開始」を参照してください。

  • 以下の AWS CLI コマンドで、hello-world タスク定義を使用してタスクを実行します。

    aws ecs run-task --task-definition hello-world