首页 > 解决方案 > 从 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,以及coreutilsopenjdk8-jrexorg-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 转发吗?

标签: dockerubuntux11alpinessh-tunnel

解决方案


我能够弄清楚这一点 - 希望它可以帮助其他人:

第 1 步:在托管 Docker 容器的服务器上启用 X11 转发

  1. 确保/etc/ssh/sshd_config包含以下行:

    X11Forwarding yes
    
  2. SIGHUP sshd捡起零钱

    cat /var/run/sshd.pid | xargs kill -1
    
  3. 验证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 容器上。


推荐阅读