今となってはもう古いツールとなってしまった talk2docker ですが、当時を振り返ってメモ的に残しておこうと思います。
個人的には未だに使う場面があるんですけども。
1.複数のホストを簡単に切り替えて Docker を使いたかった
複数の Docker ホストを切り替えるには DOCKER_HOST
等の環境変数を書き換える必要がありました。docker-machine
を使ってホストを作成した場合は eval
で簡単に切り替えることは出来ますが、そもそも docker-machine
が面倒なんですよね。引数も多いし、プロバイダ毎に引数も違うし煩雑で。
ホストをプロビジョニングするのは使い慣れたツールを使って、後は統一的にホストにアクセス出来るツールが欲しかったというのがありました。
もちらん docker-machine
でも generic driver
を使えば同じようなことが出来ますが、ただそれだけで、docker-machine
自体では Docker コマンドは使えません。
Talk2Docker では、Docker Remote API のエンドポイントを登録すれば簡単に切り替えて使えます。初期起動時には DOCKER_HOST
の内容を自動的に取り込んで default
として設定します。
$ 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 だろうが登録すれば普通に使えます。
$ 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 | | |
+---+-------------------+-------------------------+-------------+-----+
$ 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
一度編集してしまえば、
$ 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。
ちなみに、いちいちホストを切り替えなくてもコマンドラインで直接指定することも出来ます。
$ 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 ファイルも複数持つことが出来るので、プロジェクトによって大きく切り替えることも出来ます。
$ talk2docker -C ./talk2docker.yml ls
# or
$ export TALK2DOCKER_CONFIG=./talk2docker.yml
$ talk2docker ls
ちなみに、talk2docker 自体はもう古い API しか対応していませんが、Docker コマンドのラッパーモードがあるので、この機能と組み合わせれば Docker を複数ホストで使えます。
$ talk2docker -H docker-root-xhyve docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
busybox latest 307ac631f1b5 10 days ago 1.113 MB
2.イメージのツリー表示を残したかった
初期の頃の Docker をご存じの方は覚えておられると思いますが、かつて docker images
には -t
オプションがありまして、イメージのレイヤの親子関係が一目瞭然でした。今は無くなってしまったのですが、それがどうしても欲しかったというのもあります。
$ 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 じゃなくて正確な時間が知りたかったというものあります。
3.結果を JAON や YAML で出力したかった
$ 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
4.fig/compose も統合したかった
docker run
の引数を打つのはとても面倒ですよね。やはり fig/compose は便利です。
でも docker-machine
、docker-compose
、docker
と3つに分かれているというのは使いにくいです。
そこで、talk2docker で compose
コマンドを実装してみました。
v2 には対応してませんが、ほぼ v1 互換で使えます。
$ talk2docker compose wordpress.yml
工夫した点は、単純に YAML ファイルを使用することも出来ますが、それをテンプレートとして、コマンドラインから動的にオーバーライド出来るようにしたところです。
また、テンプレート内の個々のエントリを選択的に実行出来ます。
$ talk2docker docker -- network create -d overlay wordpress
$ talk2docker compose wordpress.yml db --net=wordpress
のようにネットワークだけ切り替えることが来ます。
ただし、talk2docker の compose はコンテナを create するだけで、別途 start させる必要があります。