1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【備忘録】Xサーバをリモートサーバ上のDockerコンテナで使いたい

Last updated at Posted at 2023-01-27

概要

コンピュータビジョン分野の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のようにコマンド一発ではできず、いくつかステップが必要です。

  1. Cygwin/Xのインストーラをダウンロードする。
  2. インストーラを起動後、パッケージ選択画面まで進める。
  3. パッケージ選択画面でX11の三角をクリックし、「Install」に変更する。
  4. パッケージ選択画面でopensshの三角をクリックし、バージョンを選択する。
  5. インストールを行う。
  6. インストール完了後、アプリの中から「Cygwin-X」フォルダを見つけて開き、「XWin Server」を起動する。
  7. タスクバーの通知領域に表示された「X」アイコンを右クリックし、「システムツール->XTerm」を起動する。

Windowsは通常のコマンドプロンプトからssh -XYしても、Xサーバに必要なディスプレイが認識されない。XTermからSSH接続を行う事に気を付ける。

Dockerの設定

リモートDockerコンテナを立てる場合に、以下の点が必要になりました。

  1. docker-compose.yamlにnetwork_mode: hostを記述する。
    • またはdocker runのオプションに--net=hostを入れるとよいらしい
  2. docker-compose.yamlに以下を記述する。
    environment:
        - DISPLAY=$DISPLAY
    
    • またはdocker runのオプションに-e DISPLAY=$DISPLAYを記述する。
    • $DISPLAYecho $DISPLAYで表示されるものが入る

SSH接続

クライアントPCからリモートのUbuntuにSSH接続を行う際に、-XYオプションを付けます。
例)

ssh -XY [リモートサーバ]
  • -XYオプションは、X11 Forwarding(X転送)に必要
  • -Xのみだと失敗する場合がある
  • -Yを使う場合は、信用できるリモートホストのみにすること

リモートDockerコンテナでXサーバを起動する

リモートサーバにSSH接続をしたところで、早速Xサーバを起動していきます。

  1. echo $DISPLAYコマンドを実行し、表示される値をメモ
  2. サーバのホスト側でxauth listを実行
  3. 表示された文字列の中から、サーバのディスプレイに対応するものを一行丸々コピー
    • 例)echo $DISPLAYコマンドで<hostname>:10が表示→xauth listコマンド実行で<hostname>/unix:10 MIT-MAGIC-COOKIE-1 ...というものが表示されたら、それをコピー
  4. 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サーバめんどくさい部分は多いですが、使えるようになったら便利なことも多いと感じます。
本記事が少しでも参考になれば幸いです。

参考サイト

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?