概要
前回 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
で認証情報を生成しておいてください
- docker login -u AWS -p [生成されたパスワード文字列] -e none https://123456789012.dkr.ecr.ap-southeast-2.amazonaws.com
ログインできたらイメージをビルドして 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 件のコメント:
コメントを投稿