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