VimでDockerコンテナを操作する


こんにちわ。
ゴリラ.vimを運営しているゴリラです。

みなさんVimとコンテナは好きですか?
普段VimでDockerfileを書いたりする時にコンテナの状態気になりませんか?
あの子元気かな?とか、この子今起きているかなとか、いろいろ気になると思います。

そんな方むけにVimからコンテナを操作したり、監視したりするプラグインを作ってみました。

どういうやつ?

できること

現時点で以下のことができます。
のんびり開発中でまだ実装したい機能がありますが、とりあえず形になったので公開しました。

images

  • get images
  • delete image
  • pull image

containers

  • start/stop/restart/kill container
  • delete container
  • attach container(require docker command)
  • monitoring container CPU/MEM

使い方

READMEを参照してください。
コマンドとキーバインドがあります。基本一覧ではキーバインドを使った操作になります。
例えば、:DockerContainersでcontainers画面を開き、uでコンテナ起動、sでコンテナを停止します。

おすすめポイント

Vimを止めることなくattachしつつ、CPUやMEMの使用率を監視できる機能が推しです。
ただ、モニターに関しては現在Mac/Linuxしか対応していないので、今後Windowsも対応していく予定です。

attachに関しては、裏でdocker exec -it {container} {cmd} というふうに実行しているので、dockerコマンドが必要になってきます。

仕組み

API通信は裏でcurlを使っています。
curl --unix-socket /var/run/docker.sock http://localhost/containers/jsonという感じでコマンドを実行しています。
こちらはvitalというライブラリのweb.http モジュールを使っています。
プラグインで使いやすいように、それを更にすこしwarapした関数を用意しました。

" http get
function! docker#api#http#get(url, param) abort
    return s:HTTP.request(a:url, {
                \ 'unixSocket': '/var/run/docker.sock',
                \ 'param': a:param
                \ })
endfunction

あとは docker#api#http#geturlqueryparameter を渡せば良いだけです。簡単ですね。

一覧表示ではテーブルを使っています。こちらに関しては、text.tableモジュールを使用しています。
こちらを使用すれば簡単にテーブルを作れます。とても便利ですね。

" ヘッダとカラム数を指定してtableオブジェクトを作る
let l:image_table = s:TABLE.new({
            \ 'columns': [{},{},{},{},{}],
            \ 'header' : ['ID', 'REPOSITORY', 'TAG', 'CREATED', 'SIZE'],
            \ })

" curlのレスポンスを1行ずつ整形してテーブルに追加
for row in a:ctx.content[a:ctx.offset:a:ctx.offset + a:ctx.top - 1]
    let l:image = docker#util#parse_image(row)

    call l:image_table.add_row([
                \ l:image.Id,
                \ l:image.Repo,
                \ l:image.Tag,
                \ l:image.Created,
                \ l:image.Size])
endfor

" table.stringify()で実際のテーブルテキストを出力
let a:ctx.view_content = l:image_table.stringify()

ざっくりですが、実はそんな難しいことはしていなくて、
裏でDocker EngineのAPIを叩いて結果に応じてVimのポップアップウィンドウを使っていい感じにインターフェイスを用意して操作する感じです。

最後に

このプラグインはまだ開発途中です。
バグや要望があればissueやPRをください。みなさんの意見・要望・PRがたくさん来ることを楽しみにしています。