![如何从我通过 SSH 连接的远程 docker 容器转发 GUI?](https://linux22.com/image/1603110/%E5%A6%82%E4%BD%95%E4%BB%8E%E6%88%91%E9%80%9A%E8%BF%87%20SSH%20%E8%BF%9E%E6%8E%A5%E7%9A%84%E8%BF%9C%E7%A8%8B%20docker%20%E5%AE%B9%E5%99%A8%E8%BD%AC%E5%8F%91%20GUI%EF%BC%9F.png)
我有一台 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 窗口。
- MacBook -> 远程服务器 -> 远程服务器运行带有应用程序的容器
- 应用程序创建一个框架 -> 我在电脑上获取它
PS:
也许我的英语不是很好,这是我在 Stack Overflow 上的第一个问题。
答案1
我也正在尝试实现这一点,cypress/included
因为我使用的是 Apple M1 机器,而 Docker 还不能很好地运行。
- 安装石英在 Mac 上,
$ open -a XQuartz
‘偏好设置’->‘安全’->‘允许网络连接’。 $ xhost + <<IP_OF_YOUR_REMOTE_MACHINE>>
- 使用标志通过 SSH 进入远程计算机
-X
,即$ ssh -X you@remoteip
docker run -e DISPLAY -v ~/.Xauthority:/root/.Xauthority:ro your:image command
里程可能会有所不同 - 我可以让它与docker run一起工作,但不能与docker-compose一起工作。
基本上,ssh -X 将从你的 Mac 转发 X11 配置。-e DISPLAY
将该配置传递到 docker 容器。