Sunday, June 22, 2014

docker 1.0, OSX mavericks, part2

docker 1.0, OSX mavericks, part2

できたー!暫定だけどコンテナを252個以上立ち上げる事に成功.
色々探しまわって行き着いたのは以下の要因.

  • OSXのdockerインストーラはdockerのホストマシンをVirtuallboxを使って仮想マシンとして立ち上げている.
    • この仮想マシンがまず問題で、最低限dockerを実行するのに必要なものしか入っていない.よって細かい設定ができない??
    • dockerプロセスが開けるファイルの上限を設定したいのに/etc/init/docker.confがないので涙目になる.
  • 252個でコンテナが打ち止めになるのは1プロセスが開くことのできるデフォルトのファイル数上限が1024だから
    • /proc/${dockerのプロセスID}/limitsを見ると「Max open files 1024 4048 files」ってラインがあって、こいつの上限を上げる必要がある
    • ※ちょうどコンテナ数=253個目あたりでファイル数の上限に到達している.

無理やり動かすにはどうするか考えた結果、起動スクリプト「/etc/init.d/docker」を弄ってopen filesの上限を引き上げ、動作確認することにする。

動作確認

以下の一行をstart()の上のほうに追加する.

start() {
    DOCKER_DIR=/var/lib/docker
    mkdir -p "$DOCKER_DIR"

    ulimit -n 65535 # <-- これ!

続いて既存のdockerプロセスを止めるために何度か/etc/init.d/docker stop
するも、止まる気配がない…のでプロセスIDを調べてkill -9 ${プロセスID}コマンドで強制停止.(仮想マシンだから壊れてもいいくらいのでノリ)

/etc/init.d/docker startで再起動.
プロセスIDを確認して前回と異なるプロセスIDで立ち上がったことを確認. open filesに関する制限を再確認.

$ less /proc/14311/limits
...
Max open files            65535                65535                files
...

いいねいいね.

続いて前回のhello world x 1000(今回は300に抑えた)を実行.
この前に前回のコンテナの情報をdocker stop, docker rmで削除.

$ ./run-multiple-docker.sh 
...
2c3c712abfa5d1aee070ad9cddaddedbf9d7e1d983c144125b7847044a925e33
b06d57ce41f7bb2572bd134ffa58ae1d23d5595f0ef09de9c3163921c36cadbf
2014/06/22 20:45:41 Error: Cannot start container b06d57ce41f7bb2572bd134ffa58ae1d23d5595f0ef09de9c3163921c36cadbf: file exists
...
d87b5344f2e3cfea5bc623123f01554bfa7c8fe34dc31b0fc3d2c51a7a408594
e3519356e2b403a055dfaea0952b46d555af91711b1cb3f27b3350b057bf2ad4
22ee510ef1b0f7cef812a8a42e970a38a869c1afb47369699eab72f84aa7e5d2
f0696f17d8519f44dee365af3732de7df7aca7a6e63cc8a2f8c36c146ffe3a54
52f707fecd5be873d50a971031fab8488649f82b10871241b2558470a3a5b569
2014/06/22 20:50:25 Error: Cannot start container 52f707fecd5be873d50a971031fab8488649f82b10871241b2558470a3a5b569: Cannot find child for /yukaary_260
6a2aceb79c041ae4cbe44b7878503cc212dfba26abc78748a5be086c2e066b8b
54c28d69f9f97bae01f50aae4707192d417c35dd633a1c28355a8ba806bad21a
...
$ docker ps | wc -l
     299

やったぜ.

2つこけてるコンテナがいるのはなんだろな.

  • そのハッシュ値のコンテナに関するファイルが既にある
  • yukaary_260に関連する子要素が見つからない

なんとなくだけど、次のコンテナを立ち上げる前に1秒くらい待機させたほうがいいかも.

ここでdockerホストマシンで下のコマンドを打つと、こんなのが299個続く.

$ ps aux | grep hello
  463 root     /bin/sh -c while true; do echo hello world; sleep 1; done
  548 root     /bin/sh -c while true; do echo hello world; sleep 1; done
  588 root     /bin/sh -c while true; do echo hello world; sleep 1; done
  ...

単にhello worldさせているだけだと「ひたすら回りくどいやり方でhello worldするプログラムを299個動かしている」だけ.これを見てfull VMじゃなくただのOSコンテナなんだなーと実感.見た目上は全く同じように見えるけど、表に出ていないだけでカーネルの名前空間がきっと違う.

まとめ

ちなみに問題が残っていてOSX側でboot2docker restartとやると,/etc/init.d/dockerに追記したulimitが消える.きっとvagrantとかchef的な何かがプロビジョニングしているためと信じているが、その設定がどこにあるのか分からない .boot2dockerもdockerもバイナリだし、使い勝手が地味に悪い…

ここまで来て「これ、普通にvirtualboxでubuntu 14.04動かしてapt-getでdockerインストールしたほうがマシなんじゃ…?」と気づいた.

次はdockerを進める前にLINCXとかいうSDN スイッチを弄ってみよう…名前がかっこいい!

参考

まさかのelastic_searchで同じファイル数上限問題に遭遇している方がいて,その方の情報が参考になった.

No comments:

Post a Comment