Pythonで作ったテトリスをDockerコンテナ化してGUIで起動する

PythonテトリスをDockerコンテナ化しGUI起動 Docker

この記事では、Windows 11 上の WSL2(Ubuntu)環境において、Python で作成したテトリスを Docker コンテナ化し、Windows 側の X Window System(VcXsrv)を利用して GUI アプリケーションとして起動する手順を説明しています。

この記事をよむことで、Python で書かれたプログラムをDockerイメージとして起動する手順を理解できます。

前提条件

  1. Windows 11 に Docker Desktop がインストールされており、WSL2 と連携していること
  2. WSL2 上に Ubuntu がインストールされていること
  3. Windows 側に VcXsrv がインストール済みで、WSL からの X11 フォワーディングが許可されていること

作業環境の構築

Docker Desktopのインストール

WindowsにDocker Desktopをインストールする方法を参考。

WSL2

WSL2 (Windows Subsystem for Linux 2) は、Microsoft が提供する Windows の機能で、Windows 上で Linux 環境を直接実行できるようにするものです。

Docker Desktopをインストールする過程でこれらは自動的に設定されます。
(Settings>General>Use the WSL 2 based engine

Windows Terminal

PowerShell や WSL(bash)など複数のシェルをタブで切り替えながら利用できるターミナルアプリケーションです。

Windows ターミナル の基本を参考にインストールします。

Ubuntu(Linux)

Windows Terminalを使って、WSL2環境にUbuntu(Linux)をインストールします。
WSL を使用して Windows に Linux をインストールする方法を参考。

Docker Desktopの設定が、Settings>Resources WSL integration>Enable integration with my default WSL distroがON、Enable integration with additional distrosのUbuntuのトグルがONの状態で利用します。

VcXsrv のインストール(Windows 側)

  • VcXsrv の公式リポジトリからインストーラーをダウンロード
  • インストーラーを実行し、推奨設定(Multiple windows、Start no client、Disable access control)でインストール
  • インストール後、VcXsrv を起動
  • 「xlaunch」を実行
  • 「Multiple windows」「Start no client」を選択
  • 「Extra settings」で「Clipboard」、「Native open gl」、「Disable access control」にチェックを入れて完了
Multiple windowsを選択
Start no clientを選択
Clipboard、Native open gl、Disable access controlにチェック

これで Windows 側で X サーバーが待ち受ける状態になります。

【参考】
VcXsrvは、LinuxのX11プロトコルをWindowsのGDI/DirectXに変換します。
これにより、X11ウィンドウをWindowsのネイティブウィンドウとして表示できます。

詳細は、WSL上にXサーバをインストールしてGUIを実現する(VcXsrv編)を参考してください。

プロジェクトの作成と実行

ディレクトリの作成と移動

空きファイルの作成

ファイル内容の作成

テトリスのPythonコード(tetris.py)の作成

tetris.pyに、以下のテトリスゲームのコードを設定します。

Dockerfile の作成

Dockerfile を作成し、必要なシステムライブラリと Python パッケージをインストールします。

requirements.txt の作成

requirements.txtは、Pythonプロジェクトで使用する外部ライブラリ(依存関係)を記述するテキストファイルです。

requirements.txtは以下の理由で必要になります。
再現性: 誰でも同じ環境でアプリケーションを実行可能
効率性: Dockerビルドの高速化
保守性: 依存関係の管理と更新が容易
協業: チーム開発での環境統一
デプロイ: 本番環境での確実な動作保証

Docker Composeファイルの作成

Docker Composeファイル(docker-compose.yml)は、複数のDockerコンテナを定義、設定、実行するプロセスを簡素化するためのファイルです。

docker compose upコマンド一つで、定義されたサービスをに起動でき、docker compose downコマンドで、すべてのサービスと関連するリソースを停止・削除できます。

environment: - DISPLAY=${DISPLAY}
DISPLAY: Xサーバー(グラフィカルな表示を管理するシステム)のアドレスを指定する環境変数です。
=${DISPLAY} とすることで、PCの環境変数 DISPLAY の値をそのままコンテナに渡しています。
これにより、コンテナ内のアプリケーションがホストマシンのディスプレイにグラフィカルなウィンドウを表示できるようになります。

volumes: - /tmp/.X11-unix:/tmp/.X11-unix:rw
これはボリュームマウントの設定です。
ホストマシンの特定のディレクトリをコンテナ内のディレクトリにマウントし、両者間でファイルを共有できるようにします。
/tmp/.X11-unix: 
ホストマシンのディレクトリです。Xサーバーとの通信に必要なソケットファイルが置かれています。
/tmp/.X11-unix: 
コンテナ内のディレクトリです。ホストのX11ソケットをここにマウントすることで、コンテナ内のアプリケーションがホストのXサーバーと通信できるようになります。
:rw: 
マウントされたボリュームを読み書き可能(read-write)にします。

network_mode: host
この設定は、コンテナがホストのネットワークスタックを直接使用するように指定します。
通常、Dockerコンテナは独自の分離されたネットワークネームスペースを持ちますが、hostモードを使うと、コンテナはホストマシンと同じIPアドレスとネットワークインターフェースを共有します。

stdin_open: true
コンテナの標準入力 (stdin) を開いたままにします。
これにより、コンテナがバックグラウンドで実行されていても、コマンドラインから入力を受け付けることができます。

tty: true
コンテナに仮想TTY (擬似端末) を割り当てます。
これにより、コンテナの出力が整形され、色付きの表示やカーソル移動などが正しく機能するようになります。
stdin_open: true と組み合わせることで、対話型シェルやグラフィカルなアプリケーションが正しく動作できます。

ターミナル操作

ここからはUbuntuのターミナルでの作業です。
Ubuntuのターミナルを開いて、以下のコマンドを実行します。

X11の権限を設定

xhostコマンド

xhostは、X Window Systemのアクセス制御を管理するコマンドです。
どのクライアント(アプリケーション)がXサーバーに接続して画面に描画できるかを制御します。

ここでは、local:docker: ローカルのdockerユーザー/プロセスにアクセスの許可を追加しています。

xhost: アクセス制御コマンド
+: 許可を追加(-は許可を削除)
local:docker: ローカルのdockerユーザー/プロセス

Docker イメージのビルド

docker build:
Dockerfileに書かれた命令を順番に実行してイメージを構築します。
-t tetris-game:
「タグ」オプションです。-t は --tag の省略形です。
tetris-game が、これから構築するDockerイメージに付ける名前(リポジトリ名とタグ)です。
. (ドット):
現在のディレクトリにある Dockerfileを使用して、Dockerイメージを構築します。

コンテナ起動(テトリスのウィンドウ表示)

Docker Composeの動作

1. docker-compose.ymlを読み込み
2. 必要なイメージが存在するかチェック
   ├─ イメージが存在する → そのイメージを使用
   └─ イメージが存在しない → ビルドを実行
3. コンテナを起動

正常に起動すると、Windows 上にテトリスのウィンドウが表示され、キーボード操作でプレイできます。

コンテナの停止と削除

docker compose down は、docker compose up で起動したDocker Composeアプリケーションに関連するすべてのリソースを停止し、削除します。
タイトルとURLをコピーしました