リクルートテクノロジーズアドカレ12日目です.
Dockerでインフラ基盤をつくりはじめると,Registryを必ず建てなければいけない時がやってくると思います.Registryを建てた暁には,registryが大量のイメージで埋め尽くされることでしょう.
Registryに登録されたイメージの一覧を見たいときはコマンドライン上で確認することがほとんどですが,JenkinsやCircle-CIのWeb画面から”あのイメージなんだったっけ…?”と思った時にはRegistryにあるイメージ一覧もWeb画面で見たくなります.
Tankerは弊社の@nysdが作ったDocker registryのwebビューワです.goで書かれており,オリジナルのリポジトリにはnode.js版のものも用意していますが思い切って削除しました.nodeが嫌いなわけじゃないんだ,今後のメンテナンスをgo版のものにフォーカスしていくためです.
Tankerの機能
Tankerはイメージの一覧ができるほかに,次の様な機能を備えています.
- タグやイメージ名での簡単な検索
- イメージの削除
Tankerの実装
Tankerはapi部分だけgo,フロントはBackbone.jsで作られています.
api部分の実装はserver.go
のぺら1枚のみになっているので,negroniを使って簡単なapiを作るサンプルとして何かの参考に見ていただければと思います.
#registry一覧からイメージを取得するapiの定義
mux.HandleFunc("/docker/api/images", func(w http.ResponseWriter, r *http.Request) {
success := func(b []byte) { w.Write(b) }
error := func(statusCode int) { w.WriteHeader(statusCode) }
#registryにimage一覧を取りに行ってそのまま出力
httpGet(fmt.Sprintf("%s/v1/images/%s/json", *dockerapi, r.URL.Query().Get("id")), success, error)
})
そのほか,主な構成要素は次の通りです.
- HTTPミドルウェア: codegangsta/negroni
- パッケージ管理: mattn/gom
- Registryの情報取得部分にgorilla/websocketを利用
動かしてみる
それでは実際にTankerを動かしてみます.
Tankerの起動
デフォルトでは3000番portでサーバが起動します.
git clone https://github.com/ainoya/tanker.git && cd tanker
go get github.com/mattn/gom # Install gom, a package manager
gom install
gom run server.go
Registryの起動
Registryを5000番ポートで動かします.
docker run -p 5000:5000 registry
このままだとRegistryに何も入っていないので,Tankerの画面は無味乾燥で見ても面白くないです.
適当なタグでRegistryにイメージをpushしてから画面を確認してみましょう.
for i in $(seq 1 9); do docker tag centos localhost:5000/centos-test:v0.$i;docker push localhost:5000/centos-test:v0.$i;done
open http://localhost:3000/docker
# イメージ名"centos-test"のタグ一覧を取得
open http://localhost:3000/docker/view/tags/library/centos-test
ご覧いただけたでしょうか?
Tankerの今後
現在は必要と思われる最低限の機能のみしか実装していませんが,今後開発を続けていく場合には次のような機能があったら面白いなぁと考えています.
- mesosやkubernetesとの連携
- registryの操作UI.DockerHubなど外部ホスティングからのイメージインポート機能など.
何か思いついたらissueまでご気軽に!本日はここまで.また明日もお楽しみに!
2014/12/12追記: 書いた後に,kwk/docker-registry-frontendがあるのを知りました….機能も揃っていて使いやすそうです.