TenForward

技術ブログ。はてなダイアリーから移転しました

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 追記: 続く... かな? と思ったけど続きません.私が知りたいのは大体以下に書かれていました.すばらしい.