こんにちは。@jedipunkz です。
今週 Redhat が ‘Redhat Enterprise Linux Atomic Host’ しましたよね。Docker を特 徴としたミニマムな OS だとのこと。その内部で用いられている技術 Geard について 少し調べてみました。複数コンテナの関連付けが可能なようです。ここでは調べた結果 について簡単にまとめていきます。
参考資料
http://openshift.github.io/geard/deploy_with_geard.html
利用方法
ここではホスト OS に Fedora20 を用意します。
まず Geard をインストール
% sudo yum install --enablerepo=updates-testing geard
下記の json ファイルを作成します。ここにはコンテナをデプロイするための情報と関 連付けのための情報を記します。
$ ${EDITOR} rockmongo_mongodb.json
{
"containers":[
{
"name":"rockmongo",
"count":1,
"image":"derekwaynecarr/rockmongo",
"publicports":[{"internal":80,"external":6060}],
"links":[{"to":"mongodb"}]
},
{
"name":"mongodb",
"count":1,
"image":"ccoleman/ubuntu-mongodb",
"publicports":[{"internal":27017}]
}
]
}
上記のファイルの解説。
- コンテナ ‘rockmongo’ と ‘mongodb’ を作成
- それぞれ1個ずつコンテナを作成
- ‘image’ パラメータにて docker イメージの指定
- ‘publicports’ パラメータにてコンテナ内部とホスト側のポートマッピングを行う
- ’links’ パラメータで ‘rockmongo’ を ‘mongodb’ に関連付け
では、デプロイ開始します。
$ sudo gear deploy rockmongo_mongo.json
2014/04/22 07:21:12 Deploying rockmongo_mongo.json.20140422-072112
2014/04/22 07:21:12 appending 27017 on rockmongo-1: &{PortPair:{Internal:27017 External:0} Target:127.0.0.1:27017} &{Id:rockmongo-1 Image:derekwaynecarr/rockmongo From:rockmongo On:0xc2100bb980 Ports:[{PortPair:{Internal:80 External:6060} Target::0}] add:true remove:false container:0xc21000be00 links:[]}
2014/04/22 07:21:12 ports: Releasing
2014/04/22 07:21:12 systemd: Reloading daemon
local PortMapping: 80 -> 6060
local Container rockmongo-1 is installed
2014/04/22 07:21:12 ports: Releasing
2014/04/22 07:21:12 systemd: Reloading daemon
local PortMapping: 27017 -> 4000
local Container mongodb-1 is installed
linking rockmongo: 127.0.0.1:27017 -> localhost:4000
local Links set on local
local Container rockmongo-1 starting
local Container mongodb-1 starting
ブラウザにてホスト OS に接続することで rockmongo の管理画面にアクセスが可能。
http://<ホストOSのIP:6060>/
ポートマッピング管理
デプロイが完了して、実際に RockMongo の管理画面にアクセス出来たと思います。 関連付けが特徴と言えそうなのでその解析をしてみました。
Geard のコンテナ関連付けはホストとコンテナのポート管理がキモとなっていることが 解ります。これを紐解くことで geard のコンテナ管理を理解します。
'rockmongo' コンテナ 'mongodb' コンテナ
+----------+ +--------------------------+ +-------------------+
| Client |->6060->|->80-> RockMongo ->27017->|->4000->|->27017-> Mongodb |
+----------+ +--------------------------+ +-------------------+
|-------------------- docker ホスト --------------------|
上記 ‘gear deploy’ コマンド発行時のログと json ファイルにより上図のような構成 になっていることが理解できます。一つずつ読み解いていきましょう。
- ‘rockmongo’ コンテナの内部でリスンしている 80 番ポートはホスト OS の 6060 番へ変換
- ‘rockmongo’ コンテナ内で稼働する RockMongo の config.php から ‘127.0.0.1:27017’ でリスンしていることが解る
試しに ‘derekwaynecarr/rockmongo:latest’ に /bin/bash でログインし config.php を確認。
$ sudo docker run -i -t derekwaynecarr/rockmongo:latest /bin/bash
bash-4.1# grep mongo_host /var/www/html/config.php
$MONGO["servers"][$i]["mongo_host"] = "127.0.0.1";//mongo host
$MONGO["servers"][$i]["mongo_host"] = "127.0.0.1";
- デプロイ時のログと json ファイルの ’links’ パラメータより、ホストのポートに動的に(ここでは 4000番ポート) に変換されることが解ります。
linking rockmongo: 127.0.0.1:27017 -> localhost:4000
- ホストの 4000 番ポートは動的に ‘mongodb’ コンテナの内部ポート 27017 にマッピングされる
これらのポートマッピングによりそれぞれのコンテナの連携が取れている。
まとめと考察
Geard は下記の2つを特徴とした技術だと言えるとことがわかりました。
- コンテナを json で管理しデプロイする仕組みを提供する
- コンテナ間の関連付けをホスト OS のポートを動的に管理・マッピングすることで行う
同じような OS に CoreOS https://coreos.com/ がありますが、こちらも docker, sytemd 等を特徴としています。さらに etcd を使ってクラスタの構成等が可能になっ ていますが、Geard はホストのポートを動的に管理することで関連付けが可能なことが わかりました。
実際に触ってみた感覚から言えば、まだまだ実用化は厳しい状況に思えますが、今後へ の展開に期待したい技術です。