如何从我通过 SSH 连接的远程 docker 容器转发 GUI?

如何从我通过 SSH 连接的远程 docker 容器转发 GUI?

我有一台 MacBook,用作客户端计算机,并连接到远程 Ubuntu 服务器,其中有一个正在运行的 docker 容器。在 docker 容器中,我有一个使用 opencv 的应用程序,它创建了视频捕获设备的输出窗口。

当我在 Docker 容器中启动该应用程序时出现错误:

Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused

(output:15): Gtk-WARNING **: cannot open display: localhost:10.0

我尝试将DISPLAY环境变量改变为,:0但结果是一样的。

我通过 VSCode 远程 SSH 插件连接,该插件可以使用 ssh 配置从远程服务器打开项目文件夹:

Host hostname
  User yegor
  HostName XXX.XXX.XXX.XXX
  IdentityFile ~/.ssh/id_rsa
  ForwardX11 yes
  ForwardX11Trusted yes

在远程服务器上,我按照以下步骤启动一个 Docker 容器(我为自己重新制作了一个示例):

#!/bin/bash

XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth
touch $XAUTH
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -

ARG1=${1:-0}
ARG2=${2:-9999}
NV_GPU=$ARG1

nvidia-docker run \
--shm-size 8G \
-p $ARG2:$ARG2 \
--env="DISPLAY" \
--env="XAUTHORITY=${XAUTH}" \
--env="QT_X11_NO_MITSHM=1" \
--env="CUDA_VISIBLE_DEVICES=0" \
--volume=$XSOCK:$XSOCK:rw \
--volume=$XAUTH:$XAUTH:rw \
--device=/dev/video0:/dev/video0 \
--name libtorch \
--mount type=bind,source="$PWD",target=/app \
--net=host \
-it --rm \
yegor/libtorch:cuda10.0-ubuntu16.04 bash

我想要的只是在我的 Mac 上获得一个 OpenCV 窗口。

  1. MacBook -> 远程服务器 -> 远程服务器运行带有应用程序的容器
  2. 应用程序创建一个框架 -> 我在电脑上获取它

PS:
也许我的英语不是很好,这是我在 Stack Overflow 上的第一个问题。

答案1

我也正在尝试实现这一点,cypress/included因为我使用的是 Apple M1 机器,而 Docker 还不能很好地运行。

  1. 安装石英在 Mac 上,$ open -a XQuartz‘偏好设置’->‘安全’->‘允许网络连接’。
  2. $ xhost + <<IP_OF_YOUR_REMOTE_MACHINE>>
  3. 使用标志通过 SSH 进入远程计算机-X,即$ ssh -X you@remoteip
  4. docker run -e DISPLAY -v ~/.Xauthority:/root/.Xauthority:ro your:image command

里程可能会有所不同 - 我可以让它与docker run一起工作,但不能与docker-compose一起工作。

基本上,ssh -X 将从你的 Mac 转发 X11 配置。-e DISPLAY将该配置传递到 docker 容器。

相关内容