Dockerの運用が面倒な人に贈る、Amazon EC2 Container Service(ECS)を使ったフルマネージドな世界

  • 151
    いいね
  • 0
    コメント

DockerCon16が開催されていますね。Docker 1.12では、Dockerのクラスタリング機能(Docker Swarm)やオーバーレイネットワーキング、ロードバランシング、サービスディスカバリなどがDockerの基本機能に組み込まれ、おぉいよいよ肥大化してきたなぁと盛り上がっている皆さん、いかがお過ごしでしょうか。

Dockerコンテナは、よく落ちます。Dockerコンテナをまじめにプロダクション環境で動かそうとするためには、運用をしっかり考えないといけません。オーケストレーションツールを比較検討して導入し、コンテナの監視をおこない、ログを、、(続きを読む

正直、面倒です。なので、AWSのフルマネージドサービスを使ってみよう、そうしよう、という人のためのエントリーです。

対象読者

  • DockerコンテナのフルマネージドサービスECSを触ってみたい人
  • docker run , docker build ,docker psが分かる人
  • Dockerfileが読み書きできる人
  • AWSのEC2/ELBあたりが触れる人

AWSでのDockerコンテナ実行の3つのパターン

AWSでDockerコンテナを実行するには、ぱっと思いつくところで次の3つがあります。

EC2を使う

EC2でLinuxサーバが動作するインスタンスを立ち上げ、そこにDockerをインストールしてコンテナを動作させます。コンテナ群の統合管理はDocker MachineやDocker Swarmなどを組み合わせて構築するとか、Kubernetesなどを使えば、自前でシステム要件に応じた、いい感じの環境が構築できます。

ECSを使う

AWSが提供するDockerクラスタ管理マネージドサービスであるEC2 Container Service(ECS)を使ってDocker環境を構築できます。Dockerインストール済みのEC2インスタンスでECSエージェントを実行して利用します。マネージドサービスであるため、クラスタリングや監視などのインフラ構築の手間を省くことができます。

Elastic Beanstalkを使う

AWSが提供するPaaSサービスであるElastic Beanstalkを使ってDockerの実行環境を構築できます。EC2を使って単一のコンテナで実行することもできますし、ECSを使って複数のコンテナを管理することもできます。インフラの構築や運用だけでなく、アプリケーションの開発までサポートしています。

ecs-1.jpg

どの方法を使うかは、システム要件に応じて検討します。

めんどいシステム要件があり、Dockerの実行環境を詳細にカスタマイズしたいときは、EC2を使って自前でインフラ環境を構築する感じで。そのかわり、Dockerの知識に加えて、オートスケール/負荷分散/冗長化/監視/障害対応などのインフラ構築およびオーケストレーションに関する知識が必要になります。

ECSを使うと、GUIの操作だけでコンテナの実行環境が出来上がります。楽です。ただし、クラスタ構成などはAWSが提供するサービスに依存するため、ダウンタイムを最少に抑えたいなどめんどうな話がある場合は、お勧めしません。

Elastic Beanstalk を使えばアプリケーションの開発環境から本番環境での運用に至るすべてをサポートするため、新規アプリケーションを短期間でリリースする場合などはこれで。

EC2を使ってDockerを動かす手順についてはDocker公式サイトをみてください、ElasticBeanstalkを使う手順は後日Qiitaします。というわけで
ECSを使ってDockerクラスタを構築する手順を簡単に説明します。

Amazon EC2 Container Serviceとは

EC2 Container Service(以降ECS)とは、Amazon Web Servicesの仮想サーバ機能を提供するEC2を使ったDockerコンテナ管理のマネージドサービスです。

ECSの主な特徴はつぎのとおり。

  • マネージドクラスタ
    Dockerをマルチホスト環境で運用するときは、インフラ環境構築に加え、クラスタ管理ツール/監視ツールの使い方やシステム運用や障害対応など、多岐にわたるインフラ技術が必要になります。ECSを使うと、これらのインフラ技術をまとめてマネージドするサービスですので、インフラに関する深い知識や経験がなくても容易に高い可用性を持つクラスタ環境でコンテナを運用できます。

  • タスク定義による構成管理
    ECSではタスク定義と呼ばれるJSONテンプレートを使用して環境を定義できます。タスク定義では、Dockerのリポジトリとイメージ/メモリや CPUなどのハードウエア要件/データボリュームのストレージ/コンテナ間リンクなどを定義します。

  • スケジューリング機能
    ECSは、CPUやメモリなどのリソースと可用性要件に基づいてクラスタ全体にコンテナを配置するスケジューラーを備えています。たとえば、実行時間の長いアプリケーションやサービス/バッチジョブもスケジュールできます。

  • コンテナの自動復旧と負荷分散
    ECSは、コンテナに障害が発生したときに自動的に復旧されます。そのため、アプリケーションを実行するのに必要な数のコンテナを確保します。また、ECSはELBをつかってトラフィックをコンテナ全体に分散できます。

  • アプリケーションのデプロイ
    タスク定義を新しいバージョンに更新してアップロードすると、更新されたイメージを使用して新しいコンテナが自動的に開始されます。そして、古いバージョンを実行しているコンテナは自動的に停止します。これは楽。

  • コンテナ監視
    Amazon CloudWatchと連携して、CPU やメモリ使用の平均値と合計量を監視できます。コンテナやクラスタのスケールを拡張または縮小する際に、CloudWatchアラームを設定できます。

  • Dockerリポジトリのサポート
    Docker Hubだけでなく、任意のサードパーティ製またはプライベートの Dockerレジストリをサポートしています。イメージは、タスク定義でリポジトリを指定します。

ECSを使う上で、知っておくべきAWS用語

AWSを使う上で、避けて通れないのがAWS用語。覚えるしかない。

  • クラスタ(Cluster)
    タスクを実行するためのコンテナインスタンスの論理グループ

  • コンテナインスタンス(Container Instance)
    Amazon ECSエージェントが稼働するEC2インスタンス

  • タスク定義(Task Definition)
    CPU/メモリやコンテナ間のLinkなどを設定したコンテナの定義

  • タスク(Task)
    タスク定義を実体化したもの

  • コンテナ(Container)
    タスクにより生成されたDockerコンテナのこと

ECSをつかったDockerクラスタの構築

それでは、ECSを使って、Dockerのクラスタ環境を構築する手順を簡単に説明します。

1.ECSの起動

まず、AWSマネジメントコンソールにログインし、[コンピューティング]-[EC2 Container Service]を選択します。EC2 Container Serviceのサービス画面が表示されたら、[Get started]ボタンをクリックします。
aws_chap7_019.jpg

2.タスク定義

次に、タスク定義を作成します。まず、Task Definition Name(タスク定義の名前)を指定します。ここでは、適当に「web」という名前のタスク定義を作成します。次に、コンテナの定義をするため[Add Container Definition]ボタンをクリックします。Container Definitionでは、次の項目が設定できます。

設定項目 説明 設定例
Task definition name タスク定義の名前 docker-glassfish
Container name コンテナの名前 docker-glassfish
Image Docker Hub 上のDockerイメージ asashiho/docker-glassfish:1.0
MaximumMemory コンテナに割り当てる最大メモリ(MiB) 300
Port Mappings ホストとコンテナのポートマッピングを指定 8080:8080/tcp, 4848:4848/tcp

ここでは、表のとおり設定し、[NextStep]ボタンをクリックします。

イメージは、DockerHub上に公開されたもの(asashiho/docker-glassfish:1.0)をつかいますが、自分で好きなものを使っても大丈夫です。
aws_chap7_020.jpg

3.スケジューリングの定義

次にタスクのスケジューリングをおこなうサービス定義を行います。サービスの定義を次のように設定します。

設定項目 説明 設定例
Desired number of Tasks 実行したいタスクの数 2
Service Name サービス名 sample-docker

4.負荷分散の定義

負荷分散のためにELBを使用するかどうかを選択できます。今回は、ELBを使って負荷分散を行うため、次のとおり設定します。

設定項目 説明 設定例
Container name: host port コンテナのポート番号 docker-glassfish:8080
ELB protocol ELBのプロトコル HTTP
ELB port 負荷分散するポート番号 8080

5.IAMの設定

IAMの権限の設定で、[Service IAM role]を「ecsServiceRole」に設定したら[Next Step]ボタンをクリックします。
aws_chap7_023.jpg

6.クラスタの定義

次にクラスタの設定を行います。ECSでは、EC2をつかってDockerのクラスタ環境を作成しますので、クラスタを構成するEC2の設定を以下の感じで。

設定項目 説明 設定例
Cluster name クラスタ名 default
EC2 Instance Type EC2のインスタンスタイプ 好きなインスタンスタイプ
Number of Instances EC2インスタンスの数 好きな数
Key pair name キーペアの名前 好きなキーペア名

aws_chap7_024.jpg

お財布と相談して、EC2インスタンスの数やタイプを決めましょう。

次に、セキュリティグループとIAMロールの設定をします。任意の場所からアクセス可能にするため、[Allowed ingress source]を「0.0.0.0/0」とします。ここでECSからEC2やELBなどのAWSのサービスを利用するために必要な権限を割り当てるIAMを指定します。[Container instance IAM role]を[Create IAM Roles]にして、[Review & Launch]ボタンをクリックします。設定内容を確認します。設定に問題がなければ、[Launch Instance & Run Service]ボタンをクリックし、クラスタ環境を構築します。

aws_chap7_025.jpg

クラスタの構成には、数分~数十分の時間がかかります。

これで、おわりです。

Dockerクラスタの運用

ほんとうにきちんと動いているのか、、、、信用できない人のために。

Dockerのクラスタを確認するには、 [View Service]ボタンをクリックします。
aws_chap7_026.jpg

構築したクラスタの詳細やステータスが確認できます。[Status]がACTIVEになっていれば良しとしましょう。
aws_chap7_027.jpg

Glassfishサーバが動作しているかどうかを確認するには、[Load Balancer Name]ボタンをクリックして、ELBのDNS名を確認し、ブラウザから次のURLにアクセスします。
http://<ELBのDNS名>:8080/DockerSample/

aws_chap7_028.jpg

動いてますね。

Webマネジメントコンソールで[Metrics]タブをクリックすると、CPUとメモリの利用状況がわかります。
aws_chap7_030.jpg

なお、Dockerの基本的なところについては、「プログラマのためのDocker教科書」という本があるらしいです。
私は読んだことはないので、いつか図書館で借りて読んでみようと思っています。

本当にフルマネージドなクラスタ環境なのか

信用できない人は、[Tasks]タブで実行中のタスクを手動で停止してみましょう。

タスク定義に定義されたとおりにECSがコンテナを構成するため、すぐに別の新しいタスクが自動的に起動します。

殺しても殺しても立ち上がるので、ホラーです。

おわり