概要
コンピュータビジョン分野のGitHubコードを動かす際に、「Ubuntuサーバ上のDockerコンテナでXサーバを起動する」という状況に何度か遭遇しました。
この問題の解決のためにかなり時間がかかったため、備忘録として対処法を記録しておきます。
実行環境
サーバ
- Ubuntu 20.04
クライアント
- Ubuntu 20.04
- Windows 11
その他
- Docker Compose バージョン2.3
手順
クライアント側の準備
Linux(Ubuntu)の場合
クライアントPCにUbuntuを使う場合は、X Windows Systemを使えるように設定が必要なので、以下のコマンドでインストールする。
sudo apt-get -y install xserver-xorg
動作確認のために以下もインストールして実行する。
sudo apt-get -y install x11-apps
xeyes
問題が無ければ、目がきょろきょろするウィンドウが表示されるはず。
Windowsの場合
WindowsはUbuntuのようにコマンド一発ではできず、いくつかステップが必要です。
- Cygwin/Xのインストーラをダウンロードする。
- インストーラを起動後、パッケージ選択画面まで進める。
- パッケージ選択画面でX11の三角をクリックし、「Install」に変更する。
- パッケージ選択画面でopensshの三角をクリックし、バージョンを選択する。
- インストールを行う。
- インストール完了後、アプリの中から「Cygwin-X」フォルダを見つけて開き、「XWin Server」を起動する。
- タスクバーの通知領域に表示された「X」アイコンを右クリックし、「システムツール->XTerm」を起動する。
Windowsは通常のコマンドプロンプトからssh -XY
しても、Xサーバに必要なディスプレイが認識されない。XTermからSSH接続を行う事に気を付ける。
Dockerの設定
リモートDockerコンテナを立てる場合に、以下の点が必要になりました。
- docker-compose.yamlに
network_mode: host
を記述する。- または
docker run
のオプションに--net=host
を入れるとよいらしい
- または
- docker-compose.yamlに以下を記述する。
environment: - DISPLAY=$DISPLAY
- または
docker run
のオプションに-e DISPLAY=$DISPLAY
を記述する。 -
$DISPLAY
はecho $DISPLAY
で表示されるものが入る
- または
SSH接続
クライアントPCからリモートのUbuntuにSSH接続を行う際に、-XY
オプションを付けます。
例)
ssh -XY [リモートサーバ]
-
-XY
オプションは、X11 Forwarding(X転送)に必要 -
-X
のみだと失敗する場合がある -
-Y
を使う場合は、信用できるリモートホストのみにすること
リモートDockerコンテナでXサーバを起動する
リモートサーバにSSH接続をしたところで、早速Xサーバを起動していきます。
-
echo $DISPLAY
コマンドを実行し、表示される値をメモ - サーバのホスト側で
xauth list
を実行 - 表示された文字列の中から、サーバのディスプレイに対応するものを一行丸々コピー
- 例)
echo $DISPLAY
コマンドで<hostname>:10
が表示→xauth list
コマンド実行で<hostname>/unix:10 MIT-MAGIC-COOKIE-1 ...
というものが表示されたら、それをコピー
- 例)
- Dockerコンテナに入り、以下のコマンドを上から順に実行する。
:> ~/.Xauthority chmod 600 ~/.Xauthority xauth add <3でコピーしたテキスト>
その後
後はコード実行時に発生したImportError
などを地道にパッケージインストールでつぶしていけば動くのではないかと思います。
筆者は大体以下のパッケージをDockerfileに追加しています。参考になれば幸いです。
RUN apt-get update -y \
&& apt-get install -y --no-install-recommends \
build-essential \
wget \
unzip \
git \
vim \
sudo \
libgl1-mesa-glx \
libglib2.0-0 \
libopencv-dev \
libsm6 \
libxrender1 \
libxext6 \
libgl1-mesa-dev \
curl \
xauth \
libxxf86vm-dev \
tmux && \
rm -rf /var/lib/apt/lists/*
またターミナル(XTerm, Ubuntuのターミナル)を閉じてしまったり、放置しすぎたりすると、たまにXサーバが認識しなくなります。
その場合は再度ここの作業を行うと動くようになるかもです。
まとめ
Xサーバめんどくさい部分は多いですが、使えるようになったら便利なことも多いと感じます。
本記事が少しでも参考になれば幸いです。
参考サイト