Dockerを使った
クライアントハイパーバイザー
2018/03/12 Docker Meetup Kansai #1 LT
(@kunst1080)
※このマシン自体がデモ機です
自己紹介
● 名前: くんすと(@kunst1080)
● お仕事: 受託でWEBサービスを開発している
    フルスタックワンオペエンジニア
● その他: シェル芸勉強会 大阪サテライト
   Software Design誌「シェル芸人からの挑戦状」(PN: 中村)
趣味でやってる
プロジェクトのご紹介
Dockerを使った
クライアントハイパーバイザー
クライアントハイパーバイザー?
デスクトップ仮想化の方式
● リモートデスクトップ形式
○ リモートで仮想マシンを実行、端末へ画面を転送する
● クライアントハイパーバイザー方式
○ 仮想マシンをダウンロードし、端末で実行する
デスクトップ用途としての
Docker
アーキテクチャ
i3wm
VS Code Google Chrome
(音も出ます)
Slack
なぜこんな無謀なことを?
目的(モチベーション)
● OS・ソフトウェアのアップデートは人間のやるべきことじゃない
○ Windows Update
○ OS X - 最新のソフトウェア・アップデート
○ Ubuntuソフトウェアセンター
○ pacman -Syu
目的(モチベーション)
● OS・ソフトウェアのアップデートは人間のやるべきことじゃない
○ アップデート中にリソースが食われ不安定に…
○ パッケージの依存関係大丈夫?
○ 古いパッケージのゴミが残るのでは?
○ 再起動にわりと時間がかかってつらい…
アップデート済みの
OSイメージが
降ってきてほしい
Disposable Components
(破棄可能なデスクトップ環境)
実装
Xサーバを直接動かすDocker Image の構成
● kunst1080/x11-base - Xサーバと基本的なツール
● kunst1080/x11-wm - x11-base + Window Manager
● kunst1080/desktop - x11-wm + よく使うアプリケーション
※ビルド時間の短縮や調査時の切り分けなどのために分割してい
ます。構成は変更するかも。
Xサーバ起動の流れ
● docker pull kunst1080/desktop
● openssl passwd -1 > .passwd
○ ※パスワードファイルを作成しておく
● docker rmi desktop
● docker build . -t desktop --build-arg tag=i3
--build-arg passwd=$(cat .passwd)
○ ※ユーザーの作成はここで実施
※一連の処理はそれぞれシェルスクリプト化済み
Xサーバ起動の流れ
● docker run --rm --privileged 
--shm-size=8gb 
-v /run/udev:/run/udev 
-v /run/dbus:/run/dbus 
-v /run/systemd:/run/systemd 
desktop $*
※引数は一部省略
実現されること
● 開発環境の構築手順をDockerfileで表現できる
● Xを含むユーザーランドの作成・アップデートを
Docker Hubにおまかせ
● 最新のデスクトップ環境を取得するためには、docker pullする
だけでOK
● docker runするたびに環境が新しくなる
● X関連のライブラリをコンテナに閉じ込めることができ、ホストの
構成を最小化できる
まとめ、課題
実現できたこと
● docker run で Xサーバーが起動した
○ やってみればできるもんですね
● Docker HubでビルドしたイメージからXサーバ起動できる
● 普通に使える
○ 2017年の年末くらいから使ってます
○ 3ヶ月くらい使用中
ハマりどころ
● GPUを使うアプリの挙動がおかしいかも?
● Systemd・D-Busつらい
○ だいたい解決したはず…
● キー入力をハンドルするイベントがたまに拾えなくなる
○ 週一程度の頻度で発生している
○ 謎
● こんなことをやっている人間は世界に数人しかいないっぽい
乗り越えてきた地雷
● 共有メモリ不足でChromeが突然死
○ --shm-size=8gb でクリア!
● systemdどうするの問題
○ ホストの/run/systemdをマウント
● dbusどうするの問題
○ ホストの/run/dbusをマウント
乗り越えるために
● dockerの知識より、むしろLinuxの知識を深める
○ BSDも参考になる
● chroot・jail・LXC関連の情報を漁る
● Xorgのコミットログを漁る
○ つらい
解決できなさそうなこと
● カーネルの更新などはホストOSで行う必要がある
○ CoreOSやAtomicHostなどがそのうちやってくれそう……?
残課題
● コンテナの自動ビルド
○ Webhookを使ってLambdaから定期ビルドする予定
● Xセッションの保存・リストア・コピー
● Dockerホストの無停止アップデートが実現されるのを待つ
● このアーキテクチャへの名前付け
○ 「DockerでX11を動かす」とか
「Dockerで作るクライアントハイパーバイザ」とか……
わかりにくい

Dockerを使ったクライアントハイパーバイザー