从远程服务器中的 docker 容器进行 X11 转发

从远程服务器中的 docker 容器进行 X11 转发

我想 ssh 到我的 linux mint 18 服务器(运行 X11)并登录到 docker 容器,并将 iPython matplotlib 图转发到本地客户端(也是 mint)。全部在本地网络中。

我发现的最接近的问题是:https://stackoverflow.com/questions/25281992/alternatives-to-ssh-x11-forwarding-for-docker-containers

-e DISPLAY=$DISPLAY接下来,我可以通过传递给命令的选项将绘图 GUI 从 docker 输出到本地计算机的显示器(ei,mint 服务器)docker run。我还可以通过 ssh-X连接到服务器,以获取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)。您必须将“localhost”替换为从 Docker 容器中看到的 Docker 主机的实际 IP 地址。
  2. X 应用程序被授权与 X 服务器通信
    • 将 xauth magic cookie 传播到 Docker 容器中
    • 为 X11 端口打开从 Docker 主机到 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,并使用 运行远程docker容器-e DISPLAY=$IP:0,其中$IP是运行X11服务器的计算机的IP地址。

我已经使用 XQuarz 在 macbook 上工作,以在远程 ubuntu 上显示远程 docker 容器:

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

然后 macbook 上显示 xeyes

答案3

Python 模块dockerx旨在解决这个问题。

您可以安装它并运行:

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'

dockerx要求在远程计算机中运行的 SSH 服务器具有X11UseLocalhost no在 中设置的选项/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

相关内容