ゼロから始めるdocker生活 ~ VT-Xなんてない

さて、タイトルで誤解されそうですがこの記事はDockerの入門記事ではありません。

現代的なツールチェインが使えない異世界な気分に浸れる開発環境を与えられたとあるプログラマーの異世界訪問記みたいなものです。

現代的な開発環境を作る上で欠かせない存在。その一つはDockerです。

サーバ環境と同等の開発環境をサクッと作れるのは開発者はもちろん開発環境や運用環境を構築する担当としても有用なものです。

でも、そんなDockerが使えなかったら? 今回はそんな開発環境に迷い込んだ時のお話。

※ この物語はフィクションです。登場する人物・団体・名称、エピソード等は架空であり、実在のものとは少ししか関係ありません。

開発環境? もちろんWindowsだよ!

今日から新しい職場です。プロジェクトの初期メンバとして開発環境も作らないとなのでがんばるぞー。

え、開発環境はWindows? MacLinuxではない。。。? 動作環境はLinuxなのに? まあ、そうですよね。

でも、そんなのは慣れっこです。Vagrantを使う開発手順にしましょう(※1)。

サーバに上げないと開発できないとかツラいし、Cygwinとかで作ると細かい差で本番で死ぬからね!

という分けで基本的にはIDEで開発/テストをし、Bashを含んだような全体の動作確認はVagarantで。

共有フォルダを設定しとけばデータ連携もスムーズだし、chefやserverspecでSTG/PRD環境との互換性も保ちやすくて良いね!

※1 当時はDockerは出たばかりで仕事で使うにはちょっと。。。 な時代

ごめんね? 今日からあなたの開発環境はシンクライアントなの。

「みなさんに大事なお話があります」

偉い人は言いました。

「今日からみんなシンクライアント(VDI)! いいね?」

そして開発環境もVDIになりました。

「マウスを高速に動かすと画面がちらつく!」「キー入力にラグがある気がする!」

そんな声もありましたが、私はあまり気になりませんでした。

むしろ、元のマシンがHDDな残念な子だったので、SSDになったし画面も3日もすれば慣れたから問題は無いかな? という気分でした。

そう。Vagarantが動けばね!

夢の32bit OS

32bit OSをご存知でしょうか?

今までのシステムより圧倒的な大容量なメモリ。素晴らしいグラフィック。そしてセキュアで堅牢な作り。

時代の要請に答えて圧倒的に進化したOS、それが32bit OSです!

. . .

およそ25年ほど前の話なら、ね。

私は選択しました。Vagrant上で動かすシステムを32bitにすることを。

だって、VDIは仮想環境だからVT-Xが使えないんです。つまりVirtualBoxとか普通に使ってる仮想環境だとVT-Xの利用を前提にしてる64bitOSは動かない。

Nested Virtualization はなかなか難しいし。。。

幸いにして32bitでも必要なライブラリはそろいました。JavaがベースなのであまりOSレベルの差は気になりません。

というわけでゲストOSを64bitから32bitにダウングレードすることで妥協ラインに。

そう。。。いつ32bit版のライブラリが無くなるかという爆弾を抱えたまま、私たちは走り始めたのです。

マスター、一番いいのを頼む

困った。メモリが足りない。

JavaIDE立ち上げて、アプリケーションサーバ立ち上げて、DB立ち上げて、Excel立ち上げて、Chrome立ち上げてたら

4GBぽっちのメモリはすぐに枯渇してしまいます。

あと、CPUもたりない。

マルチスレッドでの性能向上の検証とか2コアでどうしろと。。。 サーバと開発機の性能が違いすぎるの困りもの。。。

困ったときは相談です。とりあずVDIの担当者に話に行きます。

「メモリ、増やせるよ?」

!? あなたは神か。。。 工夫とか特にしなくても問題解決☆ 富豪プログラマー万歳です。

というわけでCPUを8コアにメモリを16GBにとりあえず増やしてもらいました。

よし、普通に動く。自分だけだとあまり意味がないので、担当者と話して申請手順も整備、これでOK.

再起動しただけでメモリ増えるなんて、なんだVDI以外と出来る子じゃない。

先生…!! Dockerがでドヤ顔したいです……

やがて時は過ぎ環境構築の主流はVagarantからDockerに移っていきました。

自宅ではDockerで開発環境をいろいろ作り、便利さはある程度分かってきたつもりです。

そうなると、やはり仕事でも使いたいのが人情。でもVT-Xが使えない。。。

Dockerは基本的に64bit Linuxが、前提。無理すれば32bitでも作れそうな記事も見かけたけど、DockerHubとかのエコシステムにまったく乗れない。

ぜんぜん。。うれしく、ない。。。

virtualboxvmwareもVT-Xを前提に64bit化を実現します。32bitなら遅くてもVT-Xで動くのにこの格差は何なんだ。。。

そう思いながらもんもんとしていたある日、ふと閃きました。

Bochsqemuがあるじゃない!」

天啓でした。Android端末の上でWindowsを動かすことにしか最近使われてない気がするBochsqemuですが、KVMとか使わなければ「普通のアプリケーションとして」フルエミュレーションをするはずです。

さっそくダウンロードです。boot2dockerのISOも落としておきましょう。

$ 'C:\Program Files\qemu\qemu-img.exe' create -f qcow2 harddisk.qcow2 32G
$ "C:\Program Files\qemu\qemu-system-x86_64w.exe" -m 4G -cdrom boot2docker.iso -name boot2docker -drive file=harddisk.qcow2,media=disk,cache=writeback  -smp 2 -netdev user,id=user.0 -device e1000,netdev=user.0

動いた! 無事クジラさんが見えました! docker psやdocker runも打てるよ!

そして…

さて、無事にVT-Xが使えないシンクライアント上でもDockerが動くようになりました。圧倒的 進歩!

ただ、まだこれで終わりではありません。qemuって重いんです。知ってました?

これでどこまで現実的に開発に利用できるかは試してみるしかありません。

docker-machineとの連携も調べないといけません。genericsとかでやれば動くでしょうか? そもそもボリュームどうしましょう?

DockerRegistoryどうしようとか考えることは山盛りあります。

残念ながら、異世界開発環境で「おれつぇー」が出来るのはもう少し先のことになりそうです。

あとがき

さて、たんにdocker on qemu without VT-xが出来たので記事にしようと思ったら、何故かこんなものを書いてました。

夜勤明けにビール飲みながら見てるインターネッツは怖いですねー。

ゼロから始める魔法の書』を見ながら、ふとタイトルを思いたのが運の尽きですが、結果として出来たタイトルはどちらかというとリゼロなのが不思議です。

そのうち「docker on qemu without VT-x」関連を抜粋してQiitaに投稿しておきます。

それではHappy Hacking!