Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Weaveを試してみた 
dockerコンテナ間でネットワークを組もう
@jacopen 
Kazuto Kusama 
NTT Communications 
Cloudn PaaSの開発・運用をやっています
Weaveを試してみた
Weaveを試してみた
Weaveを試してみた
Weaveを試してみた
コンテナ間でネットワークを 
繋ぎたい
App DB
同一ホストなら 
$ sudo docker run -d --name db training/postgres 
$ sudo docker run -d -P --name web --link db:db training/webapp 
python app.py 
⇐ webコンテナは、環境変数でDBコンテナの接続先 
を取得できる 
Docker linkを使うのが一般的
じゃあホストが異なる 
と・・・?
解決策
Weave 
Zettioが開発している、Dockerコンテナに仮想ネット 
ワークを提供するソフトウェア。Apache Licenseで開 
発されている。 
ZettioはRabbitMQの開発者であるAlexis Richardson氏 
と、Matthias Radestock氏によって設立された企業。 
本社はロンドン。
https://github.com/zettio/weave
Docker Host1 Docker Host2 
10.0.1.1/24 10.0.1.2/24 
Container1 
Container2
DEMO1
Weaveのセットアップ 
sudo wget -O /usr/local/bin/weave  
https://raw.githubusercontent.com/zettio/weave/master/weave 
sudo chmod a+x /usr/local/bin/weave 
超簡単
Weaveの実行 
(HOST1) 
weave launch 
weave run 10.0.1.1/24 -t -i ubuntu /bin/bash 
(HOST2) 
weave launch 10.9.8.171 
weave run 10.0.1.2/24 -t -i ubuntu /bin/bash 
Weave Weave 
Container1 
10.0.1.2/24 
Docker Host2 
10.9.8.170 
10.0.1.1/24 
Docker Host1 
10.9.8.171 
Container2
Weave Weave 
Container1 
10.0.1.2/24 
Docker Host2 
10.9.8.170 
10.0.1.1/24 
Docker Host1 
10.9.8.171 
Container2 
ConoHa 
Container3 
10.0.1.3/24 
Weave 
Internet 
Router
DEMO2
Weaveのしくみ
Weave Router(weaver) 
ホスト間でネットワークを繋ぐ仕組み。weave launch 
すると、weaverのコンテナが立ち上がる。 
https://github.com/zettio/weave/blob/master/docs/deployment.png
Weave Router(weaver) 
docker ps 
CONTAINER ID IMAGE COMMAND PORTS NAMES 
79f34b6616d2 ubuntu:14.04 "/bin/bash" high_lalande 
e2c7ac764cd7 zettio/weave:git-765bfbb49d46 "/home/weave/weaver 0.0.0.0:6783->6783/tcp, 0.0.0.0:6783->6783/udp weave 
TCP, UDPの6783で通信している。この2つさえ空いて 
いれば良い。
Weave(wrapper command) 
最初のセットアップでダウンロードしたもの。 
中身はshell script。各種コマンドの提供の他、docker 
wrapperとして機能する。
例えばweave runコマンド 
run) 
[ $# -gt 0 ] || usage 
validate_cidr $1 
⇐ cidrが正しいか確認 
CIDR=$1 
shift 1 
create_bridge 
⇐ bridgeの作成 
CONTAINER=$(docker run -d "$@" | tail -n 1) 
with_container_netns $CONTAINER attach $CIDR 
echo $CONTAINER 
;; 
⇐ docker runの実行 
↑ dockerコンテナと同じNetwork Namespaceに 
 仮想interfaceの作成
Ambassadorパターン
Ambassadorパターン 
他ホストのコンテナに接続するための戦略のひとつ。 
ホストをまたいで接続する専用のコンテナ 
(Ambassador)を立てるやり方。 
Ambassador Ambassador 
Container1 
Container2 
Docker Host1 Docker Host2 
Weaveは、まさにこのAmbassadorパターン。
もうちょっと試そう
Weave Weave 
Container1 
10.0.1.2/24 
Docker Host2 
10.9.8.170 
10.0.1.1/24 
Docker Host1 
10.9.8.171 
Container2 
ConoHa 
Container3 
10.0.1.3/24 
Weave 
問題無く繋がる
Weave Weave 
Container1 
10.0.1.2/24 
Docker Host2 
10.9.8.170 
10.0.1.1/24 
Docker Host1 
10.9.8.171 
Container2 
ConoHa 
Container3 
10.0.1.3/24 
×Weave 
weaver落とすと 
10.0.1.3には 
繋がらなくなる
Weave Weave 
Container1 
10.0.1.2/24 
Docker Host2 
10.9.8.170 
10.0.1.1/24 
Docker Host1 
10.9.8.171 
Container2 
ConoHa 
Container3 
10.0.1.3/24 
Weave 
Weave launchしなおしても 
接続が回復しない 
(あれ?) 
?
異なるサブネットのコンテナ 
Container1 
Weave Weave 
10.0.1.2/24 
10.0.2.2/24 
Docker Host2 
10.9.8.170 
10.0.1.1/24 
10.0.2.1/24 
Docker Host1 
10.9.8.171 
Container2 
Container3 
Container4 
想定した通り、10.0.1.1から10.0.2.2は繋がらない。 
その逆も然り
深追い
Dockerホスト内では何が起きているのか
Dockerホスト内では何が起きているのか 
eth0 
docker0 weave 
vethxx vethyy 
eth0 eth0 
Container1 
Weave Container 
Docker Host 
Dockerが作るdocker0やvethはそのままに、 
新しくweaveというブリッジアダプタが作られる
Dockerホスト内では何が起きているのか 
eth0 
docker0 weave 
vethxx vethweplxx vethyy vethweplyy 
eth0 ethwe eth0 ethwe 
Container1 
Weave Container 
Docker Host 
weaver runされたコンテナごとに、vethweplxxxという仮想イン 
ターフェースが作られ、weaveに接続される。
Dockerホスト内では何が起きているのか 
eth0 
docker0 weave 
vethxx vethweplxx vethyy vethweplyy 
eth0 ethwe eth0 ethwe 
Container1 
Weave Container 
Docker Host 
weaver 
weaver container内では、weaverが動いている
Dockerホスト内では何が起きているのか 
eth0 
docker0 weave 
vethxx vethweplxx vethyy vethweplyy 
eth0 ethwe eth0 ethwe 
Container1 
Weave Container 
Docker Host 
weaver 
vethxx vethweplxx vethyy vethweplyy 
eth0 ethwe eth0 ethwe 
Weave Container 
Docker Host 
weave lauchする際に指定した他のweaverに接続 
Weave Container 
eth0 
docker0 weave 
weaver
Dockerホスト内では何が起きているのか 
eth0 
docker0 weave 
vethxx vethweplxx vethyy vethweplyy 
eth0 ethwe eth0 ethwe 
Container1 
Weave Container 
Docker Host 
weaver 
eth0 
docker0 weave 
vethxx vethweplxx vethyy vethweplyy 
eth0 ethwe eth0 ethwe 
weaver 
Weave Container 
Weave Container 
Docker Host 
結果、1つのL2ネットワークとして全てのコンテナが接続される! 
(肝心の部分ですが、時間切れのため、このあたりは推測です・・・)
感想
触ってみて思ったこと 
• weaverコマンドだけで済むので、気軽に試せるのがとても 
良い 
• 自分が試した限りだと、これといったハマリポイントはな 
かった 
• 実運用するなら、weaverのオペレーションをなんとかしな 
いといけない。手動でweaver launchするのはあり得ない 
ので、serfとかのservice discoveryを組み合わせる必要が 
ありそう。
今後やりたいこと 
• weaverをダウンさせたときの再接続が上手くいかなかった 
のが気になる。ドキュメント的にはしてくれそうなので、 
追加で調べたい 
• weaver自体の仕組みを把握したい。golangで書かれてい 
るので読もうと思えば読める 
• 仕組み的にDockerでなくても、ちょっと書き換えるだけで 
使えそう。LXCとか、Wardenとか 
• 他の仕組み、例えばCoreOSのFlannel(Rudder)と比較した 
い。
質問?

More Related Content

Weaveを試してみた