Edited at

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自体はシンプルなので、そんなに書くことはないのですが、

自分の備忘録も兼ねて記事にしようと考えています。