Help us understand the problem. What is going on with this article?

Dockerコンテナの作成からECSの動的ポート+ALBでロードバランスするまで【cloudpack大阪ブログ】

More than 3 years have passed since last update.

概要

Dockerコンテナをローカルにつくり、ECRにプッシュ、ECS+ALBでロードバランスするところまでやってみます。

以前はECSをELBでロードバランスする際、EC2ホストとコンテナのポートを静的にマッピングする必要があり、1ホストに1コンテナしか実行できませんでした。ALBで実装された動的ポートマッピング機能を使い、EC2ホストの複数ポートをコンテナのポートと動的にマッピングすることで、1ホストに複数コンテナの環境をロードバランスすることができるようになりました。

環境はこんな感じです。

Kobito.vF1wI8.png

1. コンテナの作成

ローカルでDockerコンテナをビルドし、動かします。

環境

Docker for Mac
https://docs.docker.com/docker-for-mac/

Docker for Windows
https://docs.docker.com/docker-for-windows/

作成手順

  1. Dockerfileを作成
  2. コンテナイメージをビルド(docker build)
  3. コンテナを起動(docker run)

Dockerfileを作成

Dockerfile
FROM centos:latest
RUN yum -y install httpd
ADD index.html /var/www/html
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]

各行の説明です。

  • FROM
    • 基になるDockerイメージを指定します。ここではDockerHubからCentOSのLatestタグが付いているものをPullします。
  • RUN
    • コンテナイメージのビルド時に実行されるコマンドです。ここではhttpdをYUMインストールしています。
  • ADD
    • コンテナ上に置くファイルの指定です。ローカルのindex.htmlをコンテナ上の/var/www/htmlに保存しています。
  • CMD
    • コンテナ起動時に実行されるコマンドです。httpdをForegroundで起動しています。
index.html
<h1>Kumoben Test</h1>

コンテナイメージをビルド

$ docker build -t kumoben-apache .
$ docker images                                                                                
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
kumoben-apache      latest              aa1fc4c72c34        2 seconds ago       338.5 MB
centos              latest              180e0e4c79ec        7 weeks ago         196.8 MB

コンテナを起動

$ docker run -p 80:80 kumoben-apache

2. コンテナの保存

ローカルで作成したコンテナイメージをECRにアップロードします。

マネージメントコンソールでECRリポジトリの作成

リポジトリの作成をクリックします。

Kobito.ANuLQX.png

リポジトリ名を入力し、次に進みます。

Kobito.xj02G6.png

ログイン、コンテナのプッシュ方法が表示されます。

Kobito.a96I97.png

ECRのログイン情報を取得

マネージメントコンソールに表示されたコマンドを実行していきます。

$ aws ecr get-login --region ap-northeast-1

ECRにログイン

$ docker login -u AWS -p AQE~~~ -e none https://xxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
Flag --email has been deprecated, will be removed in 1.13.
Login Succeeded

コンテナイメージにECRにアップするためのタグを付与

$ docker tag kumoben-apache:latest xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/kumoben-apache:latest
$ docker images                                                                                
REPOSITORY                                                         TAG                 IMAGE ID            CREATED             SIZE
xxxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/kumoben-apache   latest              23016d00fed9        34 minutes ago      338.5 MB
kumoben-apache                                                     latest              23016d00fed9        34 minutes ago      338.5 MB
centos                                                             latest              980e0e4c79ec        7 weeks ago         196.8 MB

コンテナイメージをECRにプッシュ

$ docker push xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/kumoben-apache:latest                       
The push refers to a repository [xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/kumoben-apache]
d72c7de6e1d2: Pushed
a758bd29dbba: Pushed
0aeb287b1ba9: Pushed
latest: digest: sha256:aaaa291c2c781be1f50b12b354e53faa46063a6ee156d0a2c8db76c6 size: 5104

Kobito.5W06VM.png

3. コンテナの展開

ECSでコンテナを展開します。

クラスタを作成

Kobito.ksUcYa.png

Kobito.tSxyVV.png

Kobito.znDApL.png

Kobito.ilgsIz.png

クラスタにコンテナインスタンスを追加

EC2に割り当てるIAMロールを作成します。

AmazonEC2ContainerServiceforEC2Roleを有効にしたEC2用のIAMロールを作成します。

Kobito.IaNNAi.png

EC2インスタンスを起動します。
ECS用のAmazon Linux(amzn-ami-2016.09.a-amazon-ecs-optimized(ami-c8b016a9))を使用します。
Docker、ECSエージェントがセットアップされていれば、CoreOSやUbuntu等のOSも利用可能です。

Kobito.X479He.png

ユーザーデータに下記を記載します。
/etc/ecs/ecs.configにクラスタ名を記載することで、クラスタに登録されます。

#!/bin/bash
echo ECS_CLUSTER=<クラスタ名> >> /etc/ecs/ecs.config

Kobito.YxEI4E.png

マネージメントコンソールで登録されていることを確認します。

Kobito.yGmbOc.png

タスク定義を作成

コンテナの実行方法(タスク)を設定します。

新しいタスクの定義をクリックします。

Kobito.KZCv7a.png

タスク定義名を入力し、コンテナの追加をクリックします。

Kobito.gneEsT.png

下記を入力します。

  • コンテナ名
    • 任意の名前
  • イメージ
    • ECR上のパス
  • メモリ制限
    • コンテナに割り当てるメモリ量
  • ポートマッピング
    • 紐付けを行うEC2ホストのポートと、コンテナ側のポートを指定します。ホストポートを0にすることで、エフェメラルポートが動的に割り当てられます。

Kobito.41a7vr.png

Kobito.VlYmUg.png

サービスを作成

作成したタスク定義からサービスを作成し、コンテナの稼働状況を定義します。

ALBの作成

ロードバランサもサービスで定義する必要がなるので、先にALBを作成します。

Kobito.5wS1wl.png

ターゲットの登録でインスタンスの登録は行いません。

Kobito.PV9G4c.png

ECSサービス用のIAMロールを作成

ロールタイプでAmazon EC2 Container Service Roleを選択します。
ポリシーもそのままAmazonEC2ContainerServiceRoleをアタッチします。
Kobito.ivgTfU.png

サービスの作成

クラスターの画面からサービスタブを選択し、作成をクリックします。

Kobito.DhkUSX.png

サービス名タスクの数を入力します。
タスクの数で指定した数のタスクが常時稼働することになります。
ここでは4としています。

Kobito.us6zW3.png

ELBの設定をクリックし、作成したIAMロール、ELB名を選択し、コンテナの選択でタスク定義で設定したコンテナを選択し、ELBへの追加をクリックします。

Kobito.PkDaCa.png

リスナーポートとALB作成時に設定したターゲットグループ名を選択します。
最後に作成をクリックします。

Kobito.dsITjf.png

Kobito.0PtT3s.png

サービスの画面に戻ると、タスクが指定した数(4つ)実行されています。

Kobito.KY73Ok.png

ロードバランシングのターゲットグループを確認すると、ターゲットとして2台のインスタンスに2個ずつのターゲットが追加されています。

Kobito.RsZg08.png

サービスの確認

サービスとして正常に動作しているかの確認のため、1台のインスタンスを停止してみます。

Kobito.bYG8rZ.png

新たに同じインスタンスで稼働する2つのターゲットが追加されています。

Kobito.rDbxNQ.png

taishin
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away