docker - 从 Docker 容器显示 Android Studio GUI,同时通过无头 Ubuntu 服务器进行 SSH 隧道传输
问题描述
我有一个无头 Ubuntu 服务器(19.04),我想在其上运行一个 Docker 容器,其唯一目的是运行 Android Studio。Ubuntu 服务器没有任何图形用户界面。它只是严格的命令行。我目前在一个 Ubuntu VM (18.04) 上,它通过一个 SSH 隧道连接到 Ubuntu 服务器,该隧道通过另一个 SSH 隧道连接到我的 Home_Router:
ssh admin@Home_Router -L 22222:10.0.0.2:22
ssh user@localhost -p 22222
隧道图基本上是这样的:
Me
(Ubuntu_VM) Home_Router Ubuntu_SVR
-------------- -------------- --------------
| | {INTERNET} | | | |
| ----------------->22 | | |
| 22222>==============================------>22 |
| | | | | |
-------------- -------------- --------------
10.0.0.2
Docker 容器基于 Alpine Linux 并安装了 Android Studio,以及coreutils
、openjdk8-jre
和xorg-server
. 当我运行容器时:
docker run -it -v "$HOME/.Xauthority:/root/.Xauthority:rw" --env DISPLAY="$DISPLAY" --net=host --rm android-studio
...我收到以下错误:
Startup Error: Unable to detect graphics environment
我需要做什么才能将 Android Studio GUI 从 Docker 容器转发到我的 Ubuntu VM?这可以通过 X11 转发吗?
解决方案
我能够弄清楚这一点 - 希望它可以帮助其他人:
第 1 步:在托管 Docker 容器的服务器上启用 X11 转发
确保
/etc/ssh/sshd_config
包含以下行:X11Forwarding yes
SIGHUP
sshd
捡起零钱cat /var/run/sshd.pid | xargs kill -1
验证
xauth
是否安装在服务器上which xauth
如果不是,请使用您的包管理器安装它。
第 2 步:通过 SSH 连接到托管 Docker 容器的服务器
在 Linux 中,您的
ssh
命令需要包含该-X
选项。例子:ssh -X user@<IP_OF_DOCKER_SERVER>
从 Windows(通过 PuTTY):
- Windows 需要安装 X 服务器;安装XMing并确保它正在运行。
- 在 PuTTY 中,转到“连接”>“SSH”>“X11”并选中“启用 X11 转发”旁边的框,然后连接到服务器
docker run
第 3 步:从 SSH 终端运行命令
docker run -it --rm
--net=host
-v "$HOME/.Xauthority:/root/.Xauthority:rw"
-e DISPLAY="$DISPLAY"
android-studio
注意:xorg-server
不需要安装在 Docker 容器上。
推荐阅读
- karate - 如何根据空手道框架中的状态检查值
- vba - 写 txt 第一行而不是最后一行
- django - 如何通过 Django REST 向 RichTextUploadField 添加图像或音频文件上传支持?
- python - 如何使用列表理解进行转换?
- wpf - 如何在 WPF 中实现网格级别验证?
- xml - XML 节点的 XSD 验证可能很简单也可能很复杂
- c# - 如何将网格内容绑定到 UserControl
- javascript - 将赛普拉斯数据库查询输出对象放入变量中
- sql - 将数组数据类型添加到sql数据库
- pyspark - pyspark:如何在 `val` 是 python 中的变量的计算中使用多个`lit(val)`?