Go
GUI
CUI
docker
gocui

Goで直感的に簡単にdockerを操作できるCUIツール[docui]を作りました

こんにちわ

最近dockerを使っていて、
ターミナル上で直感的にdockerを簡単に操作できるツールあったら便利だなと思い、
Goの勉強も兼ねてCUIツールを作りました。

docui-demo.gif

ツール名はdocui(ドックユーアイ)で、docker cuiをの略です。
特に良い名前思いつかず、適当に決めましたが、今となっては気に入っています。

まだdockerコマンドほど機能は充実していないのですが、よく使うコマンドは実装したので公開しました。
興味ある方は使って見て頂ければと思います。

今後は少しずつ改善・機能を増やしていくので、
使ってみた感想などを頂けると助かります。

2018/09/26 追記
docuiの実装について記事を書きました。

アジェンダ

コンセプト

  • コマンドを打つのがめんどい
  • コマンドを覚えるのがめんどくさい
  • もっと高速で操作したい
  • 初心者でも直感的に操作したい

これらを解決するためのツールです。

docker start containeruキーを押すだけでコンテナを起動するなど、
ショートカットを使って、より簡単かつ直感的に操作できる様にを目標にして作っています。

導入方法

導入する上で必要なツールは以下になります。
下記は動作済みのバージョンとなっています。

  • Go Ver.1.11
  • Docker Engine Ver.18.06.1-ce
  • Git

すでに環境整っている方は以下の手順でインストールできます。

$ git clone https://github.com/skanehira/docui
$ cd docui
$ go install

各ツールを含めた具体的の導入手順はこちらを見て頂ければと思います。
一つ注意点として、現時点docuiはunixドメインソケットにのみ対応しているため、tcpが動作しているdocker engineには接続できないです。
将来的にリモートでdocker engineの操作も対応していく予定です。

各パネルの概要

READMEwikiに使い方を書いてありますので、ここではdocuiの画面について説明していきます。

image.png

基本的以下のパネル構成と操作になります。

  • image list
    • イメージ一覧(docker images)
    • イメージ検索(docker search)
    • 取得(pull)
    • コンテナ作成(docker create)
    • 削除(docker rmi)
    • 削除(docker rmi -f dangling=true)
    • インポート(docker import)
    • 保存(docker save)
    • ロード(docker load)
    • 詳細(docker inspect)
  • container list
    • コンテナ一覧(docker ps --all)
    • 起動(docker start)
    • 停止(docker stop)
    • 削除(docker rm)
    • イメージに保存(docker commit)
    • エクスポート(docker export)
  • volume list
    • ボリューム一覧(docker volume list)
    • ボリューム作成(docker volume create)
    • ボリューム削除(docker volume rm)
    • ボリューム削除(docker volume prune)
  • detail
    • イメージ/コンテナ/ボリュームの詳細表示(docker inspect結果)
  • navigate
    • 各パネルで使用できるキーマップの表示

各パネルの操作

各パネルでのどんな操作ができるかについて説明していきます。

image list

  • イメージ取得
    docker pullと同等。
    イメージ名を入力してpullする。
    image.png

  • イメージ検索
    docker searchと同等。
    イメージ名を入力して検索する。
    検索結果が表示されるので、一覧からイメージを選択してEnterでイメージをpullする。
    image.png

  • イメージ保存
    docker saveと同等。
    指定したイメージを保存する。
    ファイルパスは相対パスか絶対パスでなければいけない。
    image.png

  • イメージimport
    docker importと同等。
    ファイルとイメージ名を指定してイメージをimportする。
    ファイルパスは相対パスか絶対パスでなければいけない。
    import時のtagを省略するとlatestになる。
    image.png

  • イメージload
    docker loadと同等。
    指定したファイルをloadする。
    ファイルパスは相対パスか絶対パスでなければいけない。
    image.png

  • コンテナの作成
    docker createと同等。
    選択したイメージをもとにコンテナを作成する。
    環境変数と起動コマンドを複数設定したい場合は,区切りで入力する。
    設定値に環境変数を使用した場合はOSの値を取得してセットする。
     例:PATH=$PATH:$GOPATH
    現時点でポートとボリュームの複数マッピングはできないが、今後それを可能にしていく。
    image.png

  • イメージ詳細
    docker inspectと同等。
    イメージの詳細をdetailパネルで確認することができる。
    スクロールしたい場合は、detailパネルで操作する必要がある。
    image.png

  • イメージ削除
    docker rmiと同様。
    指定したイメージを削除する。
    nで削除をキャンセル。
    image.png

  • イメージ削除(-f dangling=true)
    ビルド過程でできる<none>というようなイメージかつ使用されていないイメージを削除。
    nで削除をキャンセル。
    image.png

container list

  • コンテナの状態更新
    5秒間隔でコンテナの状態が更新される。

  • コンテナ起動
    docker startと同等。
    指定したコンテナを起動する。
    image.png

  • コンテナ停止
    docker stopと同等。
    指定したコンテナを停止する。
    image.png

  • コンテナexport
    docker exportと同等。
    指定したコンテナをexportする。
    image.png

  • コンテナcommit
    docker commitと同等。
    指定したコンテナをイメージに保存する。
    tagを省略するとlatestになる。
    image.png

  • コンテナ削除
    docker rmと同等。
    指定したコンテナを削除する。
    nで削除をキャンセル。
    image.png

  • コンテナ詳細
    docker inspectと同等。
    コンテナの詳細をdetailパネルで確認することができる。
    スクロールしたい場合は、detailパネルで操作する必要がある。
    image.png

volume list

  • ボリューム一覧
    docker volume listと同等。
    5秒間隔で更新される。
    image.png

  • ボリューム作成
    docker volume createと同等。
    ※ラベルやオプションを複数追加したい場合はスペース区切りで入力する。
    image.png

  • ボリューム削除
    docker volume rmと同等。
    image.png

  • ボリューム削除(prune)
    docker volume pruneと同等。
    使用していないボリュームをすべて削除する。
    image.png

detail

  • イメージ/コンテナ/ボリュームの詳細表示
    イメージ、コンテナ、ボリュームの中身によっては、画面に収まらない場合がある。
    その場合はjkでカーソル移動もしくはduでページ移動して内容を確認できる。
    detail.gif

docui構成

ディレクトリ構成は以下になっています。

docui
├── LICENSE
├── README.md
├── build
│   ├── Dockerfile
│   └── build.sh
├── common
│   └── common.go
├── docker
│   └── docker.go
├── main.go
├── panel
│   ├── containerPanel.go
│   ├── detailPanel.go
│   ├── gui.go
│   ├── imagePanel.go
│   ├── infoPanel.go
│   ├── inputPanel.go
│   ├── navigatePanel.go
│   ├── searchImagePanel.go
│   ├── searchImageResultPanel.go
│   └── volumePanel.go
└── wiki.md

パッケージはmainを除き、dockerpanelcommonの3つになっています。

  • docker
    dockerを操作の役割を持つ。

  • common
    全体で使用するような関数などを持つ。

  • panel
    画面描写・更新・キーバインドなど、画面に関する操作の役割を持つ。
    そのため、メインの処理はこのパッケージに詰まっている。

ちなみに、docuiで使用しているライブラリは以下2つです。

  • gocui
    cuiライブラリです。
    主に画面生成と描写・キーバインド設定を使っています。
    非同期の描写更新もサポートしていますが、
    プログレスバーといったリアルタイム更新はなぜかうまく動作しませんでした。
    gocui自体はキーバインドライブラリとしてtermbox-goというのを使用していて、
    キーイベント処理はtermbox-goが担っています。

  • docker-client
    dockerクライアントライブラリです。
    dockerに関する操作はこちらを通して行っています。
    公式のmobyプロジェクトがあるので、将来的にmobyに移行しようと考えています。

ソースはgithubにあげてありますので、
興味ある方はぜひ見てみてください。

アドバイス頂けると喜びます。

最後に

今回はざっくりツールについて紹介しました。
dockerを使って開発を行っている方など、ぜひ使ってみてください。
フィードバックもお待ちしております。

次回は実際作った時に躓いた箇所について記事を書きます。
docui自体はシンプルなので、そんなに書くことはないのですが、
自分の備忘録も兼ねて記事にしようと考えています。