第21回 Dockerで3Dゲームを動かす――構築編古賀政純の「攻めのITのためのDocker塾」(1/3 ページ)

前回はDocker環境で3Dゲームを稼働させるゴールや方法などについてご紹介しました。今回はその環境を構築していく上でのポイントや注意点を解説します。

» 2016年04月27日 08時00分 公開

(※前回の「準備編」はこちら

ゲームアプリを動かすにあたって、様々な疑問が沸いてくる

 今回は、「GAME ON」の会場で展示されていたドライブシミュレータやフライトシミュレータと同様に、3Dグラフィックスを駆使したゲームアプリをDockerコンテナで動かそうと思います。はたして、Docker環境でゲームアプリは正常にキビキビと動作するのでしょうか。ここで以下のようなゲームアプリ特有の疑問が沸いてきます。

  • 疑問1.そもそもDockerコンテナ上でゲームのような「GUIアプリ」をどうやって表示させるのか?
  • 疑問2.ゲームコントローラー(ゲームパッド)などの人間が操作する周辺機器はDockerコンテナで認識できるのか?
  • 疑問3.Dockerコンテナ上で稼働するゲームの音はどうやって出すのか?
  • 疑問4.ゲームアプリが稼働するDockerコンテナが削除されても、ゲームの途中結果を記録したセーブデータを保管できるのか?

 これらの疑問に答えるためには、以下のような技術面の調査が必要になります。

  • 疑問1に対する技術:ホストOSで稼働しているウィンドウシステムをコンテナから使う
  • 疑問2に対する技術:USB接続された入出力機器のデバイスファイルをコンテナから使う
  • 疑問3に対する技術:サウンドカードのデバイスファイルをコンテナから使う
  • 疑問4に対する技術:コンテナで生成されたセーブデータをホストOS上のディレクトリに保管する

DockerコンテナでGUIアプリを動かす

 まず疑問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とほとんど変わっていません。

Dcoker 1987年から今でも続くX Window System

 今回は、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ホストに限定し、個人利用に限定するため、この方法で話を進めます。

Dcoker ホストOSで稼働するX Window SystemをDockerコンテナから利用する
       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ