はじめに
docker
を使う上で自分が使っているシチュエーション別 の一般的にはタメにならない小小技を披露。尚、試した環境は以下の通り。
- Ubuntu 13.10(ホストマシン)
- Docker 0.7
もっと効率良い方法があるだらう。
参考
- docker inspectでDockerコンテナの情報を取得する
- Dockerで使える便利コマンド
- https://github.com/dotcloud/docker/pull/2921
- http://golang.org/pkg/text/template/
自分は何に docker を使っているのか?
- ツールの簡単なテスト(最近だと
fluentd
とかelasticsearch
とか大体はdocker
で片付ける) Chef
の単体テスト的なこと(test-kitchen
)
まあ、大体のことが docker で片付くが docker
ではその性質上(コンテナ型仮想環境)片付けられないこともあるんだろうなあと思っているが、今のところそんな状況に出会ったことは無い。
小小技
コンテナの IP を知る
コンテナに ssh
でアクセスする時に、「あれ、コンテナの IP って?」という時に以下を実行する。
docker inspect ${コンテナの ID} | jq '.[] .NetworkSettings |{IPAddress}'
jq が必要になるけど以下のような結果になる。
{ "IPAddress": "172.xxx.xx.xx" }
ついでにホスト名も知りたい場合には以下のようにする。
docker inspect ${コンテナの ID} | jq '.[].Config, .[].NetworkSettings|{Hostname, IPAddress}'
以下のような結果となり研究が必要...
{ "IPAddress": null, "Hostname": "212e80737ca2" } { "IPAddress": "172.xxx.xxx.xxx", "Hostname": null }
ちなみに、以下のようにすればちょっとマシになる。
docker inspect xxxxxxxxx | jq '.[].Config.Hostname, .[].NetworkSettings.IPAddress'
以下のように出力される。
xxxxxxxxx 172.17.xx.xx
ちょっとマシ。
jq
を使った方法については以下のようにすると良さそう。
docker inspect xxxxxxxxx | jq '.[].NetworkSettings.IPAddress' | cut -d\" -f2
コンテナの IP を知る(2)
こちらやこちらの記事で docker inspect
に --format
というオプションがあり以下のようにしても IP
アドレスが取得可能と教えて頂いた。(当初、手元の docker 0.7.0
では取得することは出来なかったが docker 0.7.2
で試したところ取得出来た。詳細はこちら。)
docker inspect -format="{{ .NetworkSettings.IPAddress }} ${container_ID}"
おお、素晴らしい。ちなみに go
言語の構文が使えるとのこと。やっぱり、go
なんだなー。
稼働中のコンテナを一気に停止したい
コンテナの停止には docker stop
を利用するが、これを for
で回せば一気に止めることが出来る。
for i in `sudo docker ps -q | grep -v 'CONTAINER ID'`; do sudo docker stop $i; done
応用で使ったコンテナを一気に消す場合には以下のようにする。
for i in `sudo docker ps -a -q`; do sudo docker rm $i; done
ただし、STATUS
が Ghost
になっているコンテナはこの方法ではムリ(エラーになる)。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ba111474b065 2d59c9c741bb /usr/sbin/sshd -D -o 5 days ago Ghost 0.0.0.0:49171->22/tcp high_babbage 2081454160cd 2d59c9c741bb /usr/sbin/sshd -D -o 5 days ago Ghost 0.0.0.0:49169->22/tcp prickly_poincare
さて、困った。
Ghost になったコンテナを葬る
Ghost
になってしまっているコンテナに成仏して頂く為には以下のようにしている。
docker を停止する
sudo service docker stop
コンテナを物理的に削除する
消してもまた作ればいいという発想でイジれるのが docker
のまたいいところだと思っているので...
sudo su - cd /var/lib/docker/containers rm -rf *
docker を再開する
sudo service docker start
但し、これはベストプラクティスではないはずなので、引き続き、ちゃんとした方法を模索中。
dockerui を試す
以前に試した時にはうまく動いていたけど、現状、手元の環境では動いていない...。docker 0.7
だからかなと思ったり。
最後に
docker
オモロイ