なぜ Talk2Docker を作ったか

今となってはもう古いツールとなってしまった [talk2docker](https://github.com/ailispaw/talk2docker) ですが、当時を振り返ってメモ的に残しておこうと思います。
個人的には未だに使う場面があるんですけども。

## １．複数のホストを簡単に切り替えて Docker を使いたかった

複数の Docker ホストを切り替えるには `DOCKER_HOST` 等の環境変数を書き換える必要がありました。`docker-machine` を使ってホストを作成した場合は `eval` で簡単に切り替えることは出来ますが、そもそも `docker-machine` が面倒なんですよね。引数も多いし、プロバイダ毎に引数も違うし煩雑で。
ホストをプロビジョニングするのは使い慣れたツールを使って、後は統一的にホストにアクセス出来るツールが欲しかったというのがありました。
もちらん `docker-machine` でも `generic driver` を使えば同じようなことが出来ますが、ただそれだけで、`docker-machine` 自体では Docker コマンドは使えません。

Talk2Docker では、Docker Remote API のエンドポイントを登録すれば簡単に切り替えて使えます。初期起動時には `DOCKER_HOST` の内容を自動的に取り込んで `default` として設定します。

```bash
$ vagrant up
$ talk2docker hosts
+---+-------------------+-------------------------+-------------+-----+
|   |       NAME        |           URL           | DESCRIPTION | TLS |
+---+-------------------+-------------------------+-------------+-----+
| * | default           | tcp://localhost:2375    |             |     |
+---+-------------------+-------------------------+-------------+-----+
$ talk2docker ls
+--------------+----------------+----------+---------------------+
|      ID      |   NAME:TAGS    | SIZE(MB) |     CREATED AT      |
+--------------+----------------+----------+---------------------+
| 307ac631f1b5 | busybox:latest |    1.113 | 2016-03-19 03:22:48 |
+--------------+----------------+----------+---------------------+
```

後は xhyve だろうが、veetu だろうが、AWS だろうが登録すれば普通に使えます。

```bash
$ talk2docker host add docker-root-xhyve tcp://192.168.64.2:2375
+---+-------------------+-------------------------+-------------+-----+
|   |       NAME        |           URL           | DESCRIPTION | TLS |
+---+-------------------+-------------------------+-------------+-----+
|   | default           | tcp://localhost:2375    |             |     |
|   | boot2docker-xhyve | tcp://192.168.64.3:2375 |             |     |
| * | docker-root-xhyve | tcp://192.168.64.2:2375 |             |     |
|   | coreos-veetu      | tcp://192.168.64.8:2375 |             |     |
+---+-------------------+-------------------------+-------------+-----+
$ talk2docker host sw boot2docker-xhyve
+---+-------------------+-------------------------+-------------+-----+
|   |       NAME        |           URL           | DESCRIPTION | TLS |
+---+-------------------+-------------------------+-------------+-----+
|   | default           | tcp://localhost:2375    |             |     |
| * | boot2docker-xhyve | tcp://192.168.64.3:2375 |             |     |
|   | docker-root-xhyve | tcp://192.168.64.2:2375 |             |     |
|   | coreos-veetu      | tcp://192.168.64.8:2375 |             |     |
+---+-------------------+-------------------------+-------------+-----+
```

```bash
$ talk2docker config cat # cat ~/.talk2docker/config
default: default
hosts:
- name: default
  url: tcp://localhost:2375
- name: boot2docker-xhyve
  url: tcp://192.168.64.3:2375
- name: docker-root-xhyve
  url: tcp://192.168.64.2:2375
- name: coreos-veetu
  url: tcp://192.168.64.8:2375
```

TLS を使う場合は ~/.talk2docker/config を直接編集する必要がありますが、

```
- name: boot2docker
  url: tcp://192.168.59.103:2376
  description: on boot2docker-vm managed by boot2docker
  tls: true
  tls-ca-cert: /Users/ailispaw/.boot2docker/certs/boot2docker-vm/ca.pem
  tls-cert: /Users/ailispaw/.boot2docker/certs/boot2docker-vm/cert.pem
  tls-key: /Users/ailispaw/.boot2docker/certs/boot2docker-vm/key.pem
  tls-verify: true
```

一度編集してしまえば、

```bash
$ talk2docker hosts
+---+-------------------+---------------------------+------------------------------------------+-----+
|   |       NAME        |            URL            |               DESCRIPTION                | TLS |
+---+-------------------+---------------------------+------------------------------------------+-----+
| * | default           | tcp://localhost:2375      |                                          |     |
|   | boot2docker-xhyve | tcp://192.168.64.3:2375   |                                          |     |
|   | docker-root-xhyve | tcp://192.168.64.2:2375   |                                          |     |
|   | coreos-veetu      | tcp://192.168.64.8:2375   |                                          |     |
|   | boot2docker       | tcp://192.168.59.103:2376 | on boot2docker-vm managed by boot2docker | YES |
+---+-------------------+---------------------------+------------------------------------------+-----+
$ talk2docker host sw boot2docker
+---+-------------------+---------------------------+------------------------------------------+-----+
|   |       NAME        |            URL            |               DESCRIPTION                | TLS |
+---+-------------------+---------------------------+------------------------------------------+-----+
|   | default           | tcp://localhost:2375      |                                          |     |
|   | boot2docker-xhyve | tcp://192.168.64.3:2375   |                                          |     |
|   | docker-root-xhyve | tcp://192.168.64.2:2375   |                                          |     |
|   | coreos-veetu      | tcp://192.168.64.8:2375   |                                          |     |
| * | boot2docker       | tcp://192.168.59.103:2376 | on boot2docker-vm managed by boot2docker | YES |
+---+-------------------+---------------------------+------------------------------------------+-----+
```

でOK。

ちなみに、いちいちホストを切り替えなくてもコマンドラインで直接指定することも出来ます。

```bash
$ talk2docker -H docker-root-xhyve ls
+--------------+----------------+----------+---------------------+
|      ID      |   NAME:TAGS    | SIZE(MB) |     CREATED AT      |
+--------------+----------------+----------+---------------------+
| 307ac631f1b5 | busybox:latest |    1.113 | 2016-03-19 03:22:48 |
+--------------+----------------+----------+---------------------+
```

また、config ファイルも複数持つことが出来るので、プロジェクトによって大きく切り替えることも出来ます。

```bash
$ talk2docker -C ./talk2docker.yml ls
# or
$ export TALK2DOCKER_CONFIG=./talk2docker.yml
$ talk2docker ls
```

ちなみに、talk2docker 自体はもう古い API しか対応していませんが、Docker  コマンドのラッパーモードがあるので、この機能と組み合わせれば Docker を複数ホストで使えます。

```bash
$ talk2docker -H docker-root-xhyve docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
busybox                     latest              307ac631f1b5        10 days ago         1.113 MB
```

## ２．イメージのツリー表示を残したかった

初期の頃の Docker をご存じの方は覚えておられると思いますが、かつて `docker images` には `-t` オプションがありまして、イメージのレイヤの親子関係が一目瞭然でした。今は無くなってしまったのですが、それがどうしても欲しかったというのもあります。

```bash
$ talk2docker  ls
+--------------+----------------------------------+----------+---------------------+
|      ID      |            NAME:TAGS             | SIZE(MB) |     CREATED AT      |
+--------------+----------------------------------+----------+---------------------+
| 4b30b3770191 | ailispaw/godep-goxc:latest       |  477.489 | 2016-03-29 10:43:09 |
| a55891108266 | ailispaw/php5:latest             |  140.192 | 2016-03-29 10:40:43 |
| 5ab68d9c4d89 | ailispaw/dnsdock:latest          |   25.736 | 2016-03-29 10:38:46 |
| 7d2d969448b4 | ailispaw/loop:latest             |    1.113 | 2016-03-29 10:38:30 |
| d4b0897e4db2 | ailispaw/docker-root:latest      |   17.222 | 2016-03-25 10:16:10 |
| 3758f055b7d7 | ailispaw/ubuntu-essential:latest |   61.240 | 2016-03-19 09:38:34 |
| 307ac631f1b5 | busybox:latest                   |    1.113 | 2016-03-19 03:22:48 |
+--------------+----------------------------------+----------+---------------------+
$ talk2docker ls -a
+----------------------+----------------------------------+----------+
|          ID          |            NAME:TAGS             | SIZE(MB) |
+----------------------+----------------------------------+----------+
| ├ d2a275bf4072       |                                  |   17.222 |
| │└ cbb48f4af836      |                                  |   17.222 |
| │ └ d4b0897e4db2     | ailispaw/docker-root:latest      |   17.222 |
| │  └ 2d5831817e61    |                                  |   25.736 |
| │   └ 5ab68d9c4d89   | ailispaw/dnsdock:latest          |   25.736 |
| ├ ddf600787acd       |                                  |   61.240 |
| │└ 3758f055b7d7      | ailispaw/ubuntu-essential:latest |   61.240 |
| │ ├ e4efc93ee0a2     |                                  |  129.738 |
| │ │└ 8007ea70e2e3    |                                  |  129.738 |
| │ │ └ b178fa5e0f27   |                                  |  129.738 |
| │ │  └ e9c9e3502d43  |                                  |  447.700 |
| │ │   └ 4b30b3770191 | ailispaw/godep-goxc:latest       |  477.489 |
| │ └ a55891108266     | ailispaw/php5:latest             |  140.192 |
| └ 4b51ded9aed1       |                                  |    1.113 |
|  └ 307ac631f1b5      | busybox:latest                   |    1.113 |
|   └ 332b0b2f9203     |                                  |    1.113 |
|    └ 7d2d969448b4    | ailispaw/loop:latest             |    1.113 |
+----------------------+----------------------------------+----------+
```

それから、作成時間は xxxxx ago じゃなくて正確な時間が知りたかったというものあります。

## ３．結果を JAON や YAML で出力したかった

```bash
$ talk2docker ls busybox
+--------------+----------------+----------+---------------------+
|      ID      |   NAME:TAGS    | SIZE(MB) |     CREATED AT      |
+--------------+----------------+----------+---------------------+
| 307ac631f1b5 | busybox:latest |    1.113 | 2016-03-19 03:22:48 |
+--------------+----------------+----------+---------------------+
$ talk2docker ls busybox -J
[
  {
    "Created": 1458325368,
    "Id": "307ac631f1b53c62d39e9c9e81bdbdbb50a2295c35fb0ec672d168a0b129a623",
    "ParentId": "4b51ded9aed1607365d12758fa63fd011891a3f25249d3cd8783a56b8529d197",
    "RepoTags": [
      "busybox:latest"
    ],
    "Size": 0,
    "VirtualSize": 1112820
  }
]
$ talk2docker ls busybox -Y
- created: 1458325368
  id: 307ac631f1b53c62d39e9c9e81bdbdbb50a2295c35fb0ec672d168a0b129a623
  parentid: 4b51ded9aed1607365d12758fa63fd011891a3f25249d3cd8783a56b8529d197
  repotags:
  - busybox:latest
  size: 0
  virtualsize: 1112820
```

## ４．fig/compose も統合したかった

`docker run` の引数を打つのはとても面倒ですよね。やはり fig/compose は便利です。
でも `docker-machine`、`docker-compose`、`docker` と３つに分かれているというのは使いにくいです。
そこで、talk2docker で `compose` コマンドを実装してみました。
v2 には対応してませんが、ほぼ v1 互換で使えます。

```bash
$ talk2docker compose wordpress.yml
```

工夫した点は、単純に YAML ファイルを使用することも出来ますが、それをテンプレートとして、コマンドラインから動的にオーバーライド出来るようにしたところです。
また、テンプレート内の個々のエントリを選択的に実行出来ます。

```bash
$ talk2docker docker -- network create -d overlay wordpress
$ talk2docker compose wordpress.yml db --net=wordpress
```

のようにネットワークだけ切り替えることが来ます。
ただし、talk2docker の compose はコンテナを create するだけで、別途　start させる必要があります。