2017年1月7日土曜日

ECS 上に自分が作成した docker-compose アプリをデプロイしてみる

概要

前回 ECS に docker-compose 的なことができる ecs-cli を使って複数コンテナで構成されるアプリを立ち上げました
イメージはすでに docker hub で公開されているものを使いました
今回は自分でビルドしたイメージを使った docker-compose アプリを ECS 上にデプロイしてみました

環境

  • Amazon EC2 Container Service (ECS) 2017/01/05 時点
  • CentOS 7.3.1611
  • docker-compose 1.9.0
  • aws-cli 1.11.35

事前準備

今回も docker-compose が動作する手元の環境が必要なので構築しておいてください
前回も使っているので前回の環境があればそのまま使って OK です
また、ECS 上にクラスタおよびコンテナインスタンスとリポジトリを作成しておいてください
前回の記事だとリポジトリは作成していませんが、前々回の記事 ではリポジトリの作成も行っているので参考にして作成しておいてください

独自 docker-compose アプリの作成

ECS にデプロイする手元の環境で動作する docker-compose アプリを作成します
参考サイトにある Python スクリプトをそのまま使います

  • cat app.py
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello World! I have been seen %s times.' % redis.get('hits')

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
  • cat requirements.txt
flask
redis
  • cat Dockerfile
FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python app.py
  • cat docker-compose.yml
web:
  build: .
  ports:
   - "5000:5000"
  volumes:
   - .:/code
  links:
   - redis
redis:
  image: redis

すべて同一ディレクトリ内に配置してください
配置できたら手元で動作させてみます

  • docker-compose up

ブラウザで 5000 ポートにアクセスしてアクセスごとにカウントアップするアプリが起動すれば OK です
フォアグラウンドで起動しているので Ctrl + c でコンテナを停止してください
これをそっくりそのまま ECS 上にデプロイします

ECS 上でデプロイする準備 (作成したアプリのイメージを ECS 上のリポジトリに push する)

前回同様 ECS 上に docker-compose アプリをデプロイする場合は ecs-cli を使います
前回の記事でも軽く触れたのですが、ecs-cli の yml ファイルでは build を使うことができません
なので、あらかじめイメージをビルドしておきそれをどこかに push しておく必要があります
Web 上で検索できる他の紹介記事を見ると docker hub を使うのがよく紹介されていますが、今回は ECS が提供するリポジトリを使ってみます

まずはリポジトリにログインします

  • aws ecr get-login --region ap-southeast-2

で取得できた docker コマンドを実行してリポジトリにログインします
事前に aws configure で認証情報を生成しておいてください

ログインできたらイメージをビルドして push まで行います

  • docker build -t test/repo .
  • docker tag test/repo:latest 123456789012.dkr.ecr.ap-southeast-2.amazonaws.com/test/repo:latest
  • docker push 123456789012.dkr.ecr.ap-southeast-2.amazonaws.com/test/repo:latest

でアップロードがはじまり完了すれば OK です

docker-compose.yml ファイルを ecs-cli 用に書き換える

先程も軽く説明しましたが、ecs-cli では build が使えません
なので、リポジトリにアップロードしたイメージを使うように docker-compose.yml を書き換えます

  • cat docker-compose.yml
web:
  image: 123456789012.dkr.ecr.ap-southeast-2.amazonaws.com/test/repo
  ports:
   - "80:5000"
  mem_limit: 268435456
  links:
   - redis
redis:
  image: redis
  mem_limit: 268435456

build の代わりに image を使うようにしてます
mem_limit で動作に必要なメモリを確保するようにしました
また、コンテナインスタンス側にバインドするポートは 80 番ポートに変更しました
これはコンテナインスタンスに適用しているセキュリティグループが 80 番を許可するルールになっているため変更したので、セキュリティグループに 5000 番を許可するルールを入れるのであれば変更しなくても OK です

ecs-cli を使ってデプロイする

それではコンテナをデプロイしてみましょう

  • ecs-cli compose --file docker-compose.yml up

ファイル名が docker-compose.yml であれば file の指定は不要です
これで ECS 上でもコンテナが起動してブラウザで 80 番にアクセスすればアプリを確認することができると思います

最後に

独自の docker-compose アプリを ECS 上で動作させてみました
docker hub ではなく ECS 上でのリポジトリを使うことができたのでこれでわざわざ docker hub でイメージを公開する必要がなくなるかと思います

一応 ecs-cli compose stop と start の挙動も確認してみたのですが、やはり別のタスクが実行されコンテナも別コンテナが起動してくるため、カウントも元に戻ってしまいました
この stop と start の挙動が ecs-cli compose と docker-compose で違うは ECS 側の仕様なのでしょうか、、、自分でも調査しきれていないので未だ不明です

参考サイト

0 件のコメント:

コメントを投稿