docker 初体験
2013/09/02 追記: docker -> コンテナ内の /sbin/init のバインドマウントの代わりに 0.6 からは docker -> /.dockerinit に変わってます.(従来通り /sbin/init の設定になってるヤツも実行可能になってる) -> Fix to "Inject dockerinit at /.dockerinit" by sridatta · Pull Request #1267 · docker/docker · GitHub
先日の第1回コンテナ情報交換会で紹介していただいた docker ですが,何かにわかに盛り上がりだしましたね.やはり著名人が話題にすると違いますな :-).というわけで急遽試してます.まだまだ分からない事が多いけど,とりあえずメモ.
docker を使ってどうの,という世間一般の興味からズレて,docker がどう lxc を使っているか,というのが興味の中心だったりします.^^;
# docker run -i -t ubuntu:12.10 /bin/bash
のようにコンテナを起動して /bin/bash を実行します.するとこんな感じで実行されているのがわかります.
# ps axf : (snip) 1363 pts/2 Ssl+ 0:15 /usr/local/bin/docker -d 3661 pts/4 Ss 0:00 \_ lxc-start -n 2bca4c0732612be32fcb978c48c260c37a9b494cf37a6844f0ddefb2d4441ca1 -f /var/lib/docker/containers/2bca4c0732612be32fcb978c48c260c37a9b494cf37a6844f0ddefb2d4441ca1/config.lxc -- /sbin/init -g 172.16.42.1 -e TERM=xterm -e HOME=/ -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -- /bin/bash 3665 pts/4 S+ 0:00 \_ /bin/bash
ちょっと横長過ぎなので簡略化すると,こんなコマンドを実行しているわけですね.
# lxc-start -n (コンテナ名) -- /sbin/init -- /bin/bash
コンテナ内の lxc-start で /sbin/init -- /bin/bash を実行しているわけですね.しかし init にしては変な引数です.通常の Ubuntu の init は upstart ですが,ソレとは違う予感ですね.これは設定ファイルを見ればわかりました.
# cat /var/lib/docker/containers/2bca4c0732612be32fcb978c48c260c37a9b494cf37a6844f0ddefb2d4441ca1/config.lxc | egrep "^lxc\.mount\.entry" lxc.mount.entry = proc /var/lib/docker/containers/2bca4c0732612be32fcb978c48c260c37a9b494cf37a6844f0ddefb2d4441ca1/rootfs/proc proc nosuid,nodev,noexec 0 0 lxc.mount.entry = sysfs /var/lib/docker/containers/2bca4c0732612be32fcb978c48c260c37a9b494cf37a6844f0ddefb2d4441ca1/rootfs/sys sysfs nosuid,nodev,noexec 0 0 lxc.mount.entry = devpts /var/lib/docker/containers/2bca4c0732612be32fcb978c48c260c37a9b494cf37a6844f0ddefb2d4441ca1/rootfs/dev/pts devpts newinstance,ptmxmode=0666,nosuid,noexec 0 0 lxc.mount.entry = /usr/local/bin/docker /var/lib/docker/containers/2bca4c0732612be32fcb978c48c260c37a9b494cf37a6844f0ddefb2d4441ca1/rootfs/sbin/init none bind,ro 0 0 lxc.mount.entry = /etc/resolv.conf /var/lib/docker/containers/2bca4c0732612be32fcb978c48c260c37a9b494cf37a6844f0ddefb2d4441ca1/rootfs/etc/resolv.conf none bind,ro 0 0
/sbin/init の正体はホスト環境の /usr/local/bin/docker というわけですね.
docker attach とかすると,コンテナの標準入出力に接続する感じなのですが,その辺りもココ (dockerコマンド) に鍵がありそうですね.
(docker のコンテナ名が長過ぎで出力が横長なのはご容赦)
2013/07/06 追記: 続く... かな? と思ったけど続きません.私が知りたいのは大体以下に書かれていました.すばらしい.