Docker registryのwebビューワTankerの紹介


 リクルートテクノロジーズアドカレ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)
        })

そのほか,主な構成要素は次の通りです.

動かしてみる

それでは実際に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があるのを知りました….機能も揃っていて使いやすそうです.