前回はDocker環境で3Dゲームを稼働させるゴールや方法などについてご紹介しました。今回はその環境を構築していく上でのポイントや注意点を解説します。
(※前回の「準備編」はこちら)
今回は、「GAME ON」の会場で展示されていたドライブシミュレータやフライトシミュレータと同様に、3Dグラフィックスを駆使したゲームアプリをDockerコンテナで動かそうと思います。はたして、Docker環境でゲームアプリは正常にキビキビと動作するのでしょうか。ここで以下のようなゲームアプリ特有の疑問が沸いてきます。
これらの疑問に答えるためには、以下のような技術面の調査が必要になります。
まず疑問1については、Dockerコンテナで稼働するGUIアプリをホストOSのデスクトップ上に表示させる仕組みが必要です。Dockerに限らず、Linux環境においてGUIアプリを表示するには、「X.Org Server」と呼ばれるソフトウェアが必要です。このX.Org Serverは、ディスプレイ上にウィンドウシステムを提供するグラフィカル表示用のプロトコルを提供します。X.Org Serverは、GUIアプリにとって必須のソフトウェアであり、一般的に、「X Window System」(単にX、または、X11)と呼ばれています。X11は、1987年に登場したUNIX向けのソフトウェアです。ウィンドウシステムの表示に関する基本的な仕組みは、現在の最新のLinuxディストリビューションにおいても、1987年当時のX11とほとんど変わっていません。
今回は、GUIアプリをDockerコンテナで実行する必要があり、Dockerコンテナ上でこのX.Org Server(X11)が利用できなければなりません。「DockerコンテナでX.Org Serverを利用する」とは、どういうことでしょうか。今までご紹介したDockerコンテナのアプリとは、何が異なるのでしょうか。
Docker塾の連載で今までご紹介したDockerコンテナのアプリは、どれもグラフィック映像を直接出力するものではありませんでした。連載第17回、18回、19回でご紹介した録画アプリ「Motion」も、それ自体がグラフィカルな映像をディスプレイに出力するわけではなく、出力結果は画像や映像を記録した「ファイル」でした。しかしゲームアプリの場合は、X.Org Serverを経由してグラフィカルな映像をディスプレイにリアルタイムで描画する必要があります。しかも今回は、DockerコンテナからX.Org Serverを使って映像を表示しなければなりません。
DockerコンテナでGUIアプリを稼働させるには、ホストOSで稼働しているX.Org Serverを利用します。いくつかの方法がありますが、非常にシンプルな方法としては、以下のように、Dockerコンテナの実行時に、DISPLAY環境変数を「-e」オプションでコンテナに引き渡し、「-v」オプションで、ホストOSが提供しているX11プロトコルのソケット(プロセス間で使用する通信路)が格納される/tmp/.X11-unixディレクトリをホストOSとコンテナで共有します。さらに、D-BUSと呼ばれるプロセス間通信用の実装についても「-v」オプションを使ってホストOSとコンテナで共有します。
# docker run \ -it \ -e DISPLAY=$DISPLAY \ ←DISPLAY環境変数をコンテナに引き渡す -v /tmp/.X11-unix:/tmp/.X11-unix \ ←X11のソケットを共有 -v /var/lib/dbus:/var/lib/dbus \ ←D-BUSで利用するマシンIDを共有 -v /var/run/dbus:/var/run/dbus \ ←D-BUSで利用するソケットを共有 -v /etc/machine-id:/etc/machine-id \ ←マシンIDを共有 ubuntu:mygame01 /bin/bash
この方法は、非常にシンプルなのですが、コミュニティにおいて情報セキュリティの問題が議論されています。企業システムでの採用には注意が必要ですが、今回は、筆者の家庭内に設置したDockerホストに限定し、個人利用に限定するため、この方法で話を進めます。
Copyright © ITmedia, Inc. All Rights Reserved.