Dockerを使ってみて。

とにかく時間がないのは半分こいつのせいだが感想を書いておく。

Versionは7.2、CentOS6.5に乗っかているやつである。

前提

  • SSDを使っている
  • docker buildコマンドは使ってない。
    • なのでまあ初期実行スクリプトを書いてそいつを呼ぶ起動方式がいい。

docker run -i -d -t base /bin/bash /start.sh

利点

  • VMの上でVMみたいなのを営巣できる。
    • root権限さえあればなんとでもなるぜひゃっはー
  • 起動は速い
    • とは言えストレージに負荷がかかるように思う(HDDだと速度はかなり遅くなるような気がする。)
    • 起動が速いので高速量産が可能
  • メモリ使用量は格段に小さい。
    • あとサイズを基本制限する必要が無いので、決定が不要でオーバーコミットに似た気軽さがある。
  • サイズは小さい
    • 配布されているイメージはUbuntuで175MB、CentOSで300MBではある。
      • 中に本当に必要最低限の物しか入ってないので要注意。ubuntuにはviすらなかった。
      • なのでモデルのイメージをまず作るのがめんどくさい。
    • が、使っているうちにだいたい2GB前後には成る(差分保管なのでimageの数の割にはサイズは少ない)
  • バージョン管理は便利
    • こまめにcommitとrunをしていればやり直しは非常に簡単である。
  • イメージの持ち運びも比較的簡単に出来る。
    • ファイルにエクスポートしてインポートが可能

制限事項

  • x64のみサポート
    • 一応ARMで動くらしいが・・・
  • サービスの呼び出しがとにかく普通にできない。起動スクリプトを書く前提で以下の制約がかかる。
    • service コマンド startとか駄目、/etc/init.d/なんか startとかならOK。
    • でもsshは/usr/sbin/sshd -Dとか最後に書かないといけない。&をつけるとコケる。
  • CRONがうまく動かない。
    • CRONDを起動しても動いてくれないみたいな。
    • そこはshellで何とかするしかないんだけどそれも不完全・・・方法は何があるか考える必要が
  • IPアドレスがRUNの度インクリメントしていく
  • FUSEというかmount周りが現状使えない
    • Ubuntuのupdateやバージョンアップでハマる
    • この場合、該当のパッケージ(initscript,ifdown等)をapt-get installで先にアップデートすればOK
    • なのでsshfsとかnfsとかcifsとかいろいろ使えない。
      • データの安全な共有はDBかKVS経由出やるしか無いのではと思われる。
  • ライブマイグレーションができない。
    • KVMとかXENは普通にできるので、出来るようになると嬉しいが原理的に難しい?
  • 環境変数がめんどくさい
    • まあ/etc/profile.d/env.shとかでexportしたら大丈夫ではある。
    • Ubuntuはちょっと微妙。多分書くとこ間違ってるので反映されない。
  • ポートをホストにバインドできるが、外からアクセスさせるにはiptablesのフォワード設定が必要
    • もちろん、ipv4のパケットフォワードの設定もホストに必要。
  • コンテナ間通信がめんどくさい
    • コンテナに名前は起動時に設定できるが、コンテナ内部からはわからない。
    • linkオプションがあるが互いに名前が判明している限りに於いてのみ有効
      • 要するにアドホックに立ち上がってコンテナが自分の名前は何か知るすべはない。
      • この辺に於いてSerfとかが好まれるのではと思う。
    • DDNSでも立てて内部スクリプトを書いて起動引数に独自に名前を与えるしかないような気もする。
    • ホスト名がコンテナID
      • なので、起動したらそこからDockerホストに問い合わせて名前を確定→DDNSに登録と言うのが順当ではと思われる。
    • コンテナから見てDockerホストのIPアドレスは一定だが、そのIPを指定してバインドされたポート経由で他のコンテナとの通信はできない。
      • 多分ルーティングテーブルと絡みがありそう。
    • とは言え、相手のコンテナIPアドレスがわかっていれば通信は可能。

用途

  • 最新のブラウザを使ったヘッドレステスト環境
    • あっさりできて嬉しい。Ubuntuコンテナに最新アップデートをあててXvfbとx11vncとfluxboxとFirefox,chrome入れたらできた。
  • DB,AP鯖
    • 普通。難しくはない。
    • ただしマウントができないのはかなりきつい制約でもある。IOの分散がホスト依存に成るのがめんどくさい。
  • 大量同一環境の養殖
    • VM上に営巣できるので、Dockerのイメージ保管場所を共有ディスクにぶち込んでVM自体バンバン増やすことでできる。
      • ただし、マシン間通信と誰が何が出来るかの管理はネック。ブリッジ経由で外とつながるようだが・・・DHCPでIPを与えられるらしいが不明。

目指す地平線

問題はここ。アプリの作動する基盤がお手軽に用意が可能で、しかもその性質はイメージが同じであればほぼ同等、均質。なのでなんとかいろんなマシンを一瞬で利用可能にする可能性を秘めている。
もちろんOpenStackとかでもいいんだけど、コンテナの専有リソースが劇的に少なく、かつ分離も出来るのもいい。なのでその用途に強いアプリならいいのではと思う。問題はその力が発揮される適当なマシンが無いのが辛い。
理想を言えば、小さくて省電力でIOの太いスティック状のウェアラブルなメイニーコアマシンを二桁ほど身につけてウェアラブルグリッドを構成してその上で上記のDockerリモートAPIを使ってイメージをとっ替えひっ変えしながら面白いことが出来ればと思う。それはARの踊る第二現実をHMD越しに見るいわゆるネットスフィアの走りであり、クラウドも重要なんだけどコストと回線がネックに成るその時に。ただ、結局いつもネックに成るのは排熱と電熱効率で、現在の省電力技術の流れではなく、フルロードで24時間以上稼働が衣服の下で可能であるというのが条件なのだが・・・・難しい。

出来ると嬉しいこと

上記を踏まえて欲しいのはDockerOnDockerとかLXConLXCができればなと。何が言いたいかというと、この世にPCを駆逐しながら広がるデバイススマホのことである。自由のないiOSは於いておくとして、AndroidにはDebianKitという神がかったアプリがあってここでUbuntuユーザランドが使える。Kernelの3.10あたりでDockerは作動するので、次の次ぐらいのAndroidのLinuxKernelで動くのではないかと推測される。
このDebianKitはまあChrootなのでLXC相当になるので、そこで動けばー、スマホでDockerグリッドが作動可能に成る。夢が広がるのである。

複数マシンがあること。
  • 生のマシン:OS、ソフトをHDDにインストールがめんどくさい
  • 仮想マシン:イメージをコピーするだけ、でも設定の移動、管理が面倒くさい、イメージがでかい(10000MBオーダー)
  • Dockerコンテナ:すぐに生まれるし(10秒ぐらい)、すぐに殺せる(30秒ぐらい)、小さい(1000MBオーダー)

よいよ環境の取り扱いが楽になり連携がしやすく成る未来を感じる。
問題はさせる仕事がないという現実。それにしてもShellはなんだかんだ言って便利であると痛感する。