概要
前回 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 があるのでそれを使います
- wget ‘https://raw.githubusercontent.com/vmware/vic/master/demos/compose/voting-app/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 件のコメント:
コメントを投稿