リモートサーバーのDockerコンテナからX11を渡す

リモートサーバーのDockerコンテナからX11を渡す

Linux mint 18サーバー(X11を実行)にsshを接続してdockerコンテナにログインした後、iPython matplotlibプロットをローカルクライアント(またmint)に渡したいと思います。すべてローカルネットワークにあります。

私が見つけた最も近い質問は次のとおりです。https://stackoverflow.com/questions/25281992/alternatives-to-ssh-x11-forwarding-for-docker-containers

-e DISPLAY=$DISPLAY次に、コマンドに渡されたオプションを使用して、dockerからローカルコンピュータのモニタ(ei、mintサーバー)にフローティングGUIを出力できますdocker run。また、-XSSHを介してサーバーに接続してxeyesクライアントウィンドウをインポートすることもできます。

ただし、オプションを使用してサーバーにSSH接続し、-X実行中のコンテナにログインしても、-DISPLAY=localhost or client IPクライアントシステムからプロットをインポートできません。

この問題を解決するためにVNCを使用できることを知っています。しかし、X11転送を正しく使用する方法は?

答え1

動作するには、次の問題を解決する必要があります。

  1. XアプリケーションはXサーバーを見つけることができます
    • SSHの場合はトンネルが必要です(/etc/ssh/sshd_configの「ssh -X」および「X11Forwarding yes」)。
    • アドレスは$ DISPLAYになければなりません(-eを使用)。 Dockerコンテナ内でわかるように、「localhost」をDockerホストの実際のIPアドレスに置き換える必要があります。
  2. XアプリケーションにはXサーバーと通信する権限があります。
    • xauth マジッククッキーを Docker コンテナに伝播
    • DockerホストからX11ポート用のDockerコンテナまで、すべてのファイアウォールポートを開きます。
    • SSH サーバーがリモート IP から X11 TCP 接続を許可するように構成されていることを確認します。

これを行う方法の詳細については、StackOverflowに関する私の質問(および回答)を参照してください。https://stackoverflow.com/questions/48235040/run-x11-application-in-a-docker-container-reliously-on-a-server-connected-via-ssh

答え2

リモートDockerコンテナでGUIアプリケーションを実行するには、サーバーからX11転送を必要としません。 X11サーバーがTCP:6000を受信し、-e DISPLAY=$IP:0$ IPがX11サーバーを実行しているコンピューターのIPアドレスである場合は、リモートドッカーコンテナーを実行できます。

リモートUbuntuにリモートドッカーコンテナを表示するために、Macbookで動作するXQuarzを使用しました。

docker run -it --rm -e DISPLAY=$macbook_ip:0 fr3nd/xeyes

これにより、Macbookにxeyesが表示されます。

答え3

Pythonモジュールドッカーxこの問題を解決することを目指しています。

これをインストールして実行できます。

python3 -m pip install dockerx --user

X11サポートコンテナを実行するには、次の手順に従ってください。

$ python3 -m dockerx.run --image ubuntu --command 'sleep infinity'

To get a container terminal run:  docker exec -it b05bd722477e /bin/bash
To kill the container run:        docker kill b05bd722477e
To remove the container run:      docker rm b05bd722477e

$ docker exec -it b05bd722477e /bin/bash
root@b05bd722477e:/# apt update && apt install -y x11-apps
root@b05bd722477e:/# xclock

これにより、xclock画面にその内容が表示されます。

CUDAサポートが必要な場合(システムにDocker NVIDIA Runtimeをインストールする必要がある場合)、次のコマンドを使用してコンテナを起動します。

$ python3 -m dockerx.run --image nvidia/cuda:11.0-base --nvidia 1 --command 'sleep infinity'

ドッカーxX11UseLocalhost noにオプションを設定するには、リモートシステムで実行されているSSHサーバーが必要です/etc/ssh/sshd_config

詳細については、以下を確認してください。dockerx Pythonモジュール用GitHub

答え4

コンテナ:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config_bak

sed -i "s/^.*X11Forwarding.*$/X11Forwarding yes/" /etc/ssh/sshd_config 

sed -i "s/^.*X11UseLocalhost.*$/X11UseLocalhost no/" /etc/ssh/sshd_config 

grep "^X11UseLocalhost" /etc/ssh/sshd_config || echo "X11UseLocalhost no" >> /etc/ssh/sshd_config 

顧客:

ssh -X user@ip 

引用:

udkyo/Dockerfile

関連情報