2017年1月16日月曜日

VCH 上で docker-compose が動作するか試してみた

概要

前回 docker コンテナを VCH 上に立ててみました
今回は docker-compose を使って複数のコンテンを一度に VCH 上に立ててみます

環境

仮想環境

  • ESXi 5.5.0
    • CPU: Xeon E5-2690 (Sandy Bridge 世代)
    • Memory: 400GB
  • VMware vCenter Server 5.5.0
  • VMware Integrated Contaier v0.8.0

クライアント側

  • Ubuntu 16.04
  • docker-compose 1.8.0, build f3628c7

docker-compose をインストールする

この記事を参考にインストールしてください

--no-tls な VCH をデプロイする

前回までの VCH は SSL 通信が可能な VCH を使っていました
執筆時点の VCH で docker-compose を使う場合、--no-tls というオプションを付けて VCH を作成する必要があります
オプションがない状態の VCH に対して docker-compose を使うと以下のエラーが発生します
https://github.com/docker/compose/issues/890

SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

これは単純に IP ベースで SSL を使おうとしているために出ているので VCH に証明書をちゃんと設定すれば出ないエラーだと思います
今回のように IP ベースでアクセスする場合は --no-tls オプションを付与して VCH デプロイしてください

また合わせて --volume-store というオプションを付与します
これは DB などのコンテナがデータを保存するデータストアの領域を指定するためのオプションでデフォルトだと default というデータストアを探しにいきます
今回は datastore2 というデータストアしかないのでこれを使うようにしてます
「datastore2/volumes:default」という感じで指定することで datastore2 配下の volumes というディレクトリ配下にデータを保存してくれます
https://github.com/vmware/vic/issues/3475

総括すると以下のコマンドで VCH を作成します

  • ./vic-machine-linux create --target xxx.xxx.xxx.xxx/dc1 --image-store datastore2 --volume-store "datastore2/volumes:default" --compute-resource cluster1 --bridge-network "dvs-for-vch" --public-network "lan1" --user "vcenter-user" --password "vcenter-pass" --notls --no-tlsverify --force --name "vch-no-tls"

docker-compose.yml を取得する

公式で公開している docker-compose.yml があるのでそれを使います

中身は 5 つのコンテナを使った投票システムです
各種イメージはすべて docker hub で公開されています
参考サイトに記載の公式にもあるのですが、VCH で docker-compose を使う場合には docker-compose ファイル内で build ディレクティブを使うことができません
なので、独自のアプリを作成した場合には事前にすべてのイメージを docker hub に公開する必要があります

これは過去に紹介した ECS 上で docker-compose を動かす場合の挙動と同じ感じだと思います

複数コンテナを起動してみる

それでは docker-compose でコンテナたちを起動してみましょう
docker-compose.yml があるディレクトリに移動して以下のコマンドを実行します
xxx.xxx.xxx.xxx の部分は先程作成した --no-tls な VCH の IP アドレスを指定してください

  • export DOCKER_HOST=xxx.xxx.xxx.xxx:2375
  • docker-compose up -d

pull するイメージが結構あるのでアップまでに時間がかかります
問題なく起動したら ps で確認してみましょう

  • docker-compose ps
 Name               Command               State                      Ports
----------------------------------------------------------------------------------------------
db       /docker-entrypoint.sh postgres   Up      5432/tcp
db       /docker-entrypoint.sh postgres   Up      5432/tcp
redis    docker-entrypoint.sh redis ...   Up      0.0.0.0:32768->6379/tcp
redis    docker-entrypoint.sh redis ...   Up      0.0.0.0:32768->6379/tcp
result   nodemon --debug server.js        Up      0.0.0.0:5858->5858/tcp, 0.0.0.0:5001->80/tcp
result   nodemon --debug server.js        Up      0.0.0.0:5858->5858/tcp, 0.0.0.0:5001->80/tcp
vote     python app.py                    Up      0.0.0.0:5000->80/tcp
vote     python app.py                    Up      0.0.0.0:5000->80/tcp
worker   /bin/sh -c dotnet Worker.dll     Up
worker   /bin/sh -c dotnet Worker.dll     Up

こんな感じで表示されれば OK です
なぜかそれぞれ 2 プロセス分表示されています
Web Client で確認するとコンテナはそれぞれ 1 台しか存在しませんでした (バグ?)

Tips

docker-compose 実行時の一番のポイントなのですが VCH 上にすでに docker コマンドで起動したコンテナがあると docker-compose できません

ValueError: Container 4a9962c3bbfa does not have a com.docker.compose.container-number label
docker-compose returned -1

この場合は「4a9962c3bbfa」という docker コマンドで作成したコンテナを削除してから up すればうまく動作しました
原因はちょっとよくわからないですが、仕様という可能性もあるのでしょうか、、、
もしくは今後の VCH のアップデートで修正されるのでしょうか、、、

動作確認

VCH の IP の 5000 と 5001 番ポートにアクセスして UI が表示されれば OK です
5000 番で投票してから 5001 番にアクセスすると結果が表示されると思います
無駄に動きのある画面が表示されると思います

ちなみに停止する場合は

  • docker-compose stop

でそのままコンテナを削除したい場合は

  • docker-compose rm

で OK です
stop 時に「Read timed out」のエラーが出ますが VM は停止しているので続けて rm して OK でした

最後に

VCH 上で docker-compose を動かしてみました
VCH の TLS と volume の部分で少しハマりました、がそれよりもまだ docker-compose 対応が安定していない印象を受けました
VCH の設定をミスるとうまく動作しないので、自身の vCenter の環境に合わせて VCH のパラメータを決定する必要があるのに注意が必要です

しかも VCH 作成時のパラメータが作成後だと変更できないっぽいので、作り直す必要があります
すでに動作しているコンテナがある場合には、それも停止する必要があると思います
コンテナなので再生成すること自体には何の問題もないと思いますが、単純にサービスが停止するのが辛い感じがします

ライブマイグレーションや VCH の更新機能などすでにあるかもしれませんが、あるかも含めて調査が必要だと思ってます

参考サイト

0 件のコメント:

コメントを投稿