Docker初心者にオススメのゴリラ製ツール

こんにちわ
ゴリラです。

みなさんDockerは好きですか？
自分はDocker好きです。
Docker面白いですよね。

本記事は、ゴリラによるDockerユーザのためのゴリラ製Dockerツールを紹介します。

<a href="https://github.com/skanehira/docui"><img src="https://qiita-image-store.s3.amazonaws.com/0/66178/a7a116da-22e3-9c91-0609-e07df3be0e55.png" width="460px"></a>

以前[こちらの記事](https://qiita.com/gorilla0513/items/814f369bb25b1ea3ae00)でも作ったことを紹介したのですが、
あれから少し進化してより便利になったので、再度紹介します。

これからDockerを始めよう、
もしくはすでに始めている方にとって便利なツールかなと思います。

# どういうツール
直感的にDockerを操作できるTUIツールです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/4d8a0772-b742-33e6-641d-cbbfa95e6aa6.png)

# できること
現時点でできることは以下になります。

- **image**
    - search/pull/remove
    - save/import/load
    - inspect/filtering
- **container**
    - create/remove
    - start/stop
    - export/commit
    - inspect/rename/filtering
    - attach
- **volume**
    - create/remove/prune
    - inspect/filtering
- **network**
    - remove
    - inspect/filtering

まだ実装できていないものがありますが、
基本的にDocker単体でできることは大体カバーしています。

次、構成について説明していきます。

# 構成
## info panel
画面最上部に

- DockerのAPIバージョン
- Docker Engineのバージョン
- DockerのEndpoint
- docuiのバージョン

が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/9ad5fdc6-6114-e109-b79d-afb82eac85e8.png)

## task list
イメージ取得やコンテナ作成など、各操作が非同期で動きます。
どんな操作がどういう状態なのかを確認するパネルになります。
将来的には履歴から同じ操作を行えるようにする予定です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/e44022bc-276e-49b4-b1a1-248b9f2b640c.png)

## image list
現在あるイメージが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/8decfa61-c204-d238-a74f-4920fe48ed0a.png)

## container list
現在あるコンテナが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/469aba84-7bae-155b-bac3-2b44f2341dec.png)

## volume list
現在あるボリュームが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/da9adc2e-5407-be5d-bd88-6b38edae555e.png)

## network list
現在あるネットワークが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/0721216e-fb2d-48cf-ece3-339b881754b3.png)

## navigate panel
各パネルで可能な操作とキーが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/b46db328-1010-7d2f-ff03-5da8043eb640.png)

## ログ
docuiではエラーが起きた時に、エラーの内容がログに出力されます。
ログの場所は`$HOME/docui.log`にあります。
バグの解析などで使用することがメインなので、普段見る必要はありません。

```
time="2019-01-27T18:28:12+09:00" level=info msg="docui start" func=main.main file="/Users/skanehira/dev/go/src/github.com/skanehira/docui/main.go:14"
time="2019-01-27T18:28:23+09:00" level=info msg="inspect network start" func="github.com/skanehira/docui/panel.(*NetworkList).Detail" file="/Users/skanehira/dev/go/src/github.com/skanehira/docui/panel/networkPanel.go:245"
time="2019-01-27T18:28:23+09:00" level=info msg="inspect network finished" func="github.com/skanehira/docui/panel.(*NetworkList).Detail" file="/Users/skanehira/dev/go/src/github.com/skanehira/docui/panel/networkPanel.go:275"
time="2019-01-27T18:30:26+09:00" level=info msg="remove network start" func="github.com/skanehira/docui/panel.(*NetworkList).RemoveNetwork.func1.1" file="/Users/skanehira/dev/go/src/github.com/skanehira/docui/panel/networkPanel.go:288"
time="2019-01-27T18:30:26+09:00" level=info msg="remove network finished" func="github.com/skanehira/docui/panel.(*NetworkList).RemoveNetwork.func1.1" file="/Users/skanehira/dev/go/src/github.com/skanehira/docui/panel/networkPanel.go:296"
time="2019-01-27T18:32:05+09:00" level=info msg="remove image start" func="github.com/skanehira/docui/panel.(*ImageList).RemoveImage.func1.1" file="/Users/skanehira/dev/go/src/github.com/skanehira/docui/panel/imagePanel.go:682"
time="2019-01-27T18:32:05+09:00" level=info msg="remove image finished" func="github.com/skanehira/docui/panel.(*ImageList).RemoveImage.func1.1" file="/Users/skanehira/dev/go/src/github.com/skanehira/docui/panel/imagePanel.go:691"
time="2019-01-27T18:46:23+09:00" level=info msg="docui finished" func=main.main file="/Users/skanehira/dev/go/src/github.com/skanehira/docui/main.go:19"
```

# 使い方
各パネルでできることをgif付きで紹介していきます。

## イメージ系操作
### イメージ検索
<kbd>Ctrl</kbd> + <kbd>f</kbd> で検索フォームが出ます。
検索したいイメージ名を入力して<kbd>Enter</kbd>を押すと検索結果が出てきます。
取得したいイメージを選択して、<kbd>Enter</kbd>を押すとイメージを取得してくれます。

![image_search.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/15162ea4-99c0-fa74-df76-d1ff536b4df9.gif)

### イメージ取得
<kbd>p</kbd> で取得したいイメージ名を入力して取得できます。
非同期で動くので、大きいなイメージを取得している間はコンテナを作ったりする事ができます。
![image_pull.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/0e6b0763-502e-b281-30a2-531d590a2018.gif)

### イメージ削除
<kbd>d</kbd> でイメージを削除できます。
間違って削除してしまわないように確認ダイアログがでます。
![image_remove.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/3c576e6e-6c62-09d9-6e5d-dd04a9163d2c.gif)

### イメージ保存
<kbd>s</kbd> でイメージを保存できます。
ファイルパスは絶対パスでなければいけないです。
ファイル名のみの場合はカレントディレクトリに出力されます。
![image_save.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/a896d62a-863a-e9a9-bb53-d71521676cde.gif)

### イメージインポート
<kbd>i</kbd> でイメージをインポートできます。
ファイルパスは絶対パスでなければいけないです。
ファイル名のみの場合はカレントディレクトリを見に行きます。
イメージインポートはファイルシステムだけインポートします。（個人的に使いみが思いつかない)
![image_import.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/242bd458-d433-1aa7-8384-f91bb7f50a87.gif)

### イメージロード
<kbd>Ctrl</kbd> + <kbd>l</kbd> でイメージをロードできます。
ファイルパスは絶対パスでなければいけないです。
ファイル名のみの場合はカレントディレクトリを見に行きます。
![image_load.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/c3981e3c-7105-2ed8-8fe3-84231926b3d7.gif)

### イメージの詳細
<kbd>Enter</kbd> でイメージの詳細を確認できます。
内部では`docker inspect`しているだけです。
![image_inspect.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/f1cb2f7a-b6ff-2c2a-2684-656c0c5ec40f.gif)

### イメージのフィルタリング
<kbd>f</kbd> でイメージ一覧のフィルタリングができます。
イメージが多い時に真価が発揮します。
![image_filtering.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/6c9a307c-aef5-9114-a2c4-eb62645d3b18.gif)

## コンテナ系操作
### コンテナ作成
<kbd>Ctrl</kbd> + <kbd>c</kbd> でコンテナ作成フォームが出ます。
全オプションは対応していないのですが、主要のオプションのみ用意してあります。
オプションを入力してCreateボタンを押すとコンテナが作成されます。
![container_create.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/58aa6415-8a3e-8311-f7f3-28ee7b0f75c1.gif)

### コンテナ削除
<kbd>d</kbd> でコンテナを削除できます。
間違って削除してしまわないように確認ダイアログがでます。
![container_remove.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/a2376e64-9775-b3eb-c3ff-5353f4a75789.gif)

### コンテナ開始
<kbd>u</kbd> でコンテナを起動します。
毎回`docker start container`しなくて済むので楽ですね。
![container_start.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/5d062373-0d93-c826-885f-18c86e82eac8.gif)

### コンテナ停止
<kbd>s</kbd> でコンテナを止めます。
毎回`docker stop container`しなくて済むので楽ですね。
![container_stop.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/2d65b176-7437-0dc3-c1fa-01e96f17aa8a.gif)

### コンテナ名変更
<kbd>r</kbd> でコンテナ名を変更できます。
`docker container rename old new`しなくて済むので楽ですね。
![container_rename.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/3b87715c-cb23-0bf7-e209-867ba2697a0d.gif)

### コンテナのアタッチ
<kbd>Ctrl</kbd> + <kbd>c</kbd> でコマンド（bashやsh）を入力してコンテナへアタッチできます。
コンテナが起動していないときはダイアログが出ます。
内部で`docker exec -it container cmd`していますので、抜けてもコンテナが落ちることはないです。
個人的に気にっている機能の一つです。
![container_attach.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/1be76441-9756-b473-ebea-f7c0121ab777.gif)

### コンテナの詳細
<kbd>Enter</kbd> でコンテナの詳細を確認できます。
内部では`docker inspect`しているだけです。
![container_inspect.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/5248e2af-d6f7-f72f-8aaa-8f321dc0a751.gif)

### コンテナのフィルタリング
<kbd>f</kbd> でコンテナ一覧のフィルタリングができます。
![container_filtering.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/8edf02c8-9005-5bcb-c04f-55c083928a7f.gif)

## ボリューム系操作
### ボリューム作成
<kbd>c</kbd> でオプションを入力でき、ボリュームを作成できます。
![volume_create.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/18179eb7-db19-4d22-de83-76d3e4fbf7ab.gif)

### ボリューム削除
<kbd>d</kbd> でボリュームを削除できます。
間違って削除してしまわないように確認ダイアログがでます。
![volume_remove.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/c6eb6fdb-ec99-d144-daf8-6801b86b6b67.gif)

### ボリュームの詳細
<kbd>Enter</kbd> でボリュームの詳細を確認できます。
![volume_inspect.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/eebd7430-3369-148f-550b-6d5ef5406750.gif)

### ボリュームのフィルタリング
<kbd>f</kbd> でボリューム一覧をフィルタリングできます。
![volume_filtering.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/7cc4ba50-ec9e-5f37-5118-286ae081c515.gif)

## ネットワーク系操作
### ネットワークの削除
<kbd>d</kbd> でネットワークを削除できます。
間違って削除してしまわないように確認ダイアログがでます。
![network_remove.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/03b8c110-d282-3a04-86f3-3bcee385317f.gif)

### ネットワークの詳細
<kbd>Enter</kbd> でネットワークの詳細を確認できます。
内部では`docker inspect`しているだけです。
![network_filtering.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/772888e0-6f4b-5c41-4952-16e157078127.gif)

### ネットワークのフィルタリング
<kbd>f</kbd> でネットワーク一覧をフィルタリングできます。
![network_filtering.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/7a587ed0-599b-6f1c-dd40-11ef0dd91887.gif)

# 今後について
まだまだ実装したい機能があるので、
今後もゆっくりではあるんですが、更に使いやすくなるよう進化していきます。
issueとPR大歓迎なので、お待ちしています。

ちなみに、docuiとは関係ないのですが、
将来的には`docker-compose`と`k8s`も同じようなツールも作っていく予定です。

では良いDockerライフを〜