我想 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
您需要解决以下问题才能使其正常工作:
- X应用程序可以找到X服务器
- 对于 SSH,需要有一个隧道(/etc/ssh/sshd_config 中的“ssh -X”和“X11Forwarding yes”)
- 地址必须位于 $DISPLAY 中(使用 -e)。您必须将“localhost”替换为从 Docker 容器中看到的 Docker 主机的实际 IP 地址。
- 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 容器:
在macbook上使用socat让X11服务器监听TCP,如下在 Mac OS X 上使用 Docker 运行 GUI。
在远程ubuntu上
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
参考: