LoginSignup
6
8

More than 5 years have passed since last update.

Dockerを体験してみるハンズオン Part4

Last updated at Posted at 2015-11-10

前回までのあらすじ

今回は前回作ったDockerイメージをAmazon ECSにデプロイしてみます。
Amazon ECSの概念的なところはこちらにまとめてみたので参考にしてください。

Task Definitionを登録する

Task DefinitionはDockerコンテナの起動の仕方を定義するものです。(Docker Composeのcompose.ymlファイルとだいたい同じです。)

Create new Task Definition

https://gyazo.com/a8bb141059d98df7bf772c2eabf4f4fc

Configure via JSON

ECSのコンソールからも登録できますが、実体はJSON形式の定義ファイルです。ここでは説明を簡略化するためにJSONを登録する手順にします。

https://gyazo.com/ed126065ed89fe74d8e736ac1dc9924e

task-definition
{
    "family": "newgyu-docker",
    "containerDefinitions": [
        {
            "name": "hello",
            "image": "newgyu/docker-sample:1.0.0", ←ここを自分のイメージ名にする
            "memory": "256",
            "essential": true,
            "portMappings": [
                {
                    "hostPort": "80",
                    "containerPort": "80",
                    "protocol": "tcp"
                }
            ],
            "environment": null,
            "mountPoints": null,
            "volumesFrom": null,
            "extraHosts": null,
            "logConfiguration": null,
            "ulimits": null,
            "dockerLabels": null
        }
    ],
    "volumes": []
}

右からニュッとでてきた入力欄にJSONを貼り付けます。

項目
family Task Definitionの名前
containerDefinitions n個のコンテナ定義を配列で定義
containerDefinitions.name コンテナの名前
containerDefinitions.image Dockerイメージ名1
containerDefinitions.memory コンテナに割り当てるメモリ量
containerDefinitions.portMappings docker runするときの-pオプションと同でホストにバインドするポートの定義をn個の配列で指定
containerDefinitions.portMappings.hostPort ホストのポート番号
containerDefinitions.portMappings.containerPort コンテナのポート番号

イメージ名は[REGISTRYHOST/][USERNAME/]NAME[:TAG]の書式でREGISTRYHOSTは省略可能(デフォルトはhub.docker.com)です。

細かい書き方についてはとりあえず公式ドキュメントを見てねという形でお茶を濁しておきます。

Clusterを作成する

Create Cluster

https://gyazo.com/5412479cc7c2a511c199a1edb394c156

ここではとりあえずfor-docker-sampleという名前で作成します。

ClusterとEC2インスタンスの紐付け

方法は非常に柔軟ですが、ここではAutoScalingグループを使った手順としますが、AutoScalingの作成は本筋ではないので手を抜いてポイントだけの解説にします。

起動設定の作成

項目 設定内容
AMI amzn-ami-2015.09.b-amazon-ecs-optimized - ami-3077525e
インスタンスタイプ t2.micro(お金があればお好きなのを)
IAMロール ecsInstanceRole
ユーザーデータ 紐付けたいクラスター名の設定をする2

ここが最も重要なポイントでユーザーデータに下記の設定をします。

ユーザーデータ
#!/bin/bash
echo ECS_CLUSTER=for-docker-sample >> /etc/ecs/ecs.config
                 ^^^^^^^^^^^^^^^^
                 ここに紐付けたいクラスター名を指定する

セキュリティグループの設定はよしなにやってください。

Auto Scaling グループの作成

上記の起動設定を元に作成します。
ELBに紐付けたほうがよいでしょう。
ELBとAutoScalingGroupを紐付ける必要はありません。後述のServiceとELBを紐付けすることでECSがELBへのアタッチ/デタッチの面倒を見てくれます。

(すげー雑)

ClusterにECSインスタンスが紐づく

https://gyazo.com/cf74eb0199653da1b8c6595f75c11a80

しばらくするとAuto ScalingグループがEC2インスタンスを起動し、ClusterのECS Instancesというタブに現れます。
仕組み的にはAmazon ECS Container Agentが上記ユーザーデータで指定されたClusterに参加するように動作する感じです。

Serviceを作成する

Create Service

https://gyazo.com/aa971fb577debefe3244efbcc24359b3

https://gyazo.com/d00ef9eb6efa04c697fc79db24df1c01

項目 なんとなく説明
Task Definition Serviceの元となるTask DefinitionでTask Definitionは事前に作成されている必要があります
Cluster Serviceを動作させるクラスタを指定します
Service name Serviceの識別子で適当にわかりやすい名前をつけてください
Number of tasks このService上でTaskをいくつ動かすかを定義します。あとから変更可能です。
Load Balancer 前述の通り負荷分散するためのELBの名前と使うポート番号を指定します。3

ELBのリスナー設定のインスタンスポートとTaskDefinitionのcontainerDefinitions.portMappings.hostPortをひもづける感じになります。

https://gyazo.com/efe543f1083e1b64eed03124fcfc8ffa

Serviceが起動する

https://gyazo.com/dc1cdf9f38db052f9891df426706c0a8

というところで今回は、前回作ったDockerイメージをAmazon ECSで動かしてみました。


6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8